From 0438b4094ada51cba43ad9f3da36057a4ae256c2 Mon Sep 17 00:00:00 2001 From: Fisch Date: Tue, 24 Jan 2023 23:46:52 +0100 Subject: [PATCH] working single column clear --- flipcontrol_esp32/src/main.cpp | 155 ++++++++++++++++++++++++--------- 1 file changed, 116 insertions(+), 39 deletions(-) diff --git a/flipcontrol_esp32/src/main.cpp b/flipcontrol_esp32/src/main.cpp index 1ffbf80..198f708 100644 --- a/flipcontrol_esp32/src/main.cpp +++ b/flipcontrol_esp32/src/main.cpp @@ -1,4 +1,5 @@ #include +#define CHECK_BIT(var,pos) ((var) & (1<<(pos))) /* D7 - Ser (data) @@ -21,25 +22,34 @@ D3 - _clear //#define PIN_CLEAR 25 //active low -#define PIN_DRIVE 33 //enables 12v to panels +#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 //void sr_clear(); 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); unsigned long loopmillis=0; unsigned long last_update=0; -#define UPDATE_INTERVAL 5000 +#define UPDATE_INTERVAL 3000 + void setup() { pinMode(PIN_DATA, OUTPUT); pinMode(PIN_CLK, OUTPUT); pinMode(PIN_OE, OUTPUT); pinMode(PIN_LATCH, OUTPUT); - //pinMode(PIN_CLEAR, OUTPUT); + pinMode(PIN_CLEAR, OUTPUT); pinMode(PIN_DRIVE, OUTPUT); + pinMode(PIN_DATA_DRVBRD, OUTPUT); pinMode(PIN_CLK_DRVBRD, OUTPUT); @@ -55,15 +65,18 @@ void setup() { int countz=0; -uint8_t rowA=0; //first shift register of own controller -uint8_t rowB=0; //second shift register of own controller -uint8_t colA=0; +//uint8_t rowA=0; //first shift register of own controller +//uint8_t rowB=0; //second shift register of own controller +uint16_t row; +/*uint8_t colA=0; uint8_t colB=0; uint8_t colC=0; uint8_t colD=0; uint8_t colE=0; uint8_t colF=0; -uint8_t colG=0; +uint8_t colG=0;*/ + +uint8_t col[7]; void loop() { loopmillis = millis(); @@ -77,7 +90,7 @@ void loop() { { Serial.print("count="); - Serial.print(countz); + Serial.print(countz);Serial.print(": "); /* Serial.println("High"); @@ -103,51 +116,60 @@ void loop() { } */ - if (countz%2==0) { - colC=2+8+32+128; - colB=0; - }else{ - //colA=64; //64=IL0 - colC=0; //IH - colB=32+128; - } + + //setting colX to 128, 32, 8,2 (or a combination of), then appling 12V to driver and GND to Clear, clears these colums // this applies +12v to selected columns //setting colX to 64,16,4,1 (or a combination of), then setting row shift registers to some setting sets the selected dots // this applies GND to selected columns //reset pin on annax board input should be used (not pulled to gnd for a short time) after dots have been flipped (to disable potentially activated transistors) + + + selectColumnClear(countz%25); + + //selectColumnSet(countz%25); + + //row=pow(2, countz/25); + - Serial.print(", rowA="); - Serial.print(rowA); - - Serial.print(", colA="); - Serial.print(colA); - + 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(); - //reset pin on ribbon cable high (12Vpullup/open), then low (via Transistor) //Select Columns via Shift registers - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, colG); - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, colF); - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, colE); - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, colD); - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, colC); - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, colB); - shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, colA); //colA=128(bit 8) sets first output of shift registers high (lsbfirst) + for (uint8_t i=0;i<7;i++) { + shiftOutSlow(PIN_DATA_DRVBRD, PIN_CLK_DRVBRD, LSBFIRST, col[6-i]); + } //select Rows via shift registers on own controller board - shiftOutSlow(PIN_DATA, PIN_CLK, LSBFIRST, rowB); - shiftOutSlow(PIN_DATA, PIN_CLK, LSBFIRST, rowA); //LSBFIRST= LSB is QH, bit 8 is QA. + shiftOutSlow(PIN_DATA, PIN_CLK, LSBFIRST, row%256); + shiftOutSlow(PIN_DATA, PIN_CLK, LSBFIRST, row/256); //LSBFIRST= LSB is QH, bit 8 is QA. digitalWrite(PIN_LATCH, HIGH); delayMicroseconds(100); digitalWrite(PIN_LATCH, LOW); + //setSelectedDot(); + + + + if (!clearSelectedColumn()) { + Serial.println("Error clearing column!"); + }else{ + Serial.println("Cleared"); + } + + + + + last_update=loopmillis; countz++; @@ -157,13 +179,7 @@ void loop() { } -/* -void sr_clear() { - digitalWrite(PIN_CLEAR, LOW); - delayMicroseconds(1000); - digitalWrite(PIN_CLEAR, HIGH); - delayMicroseconds(1000); -}*/ +// void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) { @@ -181,4 +197,65 @@ void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t v digitalWrite(clockPin, LOW); delayMicroseconds(100); } +} + + +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; + + for (uint8_t i=0;i<7;i++) { + col[i]=0; + } + + col[sc_byte]=pow(2, (sc_bit*2+clear)); +} + +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(200); + 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) + } + } + } + + digitalWrite(PIN_DRIVE, HIGH); + delay(200); + digitalWrite(PIN_DRIVE, LOW); + return 1; } \ No newline at end of file