Hallo, ich bin mittlerweile echt ratlos... µC: ATMega644 @ 8Mhz Display DOGM-204 via SPI (Textdisplay 4x20 Zeichen) Ich habe bei einem vergangenen Projekt genau diese Komponenten zusammen bei gleicher Taktrate verwendet, somit konnte ich den Code auch per Copy/Paste benutzen. Im Programm nachdem alle initialisiert ist und der Displaykontroller seine Konfigurationsdaten bekommen hat, schicke ich einmal Daten die auf dem Display angezeigt werden sollen. In der while(1) steht noch nichts drinnen. Mein Problem, das Display zeigt den Text an danach wird der Text gelöscht und wieder angezeigt. Dieser Vorgang wiederholt sich unendlich und ist CPU takt und prescaler abhängig. Bei zu schneller Frequenz und zu niedrigen prescaler wird nur die erste Zeile angezeigt und dann gelöscht. Den SCK am DSO betrachtet passiert folgendes: Es werden 3 mal die 8 Takte gesendet, unterbrochen von einer kurzen Pause. Darauf folgt eine recht lange Pause und das ganze beginnt von vorn. Das bei schnellen Takt nur die erste Zeile angezeigt wird, ist mir klar und logisch. Aber warum sendet die SPI ständig? Ich habe keine Schleifen im Programm drin! Ich hoffe irgendwer hat ne Idee ! Vielen Dank
Wird der prozessor resettet und startet imm neu? Mach doch mal zum Test eine Blinksoftware in die HP-Schleife.
Also ein Reset kommt nicht, er bleibt in der Funktion hängen wo das senden ausgeführt wird. Zur erklärung: Wenn ich PA0 vor der "menu_select" setzte geht die dauerhaft an, aber wenn ich sie hinter dem "menu_select" auf high setzten möchte, dann bleibt sie aus. Beides mit DSO getestet. Das blinken über delay in der while funktioniert auch nur wenn ich "menu_select" auskommentiere. Den Rest code lade ich gleich hoch. Danke schon mal Hier das Main: int main(void) { port_init(); spi_init(); _delay_ms(100); //SS auf High PORTB |= (1<<PB3); _delay_ms(100); //Display konfig SSD1803A_config(); _delay_ms(100); //Globale zum test auf festen Wert gesetzt menu_state=1; //Globale für Zeit Sonnenaufgang auf festen Wert gesetzt start_aufgang_stunde=11; start_aufgang_minute=55; dauer_aufgang=29; PORTA |= (1<<PA0); menu_select(); //PORTA |= (1<<PA0); while(1) { PORTA |= (1<<PA0); _delay_ms(100); PORTA &= ~(1<<PA0); _delay_ms(100); PORTA |=(1<<PA0); //TODO:: Please write your application code } }
René K. schrieb: > Hier sind die Dateien mit dem C-Code Du aktivierst den SPI-Interrupt: SPCR |= (1<<SPIE)... hast aber keine SPI-ISR definiert. Im gezeigten Code findet sich zwar kein sei(), möglicherweise findet sich eines im nicht gezeigten Code, dann gibt's zyklische Resets.
Danke für den Hinweis, aber daran lag es nicht. Habe dadurch trotzdem den Fehler gefunden! Der Fehler trat nicht mehr auf, sobald ich in einen anderen Case-Fall bin. Ich habe das char-array für das sprintf zu klein gewählt und es kam zum Speicherüberlauf! Dennoch habe ich den Fehler mit dem SPIE korrigiert. Danke!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.