Forum: Mikrocontroller und Digitale Elektronik Externe Interrupts Arduino MEGA bzw. ATmega 2560


von Marcel (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zur Interrupt Sense Control des ATmega2560.
Wenn ich das Register EICRA mit 0xFF beschreibe, sollte der Interrupt 
nur bei einer steigenden Flanke am jeweiligen Pin ausgelöst werden. 
Leider ist das nicht der Fall. Er springt zweimal hintereinander in die 
ISR.
Ich habe versucht ein kleines Programm zu schreiben mit dem man die 
Anzahl der Einsprünge sehen kann. Vielleicht mache oder verstehe ich 
grundsätzlich etwas falsch.

Bei EICRA = 0xFF ist i = 2. --> Das ist falsch, i müsste doch 1 sein.
Bei EICRA = 0xAA ist i = 1. --> Richtig
Bei EICRA = 0x55 ist i = 1. --> Richtig

In meinem Programm lasse ich Arduinopin 13 (PB7 des ATmega) einmal an 
und wieder aus gehen. Das gebe ich dann auf den jeweiligen Interrupt Pin 
(INT0 - INT7). Ich gebe immer nur einen Interrupt frei.

Kann mir helfen?
1
/***********************/
2
/******* Defines *******/
3
/***********************/
4
5
/* Interruptsteuerung */
6
7
#define ENAB_GLOBAL_INT     asm("sei")               // Set I-Bit in SREG
8
#define DISAB_GLOBAL_INT    asm("cli")                  // Reset I-Bit in SREG
9
10
#define ENAB_INT_0        EIMSK  |=  (1<<INT0)    // External Interrupt 3 enable
11
#define DISAB_INT_0         EIMSK   &= ~(1<<INT0)       // External Interrupt 3 disable
12
#define CLEAR_INT_0_FLAG    EIFR   |=  (1<<INTF0)      // Reset Interrupt 3 Flag (durch schreiben einer 1)
13
14
#define ENAB_INT_1        EIMSK  |=  (1<<INT1)    // External Interrupt 3 enable
15
#define DISAB_INT_1         EIMSK   &= ~(1<<INT1)       // External Interrupt 3 disable
16
#define CLEAR_INT_1_FLAG    EIFR   |=  (1<<INTF1)      // Reset Interrupt 3 Flag (durch schreiben einer 1)
17
18
#define ENAB_INT_2        EIMSK  |=  (1<<INT2)    // External Interrupt 3 enable
19
#define DISAB_INT_2         EIMSK   &= ~(1<<INT2)       // External Interrupt 3 disable
20
#define CLEAR_INT_2_FLAG    EIFR   |=  (1<<INTF2)      // Reset Interrupt 3 Flag (durch schreiben einer 1)
21
22
#define ENAB_INT_3        EIMSK  |=  (1<<INT3)    // External Interrupt 3 enable
23
#define DISAB_INT_3         EIMSK   &= ~(1<<INT3)       // External Interrupt 3 disable
24
#define CLEAR_INT_3_FLAG    EIFR   |=  (1<<INTF3)      // Reset Interrupt 3 Flag (durch schreiben einer 1)
25
26
#define ENAB_INT_4          EIMSK  |=  (1<<INT4)        // External Interrupt 4 enable
27
#define DISAB_INT_4        EIMSK   &= ~(1<<INT4)        // External Interrupt 4 disable
28
#define CLEAR_INT_4_FLAG    EIFR   |=  (1<<INTF4)      // Reset Interrupt 4 Flag (durch schreiben einer 1)
29
30
#define ENAB_INT_5        EIMSK  |=  (1<<INT5)        // External Interrupt 5 enable
31
#define DISAB_INT_5       EIMSK   &= ~(1<<INT5)        // External Interrupt 5 disable
32
#define CLEAR_INT_5_FLAG  EIFR   |=  (1<<INTF5)      // Reset Interrupt 5 Flag (durch schreiben einer 1)
33
34
#define ENAB_INT_6        EIMSK  |=  (1<<INT6)        // External Interrupt 5 enable
35
#define DISAB_INT_6       EIMSK   &= ~(1<<INT6)        // External Interrupt 5 disable
36
#define CLEAR_INT_6_FLAG  EIFR   |=  (1<<INTF6)      // Reset Interrupt 5 Flag (durch schreiben einer 1)
37
38
#define ENAB_INT_7        EIMSK  |=  (1<<INT7)        // External Interrupt 5 enable
39
#define DISAB_INT_7       EIMSK   &= ~(1<<INT7)        // External Interrupt 5 disable
40
#define CLEAR_INT_7_FLAG  EIFR   |=  (1<<INTF7)      // Reset Interrupt 5 Flag (durch schreiben einer 1)
41
42
43
/* Pin- und Portdefinitionen */
44
45
/********************************* Arduino-LED (Testpunkt) **********************************************************************************/
46
#define L_ARD_PIN      DDRB |= (1<<DDB7);PORTB &= ~(1<<PORTK7) // Port B, Bit 7 => LED Arduino-Board (Atmel -> LED) -> OUTPUT, OFF      //
47
#define L_ARD_ON       PORTB |= (1<<PORTB7)                    // LED Arduino-Board ein                                                    //     
48
#define L_ARD_OFF      PORTB &= ~(1<<PORTB7)                   // LED Arduino-Arduino aus                                                  //
49
#define L_ARD_TOGGLE   PINB |= (1<<PINB7)                      // LED Arduino-Arduino toggel                                               //   
50
/********************************************************************************************************************************************/
51
52
/********************************************************************************************************************************************/
53
#define INT_0_PIN        DDRD &= ~(1<<DDD0);PORTD &= ~(1<<PORTD0) // Port D, Bit 0 => Interrupt 0 (Atmel <- Encoder) -> INPUT, TRISTATE    //
54
#define INT_0           (PIND & (1<<PIND0))                  // Kanal A In                                                              //
55
/********************************************************************************************************************************************/                                                                      
56
#define INT_1_PIN        DDRD &= ~(1<<DDD1);PORTD &= ~(1<<PORTD1) // Port D, Bit 1 => Interrupt 1 (Atmel <- Encoder) -> INPUT, TRISTATE    //
57
#define INT_1           (PIND & (1<<PIND1))                  // Kanal A In                                //
58
/********************************************************************************************************************************************/
59
#define INT_2_PIN        DDRD &= ~(1<<DDD2);PORTD &= ~(1<<PORTD2) // Port D, Bit 2 => Interrupt 2 (Atmel <- Encoder) -> INPUT, TRISTATE    //
60
#define INT_2           (PIND & (1<<PIND2))                  // Kanal A In                                //
61
/********************************************************************************************************************************************/
62
#define INT_3_PIN    DDRD &= ~(1<<DDD3);PORTD &= ~(1<<PORTD3) // Port D, Bit 3 => Interrupt 3 (Atmel <- Encoder) -> INPUT, TRISTATE    //
63
#define INT_3           (PIND & (1<<PIND3))                  // Kanal A In                                                              //
64
/********************************************************************************************************************************************/
65
#define INT_4_PIN     DDRE &= ~(1<<DDE4);PORTE &= ~(1<<PORTE4) // Port E, Bit 4 => Interrupt 4 (Atmel <- Encoder) -> INPUT, TRISTATE    //
66
#define INT_4          (PINE & (1<<PINE4))                  // Kanal A In                                                              //
67
/********************************************************************************************************************************************/
68
#define INT_5_PIN     DDRE &= ~(1<<DDE5);PORTE &= ~(1<<PORTE5) // Port E, Bit 5 => Interrupt 5 (Atmel <- Encoder) -> INPUT, TRISTATE    //
69
#define INT_5          (PINE & (1<<PINE5))                  // Kanal A In                                                              //
70
/********************************************************************************************************************************************/
71
#define INT_6_PIN     DDRE &= ~(1<<DDE6);PORTE &= ~(1<<PORTE6) // Port E, Bit 6 => Interrupt 6 (Atmel <- Encoder) -> INPUT, TRISTATE    //
72
#define INT_6          (PINE & (1<<PINE6))                  // Kanal A In                                                              //
73
/********************************************************************************************************************************************/
74
#define INT_7_PIN     DDRE &= ~(1<<DDE7);PORTE &= ~(1<<PORTE7) // Port E, Bit 7 => Interrupt 7 (Atmel <- Encoder) -> INPUT, TRISTATE    //
75
#define INT_7          (PINE & (1<<PINE7))                  // Kanal A In                                                              //
76
/********************************************************************************************************************************************/
77
78
79
80
/*************************/
81
/******* Variables *******/
82
/*************************/
83
volatile unsigned char i;
84
volatile unsigned int j;
85
86
87
/*************************/
88
/******* Functions *******/
89
/*************************/
90
void Test_Init (void);
91
void EXT_ISR_Init (void);
92
93
94
void Test_Init (void)
95
{
96
  L_ARD_PIN;      // Port B, Bit 7 => LED Arduino-Board (Atmel -> LED) -> OUTPUT, OFF
97
}
98
99
void EXT_ISR_Init (void)
100
{
101
  INT_0_PIN;
102
  INT_1_PIN;
103
  INT_2_PIN;
104
  INT_3_PIN;
105
  INT_4_PIN;
106
  INT_5_PIN;
107
  INT_6_PIN;
108
  INT_7_PIN;
109
110
  
111
  EICRA = 0xAA;
112
  //EICRA = 0x55;
113
  //EICRA = 0xFF;
114
  EICRB = 0xFF;
115
  
116
  //EICRA |=  ((1<<ISC31) | (1<<ISC30));          // INT 3 (Kanal A SM1): positive Flanke
117
  
118
  //EICRB |=  ((1<<ISC41) | (1<<ISC40));          // INT 4 (Kanal A SM2): positive Flanke
119
  //EICRB |=  ((1<<ISC51) | (1<<ISC50));          // INT 5 (Kanal A SM3): positive Flanke  
120
  
121
                
122
  //EICRA &= ~((1<<ISC31) | (1<<ISC30));          // INT 3 (Kanal A SM1): low level  
123
  
124
  //EICRA |=  (1<<ISC30);                  // INT 3 (Kanal A SM1): beide Flanken  
125
  //EICRA &= ~(1<<ISC31);
126
  
127
  //EICRB |=  (1<<ISC40);                  // INT 4 (Kanal A SM2): beide Flanken  
128
  //EICRB &= ~(1<<ISC41);
129
    
130
  //EICRB |=  (1<<ISC50);                  // INT 5 (Kanal A SM3): beide Flanken  
131
  //EICRB &= ~(1<<ISC51);
132
}
133
134
135
/*********************************/
136
/******* Arduino functions *******/
137
/*********************************/
138
139
void setup (void)
140
{
141
   DISAB_GLOBAL_INT;
142
  DISAB_INT_0;
143
  DISAB_INT_1;
144
  DISAB_INT_2;
145
  DISAB_INT_3;
146
  DISAB_INT_4;
147
  DISAB_INT_5;
148
  DISAB_INT_6;
149
  DISAB_INT_7; 
150
  
151
  Test_Init ();
152
  EXT_ISR_Init ();
153
154
  Serial.begin (9600);        // ARDUINO function
155
  
156
  i = 0;
157
  j = 0;
158
159
  
160
  ENAB_INT_0;
161
  //ENAB_INT_1;
162
  //ENAB_INT_2;
163
  //ENAB_INT_3;
164
  //ENAB_INT_4;
165
  //ENAB_INT_5;
166
  //ENAB_INT_6;
167
  //ENAB_INT_7;
168
  ENAB_GLOBAL_INT;            // enable interrupts  
169
}
170
171
172
void loop (void)
173
{
174
  for ( j = 0; j < 0xFFFF; j++ ) {;}
175
  for ( j = 0; j < 0xFFFF; j++ ) {;}
176
  for ( j = 0; j < 0xFFFF; j++ ) {;}
177
  for ( j = 0; j < 0xFFFF; j++ ) {;}
178
  for ( j = 0; j < 0xFFFF; j++ ) {;}
179
  L_ARD_ON;
180
  for ( j = 0; j < 0xFFFF; j++ ) {;}
181
  for ( j = 0; j < 0xFFFF; j++ ) {;}
182
  for ( j = 0; j < 0xFFFF; j++ ) {;}
183
  for ( j = 0; j < 0xFFFF; j++ ) {;}
184
  for ( j = 0; j < 0xFFFF; j++ ) {;}
185
  L_ARD_OFF;
186
  
187
  Serial.println (i, HEX);
188
  while ( 1 ) {;}
189
}
190
191
192
/**********************************/
193
/******* Interrupt routines *******/
194
/**********************************/
195
ISR (INT0_vect)
196
{  
197
  i++;
198
}
199
200
ISR (INT1_vect)
201
{
202
  i++;
203
}
204
205
ISR (INT2_vect)
206
{  
207
  i++;    
208
}
209
210
ISR (INT3_vect)
211
{  
212
  i++;    
213
}
214
215
ISR (INT4_vect)
216
{
217
  i++;
218
}
219
220
ISR (INT5_vect)
221
{
222
  i++;
223
}
224
225
ISR (INT6_vect)
226
{
227
  i++;
228
}
229
230
ISR (INT7_vect)
231
{
232
  i++;  
233
}

Beitrag #5063499 wurde vom Autor gelöscht.
von Toni R. (torei55)


Lesenswert?

Hallo,
1
void EXT_ISR_Init (void)
2
{
3
  ...
4
  EICRA = 0xAA;    <--- ??????
5
  //EICRA = 0x55;
6
  //EICRA = 0xFF;
7
  EICRB = 0xFF;
8
  ...
9
}
Ich könnte mir Vorstellen, daß das was zu sagen hat.

Datenblatt Seite 114
Note:

1. n = 3, 2, 1or 0.

When changing the ISCn1/ISCn0 bits, the interrupt must be disabled by 
clearing its Interrupt Enable bit in the EIMSK Register. Otherwise an 
interrupt can occur when the bits are changed.

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
Noch kein Account? Hier anmelden.