Zu dem Beitrag [[Beitrag "Entprellen für Anfänger"]] hab ich ne Frage wie das abläuft. Ich habe es in eine .h-Datei ausgelagert und ruf sie in meinem Programm dann auf die debounce-function. Nur bei jedem Reset meines Controllers wird das Debounce einmal ausgeführt?!
Marten Mcgonahy schrieb: > Zu dem Beitrag [[Beitrag "Entprellen für Anfänger"]] hab > ich ne Frage wie das abläuft. Ich habe es in eine .h-Datei ausgelagert > und ruf sie in meinem Programm dann auf die debounce-function. Nur bei > jedem Reset meines Controllers wird das Debounce einmal ausgeführt?! Zeig den restlichen Code. (Ausserdem ist diese debounce Lösung eine schlechte Lösung)
Bau einen Kondensator an dein Taster und lass den Murks mit der Softwarelösung
ich schrieb: > Bau einen Kondensator an dein Taster und lass den Murks mit der > Softwarelösung Autsch. Das tut weh. (Das genaue Gegenteil ist der Fall: Die Kondensator-Lösungen sind Murks)
>(Das genaue Gegenteil ist der Fall: Die Kondensator-Lösungen sind Murks)
Bitte um Aufklärung :-)
Offtopic: *Open Call: send us your Debounce code* http://hackaday.com/2010/10/13/open-call-send-us-your-debounce-code/
Mehr Bauteile = -Platz +Gewicht +Fehlerquelle +Zeit -Flexibilität +Alterung +Geld
ich schrieb: > Bitte um Aufklärung :-) http://www.mikrocontroller.net/articles/Diskussion:Pollin_ATMEL_Evaluations-Board "Die beiden AVR Pollinboards haben eine Hardwareentprellung der Taster. Leider kann es passieren, dass beim Drücken der Taster in diesen Schaltungsteil (d.h. den Kondensator, Ed.) so viel Strom fliesst, dass der Mikrocontroller abstürzt!"
Info schrieb: > Mehr Bauteile = -Platz +Gewicht +Fehlerquelle +Zeit -Flexibilität > +Alterung +Geld Exakt. Oder kriegst du von deiner Kondensatorlösung zb einen automatischen Autorepeat für Lau mit. Oder wie löst du das 'Problem' einen Tastendruck auch dann zu registrieren, wenn das Programm gerade anderweitig beschäftigt ist? Die debounce-Lösung mit dem _delay ist keine gute. Aber im Entprellen-Artikel ist eine Lösung für einen Timer-Interrupt die * so gut wie keine Rechenzeit verbraucht * Tastendrücke auch dann registriert, wenn das Programm anderweitig gerade beschäftigt ist * Auf Wunsch kurze von langen Tastendrücken unterscheidet * einen Autorepeat auf Tasten legen kann Und das alles in noch nicht einmal 2 Handvoll Anweisungen, die weniger als 1% Rechenzeit benötigen.
>> Mehr Bauteile = -Platz +Gewicht +Fehlerquelle +Zeit -Flexibilität >> +Alterung +Geld >Exakt. >Oder kriegst du von deiner Kondensatorlösung zb einen automatischen >Autorepeat für Lau mit. Oder wie löst du das 'Problem' einen Tastendruck >auch dann zu registrieren, wenn das Programm gerade anderweitig >beschäftigt ist? - Platz: naja ein C in 0603 fällt nicht wirklich ins Gewicht, weder vom Platz noch von der MAsse - Fehlerquelle: Der taster selbst ist eine sehr viel größere Fehlerquelle - Zeit: Die Software für Entprellung dauert ja wohl länger als ein C einzulöten - Felxibilität: Wenn man das Programm geschrieben hat ist man auch festgelegt. Man muss halt vorher mal rechnen. - Alterung: Der Taster ändert seine Eigenschaften DEUTLICH mehr als ein C - Geld: im einstelligen Cent Bereich. Softwareentwicklung (5 Minuten) bei Lohnkosten 50€ pro Stunde um die 4€ (kann man argumentieren wenn es Millionenfach gebaut wird) Wenn das Programm anderweitig beschäftigt ist, ist die Softwareentprellung auch keine Lösung, wenn das Programm grad was anderes tut.
ich schrieb: > Wenn das Programm anderweitig beschäftigt ist, ist die > Softwareentprellung auch keine Lösung, wenn das Programm grad was > anderes tut. [ ] du kennst die Dannegger-Entprellung und hast sie schon mal in Aktion erlebt bzw. benutzt [ ] du kennst sie vom hörensagen [ ] du kennst sie nicht > - Zeit: Die Software für Entprellung dauert ja wohl länger als > ein C einzulöten Nö. Wie lange dauert es wohl #include "xyz.h" zu schreiben? (OK. das ist jetzt ein bischen zu sehr verkürzt. Den Timer-Init Code muss man noch einkopieren) > - Felxibilität: Wenn man das Programm geschrieben hat ist man auch > festgelegt. Man muss halt vorher mal rechnen. Mit Flexibilität ist zwar auch Anpassbarkeit gemeint. Aber hauptsächlich welche Möglichkeiten der Benutzung bzw. Benutzerführung sich dadurch ergeben.
>Wie lange dauert es wohl >#include "xyz.h" >zu schreiben? Und automatisch weis der Compiler wo der Taster angeschlossen wird... >Mit Flexibilität ist zwar auch Anpassbarkeit gemeint. Was gibts da anzupassen? Oder gibst du nach 5 Jahren ein Softwareupdate raus, weil du denkst dass die Taster mitlerweile stärker prellen? [x] du kennst sie nicht Dennoch sind 80% eurer Arggumente in meinen Auge Quatsch
ich schrieb: > - Zeit: Die Software für Entprellung dauert ja wohl länger als ein C > einzulöten Die Entwicklung hat länger gedauert, war aber nur einmal nötig. Danach ist der Aufwand aber deutlich geringer, als bei der C-Lösung. Der große Vorteil der SW-Lösung ist, daß sie universell ist. Einfach nur zum Projekt hinzufügen und die gewünschten Funktionen aufrufen. Man muß nie wieder übers Entprellen nachdenken. Peter
ich schrieb: >>Wie lange dauert es wohl >>#include "xyz.h" >>zu schreiben? > > Und automatisch weis der Compiler wo der Taster angeschlossen wird... OK. Ein paar #define kommen noch davor. Trotzdem ist das alles fertig programmiert, noch ehe dein Lötkolben heiß ist. > >>Mit Flexibilität ist zwar auch Anpassbarkeit gemeint. > > Was gibts da anzupassen? Weil man eine Universalroutine hat, die man * an die Tasten-Port-Belegung anpassen kann * Autorepeat wahlweise auf Tasten drauflegen bzw. wegnehmen kann * In den Entprell-zeiten anpassen kann > Oder gibst du nach 5 Jahren ein Softwareupdate > raus, weil du denkst dass die Taster mitlerweile stärker prellen? Nein. Aber Programme entwickeln sich weiter. Ein Parameter der bisher von 1 bis 10 ging, geht demnächst zwecks feinerer Granulierung von 0 bis 1000. Dieselbe Verstellfunktionalität die bisher angemessen war (Einzeltastendrücke) geht plötzlich nicht mehr bisher hattest du
1 | if( get_key_press( KEY_INCREMENT ) ) { |
2 | if( value < 10 ) |
3 | value++; |
4 | }
|
5 | else if( get_key_press( KEY_DECREMENT ) ) { |
6 | if( value > 0 ) |
7 | value--; |
8 | }
|
Durch die neu geforderte feinere Granularität änderst du das zu
1 | if( get_key_press( KEY_INCREMENT ) || get_key_rpt( KEY_INCREMENT ) ) { |
2 | if( value < 1000 ) |
3 | value++; |
4 | }
|
5 | else if( get_key_press( KEY_DECREMENT )|| get_key_rpt( KEY_INCREMENT ) ) { |
6 | if( value > 0 ) |
7 | value--; |
8 | }
|
trägst die beiden Tasten noch beim Repeat-Makro ein und bist fertig. Der Benutzer kann weiterhin mit jedem Tastendruck den Wert um 1 erhöhen/verringern. Drückt er aber die Taste und bleibt drauf, beginnt der Wert nach einer einstellbaren Zeit schnell (wie schnell ist wiederrum einstellbar) hoch/runter zu laufen. Oder du machst
1 | if( get_key_press( KEY_INCREMENT ) ) { |
2 | if( value < 1000 ) |
3 | value++; |
4 | }
|
5 | else if( get_key_rpt( KEY_INCREMENT ) ) { |
6 | if( value < 1000 ) |
7 | value += 10; |
8 | }
|
9 | else if( get_key_press( KEY_DECREMENT ) ) { |
10 | if( value > 0 ) |
11 | value--; |
12 | }
|
13 | else if( get_key_press( KEY_DECREMENT ) ) { |
14 | if( value > 0 ) |
15 | value -= 10; |
16 | }
|
wieder: fertig Belibt der Benutzer länger auf der Taste, so erhöht sich der Wert im schnellen Vorlauf um jeweils 10. Das mein ich mit Flexibilität in der Benutzung. > [x] du kennst sie nicht Dann solltest du nicht über etwas lästern, was du nicht kennst. > > Dennoch sind 80% eurer Arggumente in meinen Auge Quatsch Wir sehen das genau umgekehrt. Mach niemals etwas in Hardware, was du genausogut und ohne Einbussen auch in Software machen kannst.
Marten Mcgonahy schrieb: > Nur bei > jedem Reset meines Controllers wird das Debounce einmal ausgeführt?! Sie muß natürlich ständig in der Mainloop ausgeführt werden, wie soll sie denn sonst den Tastendruck zurückmelden! Und Du mußt natürlich den Returnwert benutzen. Und sie ist durchaus für kleinere Projekte sehr gut geeignet. Was natürlich tödlich ist, sind riesen Monsterdelays (>100ms) in der Mainloop. Dann wird sie nicht mehr oft genug aufgerufen und die Timerinterruptlösung ist angeraten. Peter
>Man muß nie wieder übers Entprellen nachdenken.
Spätestens wenn man eine andere Taktfrequenz verwendet muss man
vermutlich wieder darüber nachdenken (beim C nicht)
Aber bei Gelegenheit werd ich mir den Code mal ansehen, ich will ja
nicht alles schlecht reden ohne es gesehen zu haben.
ich schrieb: >>Man muß nie wieder übers Entprellen nachdenken. > > Spätestens wenn man eine andere Taktfrequenz verwendet muss man > vermutlich wieder darüber nachdenken (beim C nicht) Nö. Wenn man programmieren kann, muss man nicht. Compiler können einem so manche Anpassarbeit abnehmen. Man muss es nur richtig schreiben :-) Du programmierst ja auch so, dass dir der Compiler die notwendigen Konstanten für die UART ausrechnet, wenn Baudrate und Taktfrequenz gegeben sind. Oder etwa nicht?
Ich arbeite viel mit unsauberen/prellenden Signalen. (zwar nur im Hobbybereich... aber denooch !) Ich muss sagen ich habe das alles schon selbst ausprobiert. C, Delay, und PeDas Minimum-ununterbrochen-an Prinzip. Ich benutze zwar nicht seinen Code (faulheit das Ding richtig zu durchschauen -- benutze nur das was Du auch wirklich verstehst), aber das Prinzip. Ich habe mit PeDas Algorithmus noch nie Schmerzen gehabt !!! Delay funktioniert auch nur Nach Zufall. Es gibt statistisch genügend Möglichkeiten das einem was dazwischenfunkt. Ausserdem blockiert das ganze. Der kleine C... Wie gross muss er denn sein ? Was für ein Tau brauche ich ? Was für ein Tau bildet er mit dem Eingangswiderstand des µC ? Bei Peters braucht man nur die Max Prellzeit....
Recht amüsant... [X] du kennst die Dannegger-Entprellung und benutzt sie regelmäßig MfG
SO, nun zu meinem eigentlichen Problem :-) Ich habs mir jetzt nicht alles durchgelesen, da wird heftig diskutiert ob hardware oder softwarelösung, nun gut. Ich möchte eine SOFTWARE-Lösung. Deher möchte ich gern die debounce-Lösung ausprobieren. 1.) Den im Link angegeben Code in eine header-datei ausgelagert 2.) Aufruf der Funktion "debounce()" in meiner main routine. Beispiel...
1 | int main (void) |
2 | {
|
3 | |
4 | DDRA = 0xFF; //Port A auf Output |
5 | |
6 | DDRD &= ~(1 << DDB4)|~(1 << DDB3)|~(1 << DDB2); |
7 | DDRD |=(1<<DDD7); //Summer auf Output |
8 | |
9 | |
10 | while(1) |
11 | {
|
12 | |
13 | //Taster 3 Blinkmuster
|
14 | //if(PIND & (1<<PIND4))
|
15 | if (debounce(PIND, PD4)) |
16 | {
|
17 | |
18 | |
19 | for(int a=0;a<=4;a++) |
20 | {
|
21 | for (int i=0;i<=5;i++) |
22 | {
|
23 | PORTA |= (1<<i); |
24 | _delay_ms(blinktime); |
25 | PORTA &= ~(1<<i); |
26 | _delay_ms(blinktime); |
27 | }
|
28 | |
29 | for (int j=4;j>=1;j--) |
30 | {
|
31 | PORTA |= (1<<j); |
32 | _delay_ms(blinktime); |
33 | PORTA &= ~(1<<j); |
34 | _delay_ms(blinktime); |
35 | }
|
So, nach reset oder neustart des Controllers fährt er mir jede if-Schleife meiner Main-Routine durch. WARUM? Gruß, Markus
Marten Mcgonahy schrieb: > > DDRD &= ~(1 << DDB4)|~(1 << DDB3)|~(1 << DDB2); Das ist Blödsinn Schnapp dir Papier und Bleistift, rechne die Einzelterme aus und führe genau die Operationen durch, die auch dein Programm macht. Dein Glück, dass im Endergebnis raus kommt: Alle Pins im Port D so lassen wie sie sind. Das heißt aber nicht dass die Einzeloperationen korrekt sind. > DDRD |=(1<<DDD7); //Summer auf Output OK. Kein Pullup Widerstand für die Taster? > So, nach reset oder neustart des Controllers fährt er mir jede > if-Schleife meiner Main-Routine durch. WARUM? Nitpicking: if ist keine Schleife. Zum Wesen einer Schleife gehört, dass etwas (zumindest potentiell) wiederholt wird. Bei einem if wird nichts wiederholt. Es wird eine Auswahl aus 2 Möglichkeiten getroffen.
Marten Mcgonahy schrieb: > So, nach reset oder neustart des Controllers fährt er mir jede > if-Schleife meiner Main-Routine durch. WARUM? Das Makro aus der Artikelsammlung arbeitet mit active low geschalteten Tastern Hängt der Taster im Ruhezustand (nicht gedrückt) nicht auf einem HIGH Pegel? D.h. ist der Pull-up Widerstand am Taster nicht eingeschaltet (der interne ist es laut Code nicht, d.h. es müsste ein externer da sein).
ich schrieb: > Was gibts da anzupassen? Oder gibst du nach 5 Jahren ein Softwareupdate > raus, weil du denkst dass die Taster mitlerweile stärker prellen? > > [x] du kennst sie nicht > > Dennoch sind 80% eurer Arggumente in meinen Auge Quatsch Genau das haben die Kutschenhersteller vor über 100 Jahren auch gesagt als die ersten Automobile über die Lande gefahren sind. :-) Lässt Du dich immer noch in der Kutsche fahren? Du urteilst über etwas das Du nicht kennst und dessen Konzept Du wohl nicht oder nur sehr unvollständig verstanden hast. Schau Dir das erst mal in Ruhe an. Und wenn schon Hardwareentprellung, dann machs mit Umschalter und Flipflops. Das ist wenigstens sauber!
Karl heinz Buchegger schrieb: >> >> DDRD &= ~(1 << DDB4)|~(1 << DDB3)|~(1 << DDB2); > > > Das ist Blödsinn > > Schnapp dir Papier und Bleistift, rechne die Einzelterme aus und führe > genau die Operationen durch, die auch dein Programm macht. > > Dein Glück, dass im Endergebnis raus kommt: Alle Pins im Port D so > lassen wie sie sind. Das heißt aber nicht dass die Einzeloperationen > korrekt sind. Ok, ich sehs grad. Wenn ich statt den "oder" jeweils ein "und" einbaue, dann dürfte es stimmen. Es gibt also verschiedene Varianten, wie schreibt man denn es nun im Normalfall, wenn ich also B4,B3,B2 als EINGANG nutzen möchte, weil Taster dranhängen? Karl heinz Buchegger schrieb: > Kein Pullup Widerstand für die Taster? Die Eingänge sind mit einem Pulldownwiderstand abgeschlossen. Karl heinz Buchegger schrieb: > Nitpicking: if ist keine Schleife. > Zum Wesen einer Schleife gehört, dass etwas (zumindest potentiell) > wiederholt wird. Bei einem if wird nichts wiederholt. Es wird eine > Auswahl aus 2 Möglichkeiten getroffen. Sorry, du hast schon recht, aber du weisst was ich meine. Die if-ANWEISUNG wird mir immer ausgeführt.
Marten Mcgonahy schrieb: > Karl heinz Buchegger schrieb: >>> >>> DDRD &= ~(1 << DDB4)|~(1 << DDB3)|~(1 << DDB2); >> >> >> Das ist Blödsinn >> >> Schnapp dir Papier und Bleistift, rechne die Einzelterme aus und führe >> genau die Operationen durch, die auch dein Programm macht. >> >> Dein Glück, dass im Endergebnis raus kommt: Alle Pins im Port D so >> lassen wie sie sind. Das heißt aber nicht dass die Einzeloperationen >> korrekt sind. > > Ok, ich sehs grad. Wenn ich statt den "oder" jeweils ein "und" einbaue, > dann dürfte es stimmen. Nein. Nimm dir Papier und Bleistift und spiels durch
Marten Mcgonahy schrieb: >> Kein Pullup Widerstand für die Taster? > > Die Eingänge sind mit einem Pulldownwiderstand abgeschlossen. Dann musst du die debounce Funktion umschreiben. Die ist, wie die meisten Taster-Funktionen, darauf ausgelegt, dass der Grundzustand am Port eine 1 ist und beim Drücken der Eingangspin auf 0 geht.
Stefan B. schrieb: > Das Makro aus der Artikelsammlung arbeitet mit active low geschalteten > Tastern > > Hängt der Taster im Ruhezustand (nicht gedrückt) nicht auf einem HIGH > Pegel? D.h. ist der Pull-up Widerstand am Taster nicht eingeschaltet > (der interne ist es laut Code nicht, d.h. es müsste ein externer da > sein). Wie erkenne ich das im Sourcecode? Mein Taster (Schließer) verbindet beim schließen den Input vom Controller mit highpotential, wenn der Taster also offen ist, liegt lowpotential am Eingang an. Sprich der Taster is high active, nicht dass ich jetzt mit den Bezeichnungen durcheinander komme?! :-)
Marten Mcgonahy schrieb: > Stefan B. schrieb: >> Das Makro aus der Artikelsammlung arbeitet mit active low geschalteten >> Tastern >> >> Hängt der Taster im Ruhezustand (nicht gedrückt) nicht auf einem HIGH >> Pegel? D.h. ist der Pull-up Widerstand am Taster nicht eingeschaltet >> (der interne ist es laut Code nicht, d.h. es müsste ein externer da >> sein). > > Wie erkenne ich das im Sourcecode? Indem du dir die Abfragen ansiehst und die Funktionsweise der debounce Funktion verstehen lernst. Aus der Logik ergibt sich dann: solange der Grundzustand 1 vorliegt, macht debounce überhaupt nichts. Bei dir ist aber der Grundzustand nicht 1, bei dir ist er 0 > Mein Taster (Schließer) verbindet > beim schließen den Input vom Controller mit highpotential, wenn der > Taster also offen ist, liegt lowpotential am Eingang an. Sprich der > Taster is high active, nicht dass ich jetzt mit den Bezeichnungen > durcheinander komme?! :-) Diesmal stimmt deine Ausdrucksweise :-) Im einfachsten Fall stopfst du einfach den invertierten Zustand des Ports in die debounce Funktion hinein. Dann dreht sich für debounce alles um (aus 1 wird 0, aus 0 wird 1) und es ist glücklich und arbeitet korrekt.
Karl heinz Buchegger schrieb: > Nein. > Nimm dir Papier und Bleistift und spiels durch Hab ich. Statt den Oder´s jeweils ein UND müsste ja gehen?! Bit 6 5 4 3 2 1 -------------------- 1 0 1 1 1 1 1 1 0 1 1 1 Oder 1 1 1 0 1 1 Oder -------------------- 1 1 1 1 1 1 Ergebnis Wenn nun ein UND statt den beiden ODER verwendet wird, steht da 1 0 0 0 1 1 Sprich, ein NULLER heisst ja dass der Port ein Eingang ist.
Marten Mcgonahy schrieb: > Karl heinz Buchegger schrieb: >> Nein. >> Nimm dir Papier und Bleistift und spiels durch > > Hab ich. Statt den Oder´s jeweils ein UND müsste ja gehen?! OK. Hast recht. Mein Fehler die kanonische Schreibweise ist DDRD &= ~( (1 << DDB4) | (1 << DDB3) | (1 << DDB2) ); wenn man da jetzt De-Morgan anwendet kommt das von dir behauptete raus. Mein Fehler. Sorry. > 1 0 0 0 1 1 > > Sprich, ein NULLER heisst ja dass der Port ein Eingang ist. Noch nicht ganz. Bis jetzt hast du nur die Maske, mit der das DDR selber wieder verundet wird. Jeder 0-er in der Maske sorgt dafür, dass im Ergebnis ebenfalls imt Sicherheit eine 0 auftaucht. Und damit sorgt diese Maske dafür, dass DB2, SB3 und DB4 in DDRD auf jeden Fall auf 0 gesetzt werden. Über die restlichen Bits in DDRD lässt sich keine Aussage machen. Die bleiben so wie sie vorher waren. Aber: Es kommt das Richtige aus dem richtigen Grund raus.
Karl heinz Buchegger schrieb: > die kanonische Schreibweise ist > > DDRD &= ~( (1 << DDB4) | (1 << DDB3) | (1 << DDB2) ); > > wenn man da jetzt De-Morgan anwendet kommt das von dir behauptete raus. > Mein Fehler. Sorry. Aiaiai, den De-Morgen hab ich auch mal irgendwo gehört, lang ists her. Einfach UND und ODER tauschen, so irgendwie war das. Karl heinz Buchegger schrieb: > Noch nicht ganz. Ja, ich vergaß es noch zu erwähnen, das macht ja das UND vor dem Gleichheitszeichen. Nur ich versteh nicht warum in dem AVR oder GCC Tutorial sie so auf diese Schreibweise hinweisen?! Ich bin ein Fan von 0b0101010101, da sieht man es doch auch sofort und ist nicht so lange?! Hex schließ ich mal ganz aus, ausser es is halt 0hFF also alles 1. Nun hab ich troztdem mit meinem debounce noch zu kämpfen, die Übergabeparameter invertieren funktioniert nicht, also im h-file invertieren mal versuchen. Ein weiterer Nachteil der jetzt mit dem externen quarz aufkam, meine if-Anweisungen werden nicht mehr bedient, weil er in der delay-Schleife wohl festhängt und überhaupt nicht auf die Tasteneingaben reagiert. Klar, musste ja so kommen, bei den timern bin ich noch nicht so richtig. Und die PWM-Sache ist zwar thema Timer, aber ich hab den sourcecode ja nur kopiert und muss mir das ganze erst noch genauer ansehen. Ich hatte mal nen c167 mit assembler programmiert. Da gabs dann ISR (Interrupt service routinen) und durch z.b. nen taster konnte man die ja auslösen, oder durch nen timer oder oder. Aber wie läuft das hier in C? Ich drücke eine Taste und dann springt er mir in eine Routine ausserhalb von main, oder wie?
Marten Mcgonahy schrieb: > Nur ich versteh nicht warum in dem AVR oder GCC Tutorial sie so auf > diese Schreibweise hinweisen?! Ich bin ein Fan von 0b0101010101, da > sieht man es doch auch sofort und ist nicht so lange?! Na dann schreib doch mal deine 0b... Schreibweise so um, dass du die Portnummern an einer einzigen Stelle beisammen hast und du dort einfach konfigurieren kannst, wo der Taster hängt. > Nun hab ich troztdem mit meinem debounce noch zu kämpfen, die > Übergabeparameter invertieren funktioniert nicht Warum nicht?
Karl heinz Buchegger schrieb: >> Nun hab ich troztdem mit meinem debounce noch zu kämpfen, die >> Übergabeparameter invertieren funktioniert nicht > > Warum nicht? Ah. Seh schon. Noch mal mein Fehler. Dieser debounce Funktion übergibt man ja nicht einen Wert, sondern die Adresse des Ports. Yep. Dann muss man die Funktion umdrehen.
http://www.mikrocontroller.net/articles/Entprellung#Debounce-Makro_von_Peter_Dannegger "Peter Dannegger hat in "Entprellen für Anfänger" folgende vereinfachtes Entprellverfahren beschrieben. Das Makro arbeitet in der Originalversion mit active low geschalteten Tastern, kann aber einfach für *active high* geschaltete Taster angepasst werden (Tasty Reloaded)" In den beiden Links im Artikel ist gezeigt, was man für active high ändern muss.
Stefan B. schrieb: > http://www.mikrocontroller.net/articles/Entprellun... > > "Peter Dannegger hat in "Entprellen für Anfänger" folgende vereinfachtes > Entprellverfahren beschrieben. Das Makro arbeitet in der Originalversion > mit active low geschalteten Tastern, kann aber einfach für *active > high* geschaltete Taster angepasst werden (Tasty Reloaded)" > > In den beiden Links im Artikel ist gezeigt, was man für active high > ändern muss. 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.