Hallo Zusammen ich stehe mal wieder vor einem Problem mit meinem ATMEGA 16. Ich möchte innerhalb der Routinen für die Externen Interrupts Ausgänge am COntroller setzen. Soweit funktioniert dies auch, nur sobald ich aus der Interrupt Routine raus komme, wird mir der Port wieder zurückgesetzt. Hat einer eine Erklärung? DIes ist mein Quellcode: ISR(INT1_vect) { temp=PINC; switch (temp) { case 0: PINC |= (1<<PC0); break; case 1: PINC |= (1<<PC1); PINC &= ~(1<<PC0); break; case 3: PINC |= ((1<<PC0)| (1<<PC1)); break; } } Vielen Dank im Voraus!
Beim ATMega16 sind die PINx-Register Read-Only! Schreibzugriffe darauf sind wirkungslos. Ich vermute, für das was Du willst, solltest Du besser PORTx nehmen...
So heute Morgen habe ich nun meinen Quellcode auf dem Simulationsboard ausprobiert uund es funktioniert schon wieder nicht. Der Ausgang blinkt nur kurz auf. Vielleicht seht ihr ja den Fehler in dem unteren Quellcode. Was ich erreichen möchte, ist das immer wenn ein Interrupt ausgelöst wurde die Ausgänge an Port C verändert werden. Möchte damit eine Art Freigabe Schaltung für meinen Sensor erstellen. Vielen Dank im Voraus
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <stdint.h> |
4 | #define INT0_vect _VECTOR(1)
|
5 | #define INT1_vect _VECTOR(2)
|
6 | |
7 | volatile uint8_t temp; |
8 | |
9 | |
10 | ISR(INT0_vect) |
11 | {
|
12 | PORTC = 0x01; |
13 | }
|
14 | |
15 | ISR(INT1_vect) |
16 | {
|
17 | switch (temp) |
18 | {
|
19 | case 0: |
20 | PORTC = 0x01; |
21 | temp++; |
22 | break; |
23 | |
24 | case 1: |
25 | PORTC = 0x02; |
26 | temp++; |
27 | break; |
28 | |
29 | case 3: |
30 | PORTC = 0x03; |
31 | temp=0; |
32 | break; |
33 | }
|
34 | }
|
35 | |
36 | int main (void) { |
37 | |
38 | |
39 | |
40 | sei(); // Globales Interrupt Enable Flag setzen |
41 | |
42 | |
43 | DDRC = 0xff; // Port C als Output |
44 | PORTC = 0x00; |
45 | DDRD = 0x00; // Port D als Input |
46 | |
47 | |
48 | MCUCR |= (1<<ISC01)|(1<<ISC00)|(1<<ISC10)|(1<<ISC11); |
49 | GIMSK |=(1<<INT0)|(1<<INT1); |
50 | |
51 | while(1) { |
52 | |
53 | /* "leere" Schleife*/; |
54 | }
|
/* wird nie erreicht */ return 0; }
Ich würde die Interrupts erst nach der Initialisierung freigeben. temp muß nicht volatile sein, wenn sie nur von der ISR und sonst nirgends benutzt wird. Man kann sie auch als static uint8_t in der ISR selbst vereinbaren, dann ist sichergestellt, daß keine andere Routine sich daran zu schaffen macht.
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.