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
In einer ISR noch eine Funktion aufrufen ist nicht wirklich schön. Dass die Hauptschleife felt, hat Peter ja schon angemerkt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.