Hi, ich wollte mal wissen ob folgender code: void entprell (void) { _delay_ms(10); if ( (PINC & _BV(PC0)) == 1 ) { _delay_ms(5); if ( (PINC & _BV(PC0)) == 1){ T_HAS_BEEN_PUSHED!(); } } } aufgerufen durch : if ( (PINC & _BV(PC0)) == 0 ){ entprell(); } In Ordnung ist, um eine Taste zu entprellen. Der Taster ist aktiv Low und der Pullup aktiviert. Wenn die Taste gedrückt wird, wird in die entprell Funktion gesprungen und dort 10ms gewartet. Wenn der Taster Pin dann wieder high ist, wird 5ms gewartet und wenn er dann immernoch high ist, wird in eine funktion gesprungen, die bei mir, eine register mit leds inkrementiert. Ist das vom Prinzip her korrekt programmiert? Es funktioniert nämlich... Danke.
>In Ordnung ist, um eine Taste zu entprellen.
Nach Analyse des Codes:
1 | _delay_ms
|
folgt ein: NEIN Beitrag "Tasten entprellen - Bulletproof"
Hi, danke das du es dir angeschaut hast. Was genau ist an delay nicht in ordnung? Mir ist klar, dass diese art des entprellens den kompletten uC blockiert! Ist aber immoment nicht schlimm...
>Ist aber immoment nicht schlimm..
Naja, dann kannst es erstmal lassen.
(Hab mir den COde im Detail nicht angesehen)
Ah das ist ja sehr lustig ;) Dann empfiehlst du mir es erstmal so zu lassen, ohne zu wissen ob es seinen zweck erfüllt...
>Dann empfiehlst du mir es erstmal so zu lassen, ohne zu wissen ob es >seinen zweck erfüllt... DU sagst doch es geht ;) Wenn du Zeit hast zu warten dann ist das so ok.
Nein. So meinte ich das nicht. Meine ersten Entprell-versuche waren auch etwa so: wenn taste gedrückt, kurz warten und wenn immernoch gedrückt wirds als gedrückt erkannt. Für die ersten Erfahrungen am µC ist das ok. Aber man sollte sich alsbald mit besseren Entprellungen beschäftigen: Die Tasten werden zyklisch (zB alle 10ms) abgefragt. Ist diese nicht gedrückt, wird ein Zähler genullt. Wird diese als gedrückt erkannt, den Zähler um eins erhöhen. Ist der Zähler größer als X1 wird "Taste gedrückt" ausgegeben und vom Zählwert ein Zahlenwert etwas kleiner als X1 abgezogen.
joi... bisher hatte ich nur assembler... Nun lern ich C und wir haben dort noch nicht gerlernt einen interrupt zu benutzen... Sonst hätte ich mir einen Timer ISR geschrieben und alle 10ms den status eingelesen...Dann hätte ich nebenher noch was anderes machen können. Aber aufgabenstellung ist halt es so zu lösen ;) Trotzdem danke.
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.