Hallo liebe Mikrocontroller Gemeinde!
Da ich noch recht neu auf dem Gebiet bin, habe ich mal eine Frage zu
meinem Atmega32. Ich verwende übrigens das Pollin-Evaluationsboard.
In der Beschreibung vom Board
(http://www.pollin.de/shop/downloads/D810038B.PDF) steht, dass Taster1
PD2 ist (INT0) und Taster2 PD3 (INT1) ist.
Nun habe ich aber den merkwürdigen Effekt, dass wenn ich auf PORTD den
internen PullUp für PD2 (Taster 1) aktiviere, dass mein Interrupt nur
bei betätigen von Taster 2 (PD3 ?!) ausgelöst wird.
Kann mir jemand sagen, warum das so ist? Möglicherweise hängt es auch
mit meinen Interrupts zusammen? ...
Den Interrupt habe ich übrigens nach folgendem Dokument konfiguriert, da
ich INT0 und INT1 verwenden will:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
Übrigens: Was ich damit bezwecken will: Ich möchte eigentlich nur die
beiden Taster auf dem Board auf Änderungen überprüfen.
Hier noch mein Code:
1 | int main(void) {
|
2 | // Port D auf Ausgabe setzen
|
3 | DDRD = 0xFF;
|
4 |
|
5 | // Pin D2 und D3 auf Eingang Taster stellen
|
6 | DDRD &= ~( (1 << PD2) | (1 << PD3) );
|
7 | // Pin D2 und D3 Pullup Widerstand aktivieren (Wie geht das in diesem Fall für 2 Taster?)
|
8 | PORTD |= (1 << PD2);
|
9 |
|
10 | // LED 1 Port auf OUT
|
11 | DDRD |= (1 << PD5);
|
12 | // LED 2 Port auf OUT
|
13 | DDRD |= (1 << PD6);
|
14 |
|
15 | cli();
|
16 | GICR |= (1 << INT1) | (1 << INT0); // INT0 (PD2) und INT1(PD3) im "General Interrupt Control Register" aktivieren
|
17 | MCUCR |= (0 << ISC01) | (1 << ISC00); // Die steigende und fallende Flanke löst den Interrupt INT0 (ISC01/ISC00) aus
|
18 | MCUCR |= (0 << ISC11) | (1 << ISC10); // Die steigende und fallende Flanke löst den Interrupt INT0 (ISC11/ISC10) aus
|
19 | sei();
|
20 |
|
21 | while (true) {
|
22 | }
|
23 | }
|
24 |
|
25 | ISR (INT0_vect) {
|
26 | // Entprellung für Schalter 1
|
27 | entprellung( &PIND, (1 << PD2) );
|
28 |
|
29 | // ...
|
30 | }
|
31 |
|
32 | ISR (INT1_vect) {
|
33 | // Entprellung für Schalter 2
|
34 | entprellung( &PIND, (1 << PD3) );
|
35 |
|
36 | // Ist momentan nur eine Test Routine ...
|
37 | delay_ms(500);
|
38 |
|
39 | PORTD ^= (1 << PD5); // LED 1 Toggle
|
40 | PORTD ^= (1 << PD6); // LED 2 Toggle
|
41 | }
|
Kann mir da jemand helfen, was ich besser machen muss?