Statt alle Interrupte ganz abzuschalten, würde ich sie erstmal mit cli() auschalten, dann INT0 deaktivieren, und sie wieder einschalten. Dann geht der Rest des Systems, der sicher noch weitere Interrupte haben wird, weiter.
MfG Klebwax
Statt alle Interrupte ganz abzuschalten, würde ich sie erstmal mit cli() auschalten, dann INT0 deaktivieren, und sie wieder einschalten. Dann geht der Rest des Systems, der sicher noch weitere Interrupte haben wird, weiter.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Das werde ich doch gleich mal testen. Mein debuging zeigt mir gerade dass meine Variable "detect" irgendwie nie den
Wert ändert ??? Warum auch immer. PA6 wird nämlich nicht aktiviert und das ist mehr als seltsam. Damit wird dann
auch kein cli() aufgerufen und das Phänomen wäre erklärbar, dass damit der Interrupt aktiv bleibt. Die ISR wird allerings
angesprochen. Die LED an PA0 ändert ihren Status. die While schleife wird auch erreicht. Schiebe ich die PA6 LED dort hin
leuchtet sie.
- - - Aktualisiert - - -Code:#define MCU atmega32 #define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/interrupt.h> #include <inttypes.h> #include <avr/sleep.h> #include <avr/power.h> int detect = 0; int main(void){ // Direction Registers DDRA = 0xff; // LED Block A DDRC = 0xff; // LED Block C DDRD &= ~(1 << PIND7); // IR-LED to INPUT // Ports to LOW PORTA = 0x00; PORTC = 0x00; PORTD = 0x00; PORTD |= (1<<PD2); // Pullup auf INT0 (PD2) an GICR |=(1<<INT0); // INT0 bereitstellen MCUCR |=(2<<ISC00); // INT0 für fallende Flanke einstellen sei(); // Interrupts aktivieren while(1){ if (detect == 1){ PORTA |= (1<<PA6); cli(); // Interrupts deaktivieren } } return 0; } // Interrupt INT0 ISR(INT0_vect){ detect = 1; PORTA ^= 1<<PINA0; //die LED wird umgeschaltet }
Ich habs geschafft, das ganze ist ein Compiler Bugsobald ich mit -Os übersetze ist es Buggy mit -O0 ist alles in Ordnung.
Da kann ich ja ewig suchen. Ich hab jetzt ein paar mal hin und her probiert und es lässt sich reproduzieren![]()
Das ist kein Bug sondern ein Feature. detect muß als volatile markiert werden wenn es in der isr verändert werden können soll:
https://rn-wissen.de/wiki/index.php/...e_mit_volatile
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Das ist kein Bug. Die Variable wird wegoptimiert. Der compiler denkt das der Interrupt nicht ausgeführt wird und dadurch die Variable unnötig Platz verschwendet (weil diese nicht gesetzt wird). Du kannst dem Compiler aber sagen das er diese Variable nicht wegoptimieren darf indem du "volatile" verwendest.
Z.B.: volatile int detect=0;
Wenn du es so schreibst wird es funktionieren. Wenn du es debuggst, kannst du die Variable beobachten. Normalerweise steht dann "optimized away".
MfG Hannes
Oh vielen Dank da habe ich echt etwas dazu gelernt.
Lesezeichen