Forum: Mikrocontroller und Digitale Elektronik Atmega32 - PullUp vertauscht?


von Dariusz K. (geqoo)


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?

von Spess53 (Gast)


Lesenswert?

Hi

>In der Beschreibung vom Board
>(http://www.pollin.de/shop/downloads/D810038B.PDF) steht, dass Taster1
>PD2 ist (INT0) und Taster2 PD3 (INT1) ist.

Dann sieh dir mal den Schaltplan in dem Dokument an. Die Taster werden 
dort nach VCC geschaltet. Der interne Pull-Up ist damit sinnfrei.

MfG spess

von Dariusz K. (geqoo)


Lesenswert?

Oh ja da habe ich wohl im Datenblatt überlesen, dass das Konstrukt 
ohnehin schon auf Masse liegt.
Unser Garagentor liegt nämlich auf Active Low, daher der Gedanke.

Ansonsten: Vielen Dank für den Hinweis!

von Spess53 (Gast)


Lesenswert?

Hi

>Oh ja da habe ich wohl im Datenblatt überlesen, dass das Konstrukt
>ohnehin schon auf Masse liegt.

Und das ist ein krankes Konstrukt da bei entladenem Kondensator ein 
Kurzschluss beim Drücken der Taste entsteht.

Hier gibt es irgendwo eine Umbauanleitung damit die Taster nach Masse 
schalten.

MfG Spess

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.