Forum: Mikrocontroller und Digitale Elektronik SCK läuft ständig obwohl nicht in while schleife


von René K. (tesla24)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

René K. schrieb:
> Ich hoffe irgendwer hat ne Idee !

Zeig bloß nicht Deinen Quelltext ...

von spontan (Gast)


Lesenswert?

Wird der prozessor resettet und startet imm neu?
Mach doch mal zum Test eine Blinksoftware in die HP-Schleife.

von René K. (tesla24)


Lesenswert?

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
    }


}

von René K. (tesla24)


Angehängte Dateien:

Lesenswert?

Hier sind die Dateien mit dem C-Code

von MWS (Gast)


Lesenswert?

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.

von René K. (tesla24)


Lesenswert?

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
Noch kein Account? Hier anmelden.