flacker.. kann gut sein das es vom Mikrocontroller her kommt, vielleicht wenn du die daten schneller raustaktest?
Hallo zusammen , das ist mein erster Post hier.
Zu meine Problem ich hab hier Zuhaus eine LED-Anzeige liegen für die ich ein Steuerprogramm geschrieben habe.
Wenn ich Zeilen einzeln anspreche funktioniert das auch so wie es soll , nur sobald ich alle Zeilen anspreche "flackert" jede zweite Zeile.
Vieleicht sehr ihr da in meinem Programmcode ihrgend etwas was man anders machen sollte.
main.c
led.cCode:int main(void) { init_display(); printf("Programm gestartet !\n"); uint8_t text[7][56] = {{0,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; while(1) { uint8_t i; for(i=0;i<7;i++) { anzeigen(text[i],i); } } return 0; }
Es funktioniert alles soweit, es geht halt nur um "logischefehler" die ich so nicht sehe.Code:/* 7 Zeilen 8 Spalten 14 Segmente: 0| x x x x x x x x Z 1| x x x x x x x x e 2| x x x x x x x x i 3| x x x x x x x x l 4| x x x x x x x x e 5| x x x x x x x x n 6| x x x x x x x x ------------------- | 0 1 2 3 4 5 6 7 . . . Spalten PORTA PA0 Clock PA1 Daten PA2 Enable Zeilen PA3-PA5 Binär Zeile 1-7 */ #include <io.h> #include <stdlib.h> #include <stdio.h> #include <util/delay.h> #define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT)) #define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) #define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) #define TOGGLEBIT(ADDRESS, BIT) ((ADDRESS) ^= (1 << (BIT))) #define MAX_ZEICHEN 56 #define CLOCK PA0 #define DATEN PA1 #define ENABLE PA2 #define ZEILE2_0 PA3 #define ZEILE2_1 PA4 #define ZEILE2_2 PA5 void init_display() { // Pin 0 bis 5 als Ausgangdefinieren DDRA = (1<<DDA0) | (1<<DDA1) | (1<<DDA2) | (1<<DDA3) | (1<<DDA4) | (1<<DDA5); CLEARBIT(PORTA,ENABLE);// Enable auf 0 setzen -> Zeilen deaktiviert. CLEARBIT(PORTA,CLOCK); // Clock auf 0 CLEARBIT(PORTA,DATEN); // Daten auf 0 SETBIT(PORTA,ZEILE2_0); //1 CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 0 ausgewählt CLEARBIT(PORTA,ZEILE2_2); //0 } void select_zeile(uint8_t zeile) { if(zeile == 0) { SETBIT(PORTA,ZEILE2_0); //1 CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 0 ausgewählt CLEARBIT(PORTA,ZEILE2_2); //0 } if(zeile == 1) { CLEARBIT(PORTA,ZEILE2_0); //0 SETBIT(PORTA,ZEILE2_1); //1 Zeile 1 ausgewählt CLEARBIT(PORTA,ZEILE2_2); //0 } if(zeile == 2) { SETBIT(PORTA,ZEILE2_0); //1 SETBIT(PORTA,ZEILE2_1); //1 Zeile 2 ausgewählt CLEARBIT(PORTA,ZEILE2_2); //0 } if(zeile == 3) { CLEARBIT(PORTA,ZEILE2_0); //0 CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 3 ausgewählt SETBIT(PORTA,ZEILE2_2); //1 } if(zeile == 4) { SETBIT(PORTA,ZEILE2_0); //1 CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 4 ausgewählt SETBIT(PORTA,ZEILE2_2); //1 } if(zeile == 5) { CLEARBIT(PORTA,ZEILE2_0);//0 SETBIT(PORTA,ZEILE2_1); //1 Zeile 5 ausgewählt SETBIT(PORTA,ZEILE2_2); //1 } if(zeile == 6) { SETBIT(PORTA,ZEILE2_0); //1 SETBIT(PORTA,ZEILE2_1); //1 Zeile 5 ausgewählt SETBIT(PORTA,ZEILE2_2); //1 } } void anzeigen(uint8_t data[], uint8_t zeile) { uint8_t k; //Daten in Register laden for (k = MAX_ZEICHEN; k!=0; k--) { if (data[k] !=0) //Welchen Status hat das nächste Bit { SETBIT(PORTA,DATEN); //PORT high, falls Bit == 1; } else { CLEARBIT(PORTA,DATEN); //PORT low, sonst } SETBIT(PORTA,CLOCK); //CLOCK AN, Pegel übernehmen _delay_us(20); CLEARBIT(PORTA,CLOCK); //CLOCK AUS } //Zeile wählen und anzeigen select_zeile(zeile); //Zeile wählen _delay_ms (20); SETBIT(PORTA,ENABLE); //Gewählte Zeile einschalten _delay_ms (20); CLEARBIT(PORTA,ENABLE); //Gewählte Zeile ausschalten }
Wäre nett wenn sich das mal jemand mit mehr ahnung als ich ansehen könnte.
flacker.. kann gut sein das es vom Mikrocontroller her kommt, vielleicht wenn du die daten schneller raustaktest?
Das hab ich schon probiert , naja flackern is vieleicht etwas blöd beschrieben , es ist mehr so das jede zweite zeile immer um 2-3 pixel nach links oder rechts springt.
der einfachste fehler wäre, es stimmt z.b. ein nuller nicht in deiner textmatrix?
dass du dich da vielleicht vertan hast?
Lesezeichen