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.