Atmega32 - PullUp vertauscht?

#3257286
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren