Atmega32 Taster abfragen

Gast #1910713
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.
Gast #1911595
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??
#1911600
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.
Gast #1915408
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)?
Gast #1915560
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!!!

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