Forum: Mikrocontroller und Digitale Elektronik Laufzeitproplem: LCD vs. UART


von Chris (Gast)


Lesenswert?

Mahlzeit Leute,
erstmal meine Systemvoraussetzungen: STK500 ATMega16 bzw. ATMega8515,
CodeVision C-Compiler.
Folgendes Problem:
Ich habe eine Menueführung für ein LC-Display erstellt. Nebenher (per
UART-Interrupt) sollen Werte über die uart eingelesen werden und dann
auf dem Display angezeigt werden.
Das jeweilige Menu, welches angezeigt werden soll wird zyklisch durch
eine Endlosschleife in main aufgerufen und mit delay verzögert.
Die Dateneingabe bzw. Verarbeitung erfolgt durch den UART-Interrupt.
Das ganze habe ich in verkürzter Form am Schluss drangehängt. Das
Problem ist nun, dass die (empfangenen) Daten nur richtig verarbeitet
werden, wenn ich mich mit der menüführung im Hauptmenue befinde.
Wechsle ich in ein Untermenü kommen zum Teil die Daten nicht mehr an.
P.s.: asm("sei") globale Interrupts sind jederzeit erlaubt

interrupt [USART_RXC] void usart_rx_isr(void)
{
   auswerten();
}

main()
{
   if(auswahl==0)hauptmenu();
   else if(auswahl==1)akkux();
   else if(auswahl==2 && auswahl2==0)funkt();
   delay_ms(300);
}

Nun muss man dazu sagen, dass im Menüpunkt hauptmenu() am wenigsten auf
dem LCD angezeigt wird bzw. auch am wenigsten C-Code steckt. Nur in
diesem Menuepunkt funktioniert der uart-int reibungslos.
Befindet man sich in einem der anderen Menuepunkte (auf denen
wesentlich mehr angezeigt wird bzw. c-code verabeitet werden muss)
funktioniert die Datenverarbeitung über den uart-int nicht.
Zuerst hatte ich einen ATMega8515 am start, dann dachte ich es könnte
vielleicht an der Ram-Ausnutzung oder ähnliches liegen, so dass ich
einen ATmega16 einbaute, der ja doppelt so viel RAM hat. Das Problem
ist jedoch geblieben.
Wer von euch hat eine Ahnung an was dies liegen könnte. Bin für alles
und jeden Hinweis dankbar.
Gruß Christian

von peter dannegger (Gast)


Lesenswert?

Im main fehlt die Hauptschleife !


Peter

von Rahul (Gast)


Lesenswert?

In einer ISR noch eine Funktion aufrufen ist nicht wirklich schön.
Dass die Hauptschleife felt, hat Peter ja schon angemerkt.

von Chris (Gast)


Lesenswert?

Sers Leute,
das mit der Hauptschleife war ein Versehen, die ist natürlich im
richtigen Programm mit drin. Werde die Auswertung nun direkt im
Interrupt vornehmen.
Habe auch gerade einen ähnlichen Beitrag gefunden, der eigentlich
dasselbe Problem hat; nur dass er in Assembler schreibt. Ich schau mir
auch noch mal den Stackpointer an.
Wer sonst noch tipps hat, darf diese ruhig posten.
Gruß Christian

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.