Hallo, ich bitte um Hilfe bei folgendem Programmcode: (Hardware: XPlain Board, MKII Programmer, AVR 5.0) funktionierende Programm Version (LEDs blinken): int main (void) { board_init(); init_peripherie(); PORTE.DIR = 0xFF; // Port E als Ausgang definieren while(1) { PORTE.DIR = 0xFF; // Port E als Ausgang definieren PORTE.OUT = ~out; //Variable am Ausgang vom Port invertiert ausgeben } // Insert application code here, after the board has been initialized. return 0; } /* Timer TCC0 Interrupt routine */ ISR(TCC0_OVF_vect) { out++; // hier kann stehen was der Timer bei jedem Interrupt tun soll } NICHT Funktionierende Version (unterschied in der While schleife), LEDs leuchten nicht, obwohl PORTDIR richtig gesetzt und im IO Register richtig angezeigt wird (0xFF): int main (void) { board_init(); init_peripherie(); PORTE.DIR = 0xFF; // Port E als Ausgang definieren while(1) { //PORTE.DIR = 0xFF; // Port E als Ausgang definieren PORTE.OUT = ~out; //Variable am Ausgang vom Port invertiert ausgeben } // Insert application code here, after the board has been initialized. return 0; } /* Timer TCC0 Interrupt routine */ ISR(TCC0_OVF_vect) { out++; // hier kann stehen was der Timer bei jedem Interrupt tun soll } wieso muss der DIR von Port E in der While schleife immer wieder gesetzt werden? Das Programm springt nur zwischen While schleife und interrupt.
Hallo, die Variable ist wie folgt deklariert: uint8_t out = 0; gemäß http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial
Variablen, die zur Kommunikation zwischen Interrupt-Serviceroutinen und Hauptprogramm eingesetzt werden, müssen volatile deklariert werden. Sonst kann der Compiler nach Belieben daran rumoptimieren und es kommt zu merkwürdigen Effekten.
Danke für den Tip, es lag tatsächlich daran ! Ich hätte nicht gedacht, dass es an der deklaration liegen kann. Vielen Dank !
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.