Forum: Mikrocontroller und Digitale Elektronik Atmega32 Taster abfragen


von astroscout (Gast)


Lesenswert?

Hallo,
ich habe ein Problem beim Abfragen der Taster mit dem Atmega32.
Ich habe 5 Taster (aktive-low, interne Pullups) an meinem Mikrokotroller 
angeschlossen, die ich mit folgendem Code abfrage:
1
/*Gibt den aktuellen Zustand eines Tasters zurück*/
2
int get_taster_zustand(int taster){
3
  switch(taster)
4
  {
5
    case 1: if (( PIND & (1<<PIND3) )==0) return 1; break;
6
    case 2: if (( PIND & (1<<PIND2) )==0) return 1; break;
7
    case 3: if (( PIND & (1<<PIND1) )==0) return 1; break;
8
    case 4: if (( PIND & (1<<PIND0) )==0) return 1; break;
9
    case 5: if (( PINB & (1<<PINB2) )==0) return 1; break;
10
  }
11
  return 0;
12
}

Das Entprellen etc. finden in einer weiteren Function statt.

Hier wird der PortB initilisiert:
1
  /*Port B*/
2
  DDRB &= ~(1 << DDB1);     //Eingang: USB-Meldung
3
  DDRB &= ~(1 << DDB2);     //Eingang: on/off-Schalter
4
  DDRB |=  (1 << DDB3);     //Ausgang: LCD-Helligkeit (PWM)
5
  DDRB |=  (1 << DDB4);     //Ausgang: Power Control
6
  PORTB = 0x00;
7
  PORTB |= (1 << PB2);     //Pull-Up-Widerstand für on/off-Schalter aktivieren


Für die Taster 1-4 Funktioniert dass ganze einwandfrei, nur leider nicht 
für Taster 5. Hier bekomme ich immer eine 1 (Taster gedrückt) zurück.

Ich habe daraufhin mal am PINB2 gemessen und musste feststellen, dass 
dort immer ein 0V-Potential anliegt, auch wenn ich den Taster komplett 
abgeklemmt habe.

Kann das Problem was damit zu tun haben, dass ich den Timer0 im 
PWM-Betrieb (Ansteuerung der LCD-Hintegrundbeleuchtung an PB3) verwende:
1
/*LCD-Licht Helligkeit*/
2
void lcd_light(int value){
3
  OCR0 = 0xff / 100 * value;
4
  TCCR0 = 0x61;
5
}


Habt Ihr eine Erklärung/Lösung warum der Taster 5 nicht funktioniert?
Wie könnte ich das Problem lösen?

Im Vorraus schonmal Vielen Dank für eure Hilfe.

von astroscout (Gast)


Lesenswert?

Villeicht noch als kleine Ergänzung:
ich mal versucht einen externen Pull-Up an PB2 einzusetzen, jedoch 
lässte sich das signal hiermit auch nicht auf High ziehen

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Miss doch mal im spannungslosen Zustand den Widerstand zwischen GND und 
PB2 sowie zwischen PB2 und den benachbarten Pins (PB1/PB3). Vielleicht 
hast du ja beim Schaltungsaufbau einen Kurzschluss gezaubert.

Gruß,
Magnetus

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich würde den µC aus der hoffentlich vorhandenen Fassung ziehen und 
betreffenden Pin an der Fassung manuell auf Kurzschluss nach GND prüfen. 
Wenn keine Fassung vorhanden ist, dann den µC in den RESET ziehen (PINB2 
tristate hochohmig) und dann Widerstand nach GND messen. Aufpassen mit 
der Spannung und Polung des Ohmmeters.

von MWS (Gast)


Lesenswert?

astroscout schrieb:
> Habt Ihr eine Erklärung/Lösung warum der Taster 5 nicht funktioniert?

Wenn aus Versehen im Code TCCR1A.COM1A0..1 beschrieben wurde, dann 
könnte das diesen Effekt haben.

von spess53 (Gast)


Lesenswert?

Hi

>Wenn aus Versehen im Code TCCR1A.COM1A0..1 beschrieben wurde, dann
>könnte das diesen Effekt haben.

Alternative Funktionen von PB2 sind INT2 und AIN0.

MfG Spess

von MWS (Gast)


Lesenswert?

spess53 schrieb:
> Alternative Funktionen von PB2 sind INT2 und AIN0.

Mein Fehler, hatte Taster 5 mit PD5 assoziert.

von astroscout (Gast)


Lesenswert?

Danke für Eure schnellen Antworten.
Ich habe den Schaltungsaufbau bereits auch (ohne Mikontroller) auf 
Kurzschlüsse überprüft, leider sind dort keine vorhanden.

TCCR1A.COM1A0..1 beschreibe ich auch nirgendwo im Code.

Habt Ihr sonst noch eine Idee, woran das liegen könnte??

von Karl H. (kbuchegg)


Lesenswert?

astroscout schrieb:
> Danke für Eure schnellen Antworten.
> Ich habe den Schaltungsaufbau bereits auch (ohne Mikontroller) auf
> Kurzschlüsse überprüft, leider sind dort keine vorhanden.
>
> TCCR1A.COM1A0..1 beschreibe ich auch nirgendwo im Code.
>
> Habt Ihr sonst noch eine Idee, woran das liegen könnte??

Hast du schon mal mit einem komplett neuen Testprogramm getestet (Pgm so 
einfach wie möglich machen), ob der Taster funktioniert?

Ansonsten werden wir wohl zum äussersten greifen müssen und den 
kompletten Code anfordern müssen.

von astroscout (Gast)


Lesenswert?

Danke für Eure schnellen Antworten.
Ich habe das ganze jetzt nochmal mit diesem Testprogramm getestet, 
hiermit funktioniert der Taster einwandfrei!!
1
int main (void) { 
2
3
4
5
  DDRB |=  (1 << DDB4);     //Ausgang: Power Control
6
  DDRB |=  (1 << DDB3);     //Ausgang: LCD-Helligkeit (PWM)
7
  
8
  
9
  DDRB &= ~(1 << DDB2);     //Eingang: Test-Taster
10
  PORTB |= (1 << DDB2);     //Test-Taster (PullUP aktivieren)
11
  
12
  
13
  PORTB |= (1<<PB4);      //Netzteil an
14
  PORTB |= (1<<PB3);      //LCD-Licht an
15
  
16
17
  
18
  while(1)
19
  {
20
    if (( PINB & (1<<PINB2) )==0)
21
    {
22
      PORTB |= (1<<PB3);      //LCD-Licht an
23
    } else {
24
      PORTB &= ~(1<<PB3);    //LCD-Licht aus
25
    }
26
  }  
27
  
28
}

Somit ist die Hardware in Ordnung, der Fehler muss also an der Software 
liegen.
Habt Ihr eine Idee woran das liegen kann (evtl. an der Verwendung von 
Timer0 im PWM-Betrieb)?

von astroscout (Gast)


Lesenswert?

Ich hab den Fehler gefunden :-)

Ich hatte anfangs Probleme mit dem LCD und deswegen zu Testzwecken 
folgen Codezeile noch im Code:

PORTB = 0x00;

Somit wurde mein Pull-Up-Widerstand direkt wieder deaktiviert.

Trotzdem Danke für Eure Hilfe!!!

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.