Hallo, und zwar folgendes. Wenn ich beim Atmega den Int1 ausgang als externen Interrupt definiere, löst dieser direkt nach dem Starten des Controllers ein mal aus. Das soll er aber nicht. Hier mal der Code Warum wird der Interrupt Handler aufgerufen? [c] ISR(INT1_vect) { //Test PORTB |= (1<<1); } int main(void) { //Ausgänge DDRB = 0xFF; DDRD |= (1<<4); //Pullup PORTD |= (1<<3); PORTC |= (1<<2); //Externer Interrupt EIMSK |= (1<<1); SREG |= (1<<7); EICRA |= (1<<ISC10) | (1<<ISC11); sei(); while(1) { } return 0; }
Sorry hier der Code noch mal lesbarer
1 | ISR(INT1_vect) |
2 | {
|
3 | |
4 | //Test
|
5 | PORTB |= (1<<1); |
6 | |
7 | |
8 | }
|
9 | |
10 | |
11 | int main(void) |
12 | {
|
13 | |
14 | //Ausgänge
|
15 | DDRB = 0xFF; |
16 | DDRD |= (1<<4); |
17 | //Pullup
|
18 | PORTD |= (1<<3); |
19 | PORTC |= (1<<2); |
20 | |
21 | |
22 | |
23 | //Externer Interrupt
|
24 | EIMSK |= (1<<1); |
25 | SREG |= (1<<7); |
26 | EICRA |= (1<<ISC10) | (1<<ISC11); |
27 | |
28 | sei(); |
29 | |
30 | |
31 | |
32 | |
33 | while(1) |
34 | {
|
35 | |
36 | |
37 | }
|
38 | return 0; |
39 | |
40 | |
41 | }
|
Du solltest direkt vor dem sei() das Interrupt-Flag löschen
1 | EIFR |= 1<<INT1; |
Du solltest außerdem das rausschmeißen:
1 | SREG |= (1<<7); |
denn das ist ein sei(), nur sehr umständlich ausgedrückt. Und der gehört nicht an diese Stelle, da die Initialisierung noch nicht abgeschlossen ist.
Ok, weil im Datenblatt stand drin, dass ich das brauchen würde. Dann habe ich es mal reingemacht. Danke :)
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.