mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 Taster abfragen


Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
/*Gibt den aktuellen Zustand eines Tasters zurück*/
int get_taster_zustand(int taster){
  switch(taster)
  {
    case 1: if (( PIND & (1<<PIND3) )==0) return 1; break;
    case 2: if (( PIND & (1<<PIND2) )==0) return 1; break;
    case 3: if (( PIND & (1<<PIND1) )==0) return 1; break;
    case 4: if (( PIND & (1<<PIND0) )==0) return 1; break;
    case 5: if (( PINB & (1<<PINB2) )==0) return 1; break;
  }
  return 0;
}

Das Entprellen etc. finden in einer weiteren Function statt.

Hier wird der PortB initilisiert:
  /*Port B*/
  DDRB &= ~(1 << DDB1);     //Eingang: USB-Meldung
  DDRB &= ~(1 << DDB2);     //Eingang: on/off-Schalter
  DDRB |=  (1 << DDB3);     //Ausgang: LCD-Helligkeit (PWM)
  DDRB |=  (1 << DDB4);     //Ausgang: Power Control
  PORTB = 0x00;
  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:
/*LCD-Licht Helligkeit*/
void lcd_light(int value){
  OCR0 = 0xff / 100 * value;
  TCCR0 = 0x61;
}


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.

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Alternative Funktionen von PB2 sind INT2 und AIN0.

Mein Fehler, hatte Taster 5 mit PD5 assoziert.

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure schnellen Antworten.
Ich habe das ganze jetzt nochmal mit diesem Testprogramm getestet, 
hiermit funktioniert der Taster einwandfrei!!
int main (void) { 



  DDRB |=  (1 << DDB4);     //Ausgang: Power Control
  DDRB |=  (1 << DDB3);     //Ausgang: LCD-Helligkeit (PWM)
  
  
  DDRB &= ~(1 << DDB2);     //Eingang: Test-Taster
  PORTB |= (1 << DDB2);     //Test-Taster (PullUP aktivieren)
  
  
  PORTB |= (1<<PB4);      //Netzteil an
  PORTB |= (1<<PB3);      //LCD-Licht an
  

  
  while(1)
  {
    if (( PINB & (1<<PINB2) )==0)
    {
      PORTB |= (1<<PB3);      //LCD-Licht an
    } else {
      PORTB &= ~(1<<PB3);    //LCD-Licht aus
    }
  }  
  
}

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)?

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.