Hallo, beschäftige mich seit kurzem mit µC Programmierung. Und natürlich versucht man zuerst irgendwelche LED's zum leuchten zu bringen. Ein kleines Lauflicht habe ich schon hinbekommen. Jetzt wollte ich, dass am PortC erst eine LED leuchtet und dann bei Tastendruck ein Interrupt(Int0) ausgelöst wird welcher das Bit um eins verschiebt. Mein Problem ist jetzt aber, dass ich immer nur bis zur zweiten LED komme und der wieder zur ersten springt. Im Simulator kann man sehen, dass er nicht in der while- Schleife bleibt sondern zur main() springt und dort in PORTC wieder eine 1 schreibt. So kann natürlich es nicht funktionieren. Aber warum bleibt er nicht in der schleife solange bis ein Interrupt kommt und springt dann wieder dort zurück? Mir ist aufgefallen, wenn ich GICR nicht beschreibe bleibt er in der Schleife. Nur dann ist Int0 nicht aktiv. Ich benutze das AVR Studio 5 mit einem ATMega8. Gruß Artur
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | |
5 | |
6 | int main (void) |
7 | { |
8 | DDRC = 0b00111111; //Port C Ausgang |
9 | DDRD = 0b00000000; //Port D Eingang |
10 | PORTC = 0b00000001; //PortC.0=1 setzten |
11 | MCUCR = 0b00000011; //Int0 wird bei steigender Flanke ausgelöst |
12 | GICR = 0b01000000; //Int0 aktivieren |
13 | sei(); |
14 | while(1) |
15 | { |
16 | |
17 | } |
18 | |
19 | |
20 | |
21 | } |
22 | ISR(INT0_vect) |
23 | { |
24 | |
25 | PORTC = PORTC << 1; |
26 | } |