Problem mit einfachem Taster

Gast #2198489
Lesenswert?
• ▲
▼
Hallo allerseits,

ich habe ein Problem, das mich schon zur Verzweiflung gebracht hat. Ich 
versuche einen einfachen Taster zu simulieren, indem ich vorerst den PIN 
mit Masse verbinde. Schalter sollen an die Pins 0, 1 und 2 von PORTC 
kommen. Ich verwende folgende selbstgeschrieben Routinen:


void initPortCin()
{
  DDRC &= ~(_BV(0)|_BV(1)|_BV(2));  //PortC als Eingang
  PORTC |= _BV(0)|_BV(1)|_BV(2);    //PullUp Widerstände an
}



Abfragen tu ich das ganze mit folgender Funktion. Diese Funktion gibt 
den invertierten PORT-Wert zurück. wenn also PC0 gedrückt wird, soll 
0x01, PC1 0x02 und PC3 0x03 zurückgegeben werden. Ist eine Taster länger 
gedrückt, soll 0xFF zurückgegeben werden. Leider funktioniert das ganze 
zwar auf meinem Programmierboard mit high-aktiver-schalter logik 
(Pollin), aber mit low-aktiver gehts nicht mehr. Am Port außen habe ich 
sonst nichts angeschlossen, außer einem Draht den ich ggf. an GND lege.


unsigned char waitforKey_C()
{
  unsigned char ret;
  unsigned int i=0;
  unsigned int k=0;


  while(PINC==0xFF) {;}

  ret=PINC;

  _delay_ms(25);

  while(PINC!=0xFF)
  {
    i=i+1;
    if(i==1000)
    {
      i=0;
      k=k+1;
    }
    //etwa 3 Sekunden
    if(k==800)
    {
      i=0;
      k=0;
      ret=0xFF;
    }
  }

  return ~ret;
}



Ich hoffe hier ist einer so findig sich in fremden Code einzulesen und 
erkennt vielleicht mein Problem.

Grüße Dennis R.
Gast #2198538
Lesenswert?
• ▲
▼
Dennis R. schrieb:
> Diese Funktion gibt
> den invertierten PORT-Wert zurück. wenn also PC0 gedrückt wird, soll
> 0x01, PC1 0x02 und PC3 0x03 zurückgegeben werden.

PC0 = 0b 0000 0001 = 0x01
PC1 = 0b 0000 0010 = 0x02
PC2 = 0b 0000 0100 = 0x04 !!! (nicht 0x03)
PC3 = 0b 0000 1000 = 0x08

Tja, das kommt von den _BV()-Makros... ;-)

Johannes
Gast #2198543
Lesenswert?
• ▲
▼
Vielen Dank für die schnelle Antwort!

Das war ehrlich gesagt ein Tippfehler oben, ich frage auch im 
Hauptprogramm auf 0x04 ab :-)

Das eigentlich Problem besteht darin, dass die Funktion waitforKey_C() 
NIE!! verlassen wird. Er kehrt also nicht daraus zurück.
Gast #2198621
Lesenswert?
• ▲
▼
Ich habe mittlerweile durch Messen herausgefunden, dass die Ausgänge 
nach der initialisierung mittels DDRC und PORTC nicht alle auf High 
sind. PD4 ist nämlich low....

Ich verwende in meinem Programm einen Temperatursensor über I2C an 
PortD, ein LCD Display an PORT A und Port B und die Taster an Port C...

verzweifel

Vielen Dank, Dennis
Gast #2198737
Lesenswert?
• ▲
▼
Problem gelöst. Meine Tastenabfrage war der föllige Holzweg.

Falls es jemanden interessiert, oder ein ähnliches problem besteht. Die 
Lösung war das letztendliche Abfragen der exakten PINS und nicht des 
gesamten Ports, da ich in meinem Programm einfach nicht mehr den 
überblick hatte welche Bibliothek wie initialisiert.

Ist irgendeine der 3 Tasten gedrückt:

while(! ((PINC & 0x01) && (PINC & 0x02)) ... )

ist eine bestimmte Taste gedrückt

while(! (PINC & 0x01) )

Vielen Dank, für die Konversation :D

Dennis R.
Gast #2199255
Lesenswert?
• ▲
▼
Mini Float schrieb:
> Dennis R. schrieb:
>> while(! (PINC & 0x01) )
>
> und warum definierst du dir nicht die Knöpfe, wie z.B.
>
> #define BUTTON0 (!(PINC&(1<<PC0)))
> #define BUTTON1 (!(PINC&(1<<PC1)))
>
> ?
>
> In der Definition sieht man auch gleich, wo die Knöpfe angeschlossen
> sind und du kannst im Code dann einfach schreiben:
>
> while(BUTTON0)
> {...}
>
> mfg mf
>
> PS: oder:
>
> while(BUTTON0 || BUTTON1)
> {...}

Danke, der TIpp ist wirklich gut, daran hab ich gar nicht gedacht.

Gruß Dennis

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.