Hallo liebe Leute,
ich habe eines dieser AVR-CAN boards von Olimex mit AT90CAN128.
Ich programmiere das Teil über die Pins PDI und PDO, da ich nur einen
ISP (mySmartUSB MK2) besitze. Das klappt alles wunderbar.
Nun möchte ich über die 4 Eingänge INT0 bis INT3 Interrupts auslösen.
Standardmäßig lege ich die Eingänge auf 0V und warte bis ein High Signal
(5V) durch einen anderen µC oder eine Spannungsquelle drauf gegeben
wird.
Die ISR sollen bei Flankenwechsel ausgelöst werden, also auch wenn der
externe High Pegel wieder verschwindet. Im LOW-HIGH Fall soll an jeweils
einem der OCRx-Ausgänge von Timer3, bzw Timer1 ein PWM-Signal ausgegeben
werden. Das nur zum Hintergrund.
Mit dem u.a. Programmcode verhalten sich die PINS PD0, PD1 und PD2
jedoch so, dass sie immer auf HIGH sind, wodurch natürlich nie ein IR
ausgelöst wird während PD3 (INT3) standardmäßig auf LOW ist und durch
diesen daher wunderbar bei Anlegen von 5V ein IR ausgelöst wird.
Mein Frage, wieso verhält sich INT3 anders als INT0 bis INT2:
1 | int main(void)
|
2 | {
|
3 | setup();
|
4 | sei();
|
5 | while(1)
|
6 | {
|
7 | // do stuff
|
8 | }
|
9 | return 0;
|
10 | }
|
11 |
|
12 | void setup()
|
13 | {
|
14 | cli();
|
15 |
|
16 | EIMSK &= 0b11110000; //Disable INTs
|
17 | EICRA = 0b01010101; //Trigger on LVL Change
|
18 | EIFR |= 0b00001111; //Clear possible interrupt flags
|
19 | EIMSK = 0b00001111; //Enable INT0, INT1, INT2, INT3, disable Rest
|
20 |
|
21 | DDRE |= 0b00111000; // OC3A, OC3B, OC3C als Ausgang definieren
|
22 |
|
23 | DDRB |= 0b01010000; // OC1B, OC2A (Timer) als Ausgang definieren
|
24 | DDRD &= 0b11110000; // INT0, INT1, INT2, INT3 als Eingang definieren
|
25 |
|
26 | TCCR1A |= 0b00100001;
|
27 | TCCR1A &= 0b11101101;
|
28 | TCCR1B |= 0b00001001;
|
29 | TCCR1B &= 0b11101001;
|
30 | TCCR1C &= 0b00000000;
|
31 |
|
32 | TCCR3A |= 0b10101001;
|
33 | TCCR3A &= 0b10101001;
|
34 | TCCR3B |= 0b00001001;
|
35 | TCCR3B &= 0b11101001;
|
36 | TCCR3C &= 0b00000000;
|
37 |
|
38 | OCR1B = 0x00;
|
39 | OCR3A = 0x00;
|
40 | OCR3B = 0x00;
|
41 | OCR3C = 0x00;
|
42 | }
|
43 |
|
44 | // hier folgen die 4 ISR
|
45 | ISR(INT0_vect)
|
46 | {
|
47 | //...
|
48 | }
|
49 |
|
50 | ...
|
Ich bitte den Englisch-Deutsch Mischmasch und die vielleicht nicht so
gerne gesehenen binären Zuweisungen zu entschuldigen. Wäre für jeglichen
Hinweis, was das Problem sein könnte dankbar.
Vielleicht ists auch banal, manchmal hat man halt das berühmte Brett vor
dem Kopf.
Liebe Grüße,
Milan