Hi, ich versuche vergeblich im AtmelStudio 6.1 Simulator einen Pinchange Interrupt auszulösen. Mein code: #include <avr/io.h> void powerDown(void){ GIFR |= (1<<PCIF); // Clear eventually occurred previous interrupts GIMSK |= (1<<PCIE); // Activate Pin change interrupts PINB |= (1<<PB4); PINB |= (1<<PB4); PINB |= (1<<PB4); GIMSK &= (0<<PCIE); // Deactivate Pin change interrupts } ISR(PCINT0_vect) { PINB |= (1<<PB4); PINB |= (1<<PB4); } int main(void) { //SREG &= 0B01111111; //Disables Interrupts globally during setup PORTB |= (1<<PB0)|(1<<PB1)|(1<<PB2); //Setting outputs to zero, activating pullups on inputs DDRB |= (1<<PB3)|(1<<PB4)|(1<<PB5); //0, 1, 2 are inputs, 3, 4, 5 are outputs //GIMSK = (1<<PCIE); // Activate Pin change interrupts PCMSK |= (1<<PCINT0)|(1<<PCINT1)|(1<<PCINT2); // Sets the Pin change interrupt mask, only PB0,1,2 will trigger the PCINT once it it enabled before sleep //MCUCR = (1<<ISC00)|(0<<ISC01); SREG |= (1<<SREG_I); //Enables Interrupts globally after setup while(1) { //TODO:: Please write your application code PINB |= (1<<PB4); powerDown(); } } Mit PINB |= (1<<PB4); toggle ich einen Pin, um einfach irgendwas zu machen ;) powerDown soll später mal Sleep aktivieren und dann soll der Mikro per Pinchange Interrupt wieder aus dem Schlaf zurück geholt werden. Sorry für die Wahrscheinlich total einfache Frage, aber ich fange gerade erst an mit Mikrocontrollern und kenne mich noch nicht gut aus. Während der drei PINB |= (1<<PB4); PINB |= (1<<PB4); PINB |= (1<<PB4); ändere ich manuell den State eines der drei Inputs im single Step Modus, aber es passiert garnichts und der Code wird weiter normal ausgeführt, ohne in die ISR zu springen.
Also es lag daran, dass ich die avr/interrupt.h nicht included hatte;) Jetzt funktioniert es. Eine Sache ist mir jedoch aufgefallen, wenn innerhalb von void powerDown(void){ GIFR |= (1<<PCIF); // Clear eventually occurred previous interrupts GIMSK |= (1<<PCIE); // Activate Pin change interrupts PINB |= (1<<PB4); PINB |= (1<<PB4); PINB |= (1<<PB4); GIMSK &= (0<<PCIE); // Deactivate Pin change interrupts } bzw während der drei PINB |= (1<<PB4); ein Pin geändert wird, springt der Mikro erst beim/nach dem Aufruf von GIMSK &= (0<<PCIE); in die ISR!? Ist das normal oder mache ich etwas falsch? Ich dachte Interrupts würden wirklich sofort interrupten.
>GIMSK &= (0<<PCIE);
Das setzt das gesamte Register auf 0, ist das gewollt? Oder wolltest du
GIMSK &= ~(1<<PCIE); schreiben?
Ja, habe ich in der Zwischenzeit auch geändert. Das Verhalten ist aber das selbe, da der Rest des Registers eh 0 war. Hatte also nichts mit dem komischen Interruptverhalten zu tun.
Daniel schrieb: > Ist das normal oder mache ich etwas falsch? Ich dachte Interrupts würden > wirklich sofort interrupten. Versuch es nach der Initialisierung mal mit einem sei(): Bin aber noch nicht ganz wach, hoffe, es lag daran... :-)
Guten Morgen, SREG |= (1<<SREG_I); //Enables Interrupts globally after setup sollte das selbe sein, was ein sei macht wenn ich das richtig verstanden habe
Daniel schrieb: > sollte das selbe sein, was ein sei macht wenn ich das richtig verstanden > habe OK, wie ich schon schrieb, ich war noch nicht wach, sorry. :-) Warum steht das powerDown() eigentlich innerhalb der Hauptschleife?
Ich will den Code nur testen, deshalb wollte ich eine Möglichkeit die PowerDown Funktion manuell aufzurufen ohne auf Timer etc. zu warten. Also, kann jemand helfen?
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.