Forum: Mikrocontroller und Digitale Elektronik Problem mit einfachem Taster


von Dennis R. (Gast)


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.

von Johannes F. (Gast)


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

von Dennis R. (Gast)


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.

von Dennis R. (Gast)


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

von Dennis R. (Gast)


Lesenswert?

Sorry, Nachtrag: Ich erwarte, dass alle High sind weil ich jetzt setze:

DDRC=0x00;
PORTC=0xFF;

von Dennis R. (Gast)


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.

von Achim M. (minifloat)


Lesenswert?

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)
{...}

von Joe R. (joer)


Lesenswert?

Dennis R. schrieb:
> Vielen Dank, für die Konversation :D

Bitte, kein Problem.
Ein einfaches Auslesen des Ports samt Ausgabe auf das LCD hätte 
vvarscheinlich völlig genügt...

;-)   schlaf schön

von Dennis R. (Gast)


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

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.