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.
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
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.
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
Sorry, Nachtrag: Ich erwarte, dass alle High sind weil ich jetzt setze: DDRC=0x00; PORTC=0xFF;
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.
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) {...}
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.