Hallo, ich habe ein Problem. Ich habe schon lange gesucht aber ich finde nicht meinen Fehler. Kann einer mal von euch drüber schauen und mir vielleicht sagen wo mein Fehler ist. "Ich sehe den Wald vor lauter Bäumen nicht mehr." Mit Taste S1 kann ich meinen Zähler erhöhen , aber die Tasten S2 und S3 funktionieren nicht. Elektrisch habe ich alles schon geprüft. Die Signale liegen elektrisch korrekt an den Portpins an. Anforderung: Ich möchte mit meinen Tastern S1 .. S3 einen Zähler verändern. Ich habe die Tasten auch entprellt und damit der Zähler nicht durchläuft auch verriegelt das die Taste erst oben sein muß bevor der nächste Tastendruck ausgewertet wird. Ich benötige einen Millisekunden Takt später in meiner Software deshalb habe ich ihn auch für die Entprellung der Tasten mit verwendet. Vielen Dank Hier der Programmcode: // Taster an Pin PB0, PB1 und PB2 -> Taster gedrückt = 0 V, Taster offen = 5 V // Portpin mit Pull up Widerstand an 5 V // LED an Pin PC0, PC1 und PC2 Anode an Port und Kathode an GND #define TASTE1_GEDRUECKT (Port_B_entprellt & 0x01) #define TASTE2_GEDRUECKT (Port_B_entprellt & 0x02) #define TASTE3_GEDRUECKT (Port_B_entprellt & 0x04) #define true 1 #define false 0 #define DebounceTime 50 // 50ms char Taste_S1_oben = true; char Taste_S2_oben = true; char Taste_S3_oben = true; char Taste_S1 = false; char Taste_S2 = false; char Taste_S3 = false; char Debounce_Counter = DebounceTime; char Test = 0; SIGNAL (SIG_OUTPUT_COMPARE1A){ // interrupt jede 1/1000 sec mSekunden++; // 8.000.000 MHz 8 1000 = 0,001 sec = 1 ms Debounce_Counter++; if (Debounce_Counter == DebounceTime){ Debounce_Counter = 0; Port_B_entprellt = PINB; // umkopieren } void Entprellen (void){ if (TASTE1_GEDRUECKT == 0 ){ // entprellen Taster S1 Taste_S1_oben = true; } if ((TASTE1_GEDRUECKT == 1 ) && (Taste_S1_oben == true)){ Taste_S1_oben = false; Taste_S1 = true; } if (TASTE2_GEDRUECKT == 0 ){ // entprellen Taster S2 Taste_S2_oben = true; } if ((TASTE2_GEDRUECKT == 1 ) && (Taste_S2_oben == true)){ Taste_S2_oben = false; Taste_S2 = true; } if (TASTE3_GEDRUECKT == 0 ){ // entprellen Taster S2 Taste_S3_oben = true; } if ((TASTE3_GEDRUECKT == 1 ) && (Taste_S3_oben == true)){ Taste_S3_oben = false; Taste_S3 = true; } } main{ DDRB = 0x00; // Port B Pin 0..3 Input DDRC = 0x0F; // Port C Pin 0..3 Output PORTB = 0x00; // PORTC = 0x0F; // TCCR1B |= (1<<CTC1) | (1<<CS11); // divide by 8 OCR1A = 1000; TCNT1 = 0; TIMSK = 1<<OCIE1A; sei(); Entprellen (); if (Taste_S1 == true) { Taste_S1 = false; Test++; } if (Taste_S2 == true ) { Taste_S2 = false; Test--; } if (Taste_S3 == true ) { Taste_S3 = false; Test = 0; } }
Hauptschleife fehlt !!! Dein main läuft ins Nirwana !!! Du hast bestimmt noch nicht die Codesammlung hier entdeckt. Da gibt es ein rundum sorglos (bulletproof) Entprellen für bis zu 8 Tasten, der Scheduler zeigt ein Anwendungsbeispiel (Treppenhauslicht) dazu. Peter
Hallo, vielen Dank für den Tipp. Stimmt ich hatte das Code oben aus meinen gesamten Code heraus kopiert. In main ist natürlich noch eine dauerschleife. Kann mir den einer sagen ob in meinem Code ein Fehler ist oder ich einen Denkfehler gemacht habe. Ich würde gerne die Routinen so nutzen aber es funktioniert nicht. Leider habe ich noch nicht sehr viel Erfahrung mit dem AVR und komme deshalb mit Assembler nicht klar. Schon mal vielen Dank Gruß Stephan
Wenn Du nicht exakt den gesamten Code postest (als Dateianhang !), der nicht funktioniert !!! Das haben wir hier schon öfters durch, es bringt nichts !!! Dann vergiß es !!! Peter P.S.: Das Schedulerbeispiel ist in C.
P.S.: Man sollte natürlich den Code soweit reduzieren, daß der Fehler immer noch da ist. Und natürlich auch getestet haben, daß der Fehler immer noch da ist ! Und Kommentare und Beschreibungen wird hier keiner übel nehmen. Peter
nur so als frage, aber fehlt beim entprellen nicht der ansatz???? weil da steht nur (soviel ich gesehen hab) debounceTime 50 !!! nur wenn ich entprelle mach ich das zb so: Config Debounce = 30 //30ms Debounce Pind.0 , 0 , Taster1 und weiter unten bevor die "Taster" kommen schreib ich: Taster1:
aso ..... das soll C sein? gibt aber anscheinend keine großen unterschiede ??!!
Hi, die PULL-UP Widerstaende von PORTB sind aus. Soll das so?
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.