From 1350822ffe63efccda7f688152820353e72fde84 Mon Sep 17 00:00:00 2001 From: Fisch Date: Tue, 31 Jan 2023 22:50:25 +0100 Subject: [PATCH] move flipdot functions into class --- flipcontrol_esp32/src/main.cpp | 206 ++++----------------------------- 1 file changed, 20 insertions(+), 186 deletions(-) diff --git a/flipcontrol_esp32/src/main.cpp b/flipcontrol_esp32/src/main.cpp index b2c99ca..e4fe32a 100644 --- a/flipcontrol_esp32/src/main.cpp +++ b/flipcontrol_esp32/src/main.cpp @@ -1,77 +1,25 @@ #include -#define CHECK_BIT(var,pos) ((var) & (1<<(pos))) -/* -D7 - Ser (data) -D5 - clock -D1 - _OE -D2 - latch -D3 - _clear -*/ - -//Pins connected to Shift registers on own controller board -#define PIN_DATA 13 -#define PIN_CLK 14 -#define PIN_OE 27 //active low -#define PIN_LATCH 26 +#include "flipdot.h" -//Pins connected to stuff on annax driver board -#define PIN_DATA_DRVBRD 33 -#define PIN_CLK_DRVBRD 32 - -//#define PIN_CLEAR 25 //active low - -#define PIN_DRIVE 25 //enables 12v to panels via transistor -#define PIN_CLEAR 12 //connects CLEAR Pin from Annax board to GND (clears column) - -#define NUMPANELS 1 +Flipdot flipdot; -void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); -bool clearSelectedColumn(); -bool setSelectedDot(); - -void selectColumnClear(uint8_t selcolumn); -void selectColumnSet(uint8_t selcolumn); -void selectColumn(uint8_t selcolumn, bool clear); - -bool HBridgeOK(); -void shiftData(); - -void resetColumns(); unsigned long loopmillis=0; unsigned long last_update=0; + #define UPDATE_INTERVAL 10 - void setup() { - pinMode(PIN_DATA, OUTPUT); - pinMode(PIN_CLK, OUTPUT); - pinMode(PIN_OE, OUTPUT); - pinMode(PIN_LATCH, OUTPUT); - pinMode(PIN_CLEAR, OUTPUT); - pinMode(PIN_DRIVE, OUTPUT); - - - pinMode(PIN_DATA_DRVBRD, OUTPUT); - pinMode(PIN_CLK_DRVBRD, OUTPUT); - - - digitalWrite(PIN_OE, HIGH); //Active Low - digitalWrite(PIN_LATCH, LOW); - - digitalWrite(PIN_DRIVE, LOW); + flipdot.init(); Serial.begin(115200); } int countz=0; -uint16_t row; //controls shift registers on own controller pcb - -uint8_t col[7]; //column drivers and shift registers on annax pcb void loop() { loopmillis = millis(); @@ -81,14 +29,14 @@ void loop() { static bool init=false; if (!init) { delay(2000); - row=0; + flipdot.row=0; Serial.println("Clearing Display"); for (int l=0;l<25;l++) { - selectColumnClear(l%25); + flipdot.selectColumnClear(l%25); - shiftData(); + flipdot.shiftData(); - if (!clearSelectedColumn()) { + if (!flipdot.clearSelectedColumn()) { Serial.println("Error clearing column!"); }else{ Serial.println("Cleared"); @@ -115,23 +63,29 @@ void loop() { //cycle testing set dots - selectColumnSet(countz/16); //lower column number is on the left - row=pow(2, (countz)%16);//low significant bits are lower rows (when connector at top) + flipdot.selectColumnSet(countz/16); //lower column number is on the left + flipdot.row=pow(2, (countz)%16);//low significant bits are lower rows (when connector at top) - Serial.print("Row="); Serial.print(row); Serial.print(" Col="); + /*Serial.print("Row="); Serial.print(row); Serial.print(" Col="); for (uint8_t i=0;i<7;i++) { Serial.print(","); Serial.print(col[i]); } - Serial.println(); + Serial.println();*/ //reset pin on ribbon cable high (12Vpullup/open), then low (via Transistor) + + unsigned long starttime=micros(); - shiftData(); + flipdot.shiftData(); - setSelectedDot(); + flipdot.setSelectedDot(); + + unsigned long shiftduration=micros()-starttime; + Serial.println(""); + Serial.print("Duration="); Serial.println(shiftduration); @@ -148,123 +102,3 @@ void loop() { } - -#define SHIFTDELAYMICROS 100 -void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) -{ - uint8_t i; - - for (i = 0; i < 8; i++) { - if (bitOrder == LSBFIRST) - digitalWrite(dataPin, !!(val & (1 << i))); - else - digitalWrite(dataPin, !!(val & (1 << (7 - i)))); - - delayMicroseconds(SHIFTDELAYMICROS); - digitalWrite(clockPin, HIGH); - delayMicroseconds(SHIFTDELAYMICROS); - digitalWrite(clockPin, LOW); - delayMicroseconds(SHIFTDELAYMICROS); - } -} - - -void selectColumnClear(uint8_t selcolumn) { - selectColumn(selcolumn, true); -} -void selectColumnSet(uint8_t selcolumn) { - selectColumn(selcolumn, false); -} -void selectColumn(uint8_t selcolumn, bool clear) { - uint8_t sc_bit=3-(selcolumn%4); //each two shift registers control four columns - uint8_t sc_byte=selcolumn/4; - - resetColumns(); - - col[sc_byte]=pow(2, (sc_bit*2+clear)); // possible numbers for clear=false: 1,4,16,64 -} - -bool clearSelectedColumn() { - //Clear Columns - if (row!=0) { - return 0; //error. row is selected (short circuit!) - } - for (uint8_t cc=0;cc<7;cc++) { - //Serial.print("checking cc="); Serial.println(cc); - for (uint8_t i=0;i<8;i+=2) { - if (CHECK_BIT(col[cc],i)) { - Serial.print("Error on bit "); - Serial.print(i); Serial.print(" col="); Serial.println(cc); - return 0; //a column is set to ground (should not be set for clear column) - } - } - } - - digitalWrite(PIN_DRIVE, HIGH); - digitalWrite(PIN_CLEAR, HIGH); - delay(50); - digitalWrite(PIN_CLEAR, LOW); - digitalWrite(PIN_DRIVE, LOW); - return 1; -} - -bool setSelectedDot() { - - for (uint8_t cc=0;cc<7;cc++) { - //Serial.print("checking cc="); Serial.println(cc); - for (uint8_t i=1;i<8;i+=2) { - if (CHECK_BIT(col[cc],i)) { - Serial.print("Error on bit "); - Serial.print(i); Serial.print(" col="); Serial.println(cc); - return 0; //a column is set to ground (should not be set for clear column) - } - } - } - - if (!HBridgeOK) { - return 0; - } - - digitalWrite(PIN_OE, LOW); //Active Low - digitalWrite(PIN_DRIVE, HIGH); - delay(10); - digitalWrite(PIN_OE, HIGH); //Active Low - digitalWrite(PIN_DRIVE, LOW); - return 1; -} - -bool HBridgeOK() { - for (uint8_t cc=0;cc<7;cc++) { - //Serial.print("checking cc="); Serial.println(cc); - for (uint8_t i=0;i<8;i+=2) { - if (CHECK_BIT(col[cc],i) && CHECK_BIT(col[cc],i+1)) { - Serial.print("Short circuit on bit "); - Serial.print(i); Serial.print(" col="); Serial.println(cc); - return 0; //a column is set to ground (should not be set for clear column) - } - } - } - return 1; -} - -void shiftData() { //send out all data to shift registers - - - //select Rows via shift registers on own controller board - shiftOutSlow(PIN_DATA, PIN_CLK, LSBFIRST, row&0xff); //lower byte - shiftOutSlow(PIN_DATA, PIN_CLK, LSBFIRST, row>>8); //LSBFIRST= LSB is QH, bit 8 is QA. //upper byte - digitalWrite(PIN_LATCH, HIGH); - delayMicroseconds(100); - digitalWrite(PIN_LATCH, LOW); - - //Select Columns via Shift registers - for (uint8_t i=0;i<7;i++) { - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, col[6-i]); - } -} - -void resetColumns() { - for (uint8_t i=0;i<7;i++) { - col[i]=0; - } -} \ No newline at end of file