Hallo Leute, Zu Peters Entprellung eine Frage: Ich habe hier erstmal einen 328P auf welchen ich 3 Sensoren mit Vorschaltungen gelegt habt. Es kommen letztendlich nur Low oder Highpegel an. Diese möchte ich nun allerdings noch entprellen. Da ich mich mit der Materie noch nicht gut auskennen und die ersten 100 Beiträge mich nicht wirklich weitergebracht haben meld ich mich nun mal so. Diese 3 Eingänge können gleichzeitig auftauchen was in 90% der Fälle auch sein wird. Zwar nicht immer 3 aber mindestens 2. Diese muss ich entprellen. Ebeneso muss ich darauf achten dass diese Signale min. 150ms HIGH sind bevor ich diese erkennen darf. Ist einer der Sensoren diese Zeit HIGH muss ich diesen in ein neues uint8_t schreiben um es per UART weitersenden zu können. Nun hab ich mir den Code wirklich oft genug angesehen aber ich bin immer wieder verwirrt. Ist es möglich mein Vorhaben umzusetzen? Danke euch Ben
Schreib in ne Variable wann welche taste gedrückt wurde.
1 | buttonDelay = 150; |
2 | |
3 | if(button0Pressed) |
4 | lastButton0Time = millis(); |
5 | if(button1Pressed) |
6 | lastButton1Time = millis(); |
7 | if(button2Pressed) |
8 | lastButton2Time = millis(); |
9 | |
10 | if(millis() - lastButton0Time > buttonDelay) |
11 | Button0Pressed150ms=true; |
12 | |
13 | if(millis() - lastButton1Time > buttonDelay) |
14 | Button1Pressed150ms=true; |
15 | |
16 | if(millis() - lastButton2Time > buttonDelay) |
17 | Button2Pressed150ms=true; |
Sepp schrieb: > Ebeneso muss ich darauf achten dass diese Signale min. 150ms > HIGH sind bevor ich diese erkennen darf. Dann inititialisierst du den Timer entsprechend langsamer, das hier > TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5); // preload for 10ms änderst du auf etwa 70-80ms. Kann sein, das du einen Prescaler höher nehmen musst. Der Vorgang wird dir klar, wenn du die ganze Sache mal durch einen Simulator laufen lässt. Die Routine (die ISR) guckt zweimal nach, ob die Taste nun auch wirklich gedrückt ist und setzt erst dann den Ausgang. Sepp schrieb: > Code.txt Das ist übrigens eher hinderlich. Hänge ganz normal 'code.c' an, das Forum sorgt dann für die richtige Formatierung.
Ok danke für die Antworten. Ist es also möglich, mit dieser Entprellung alle 3 Eingänge zeitgleich zu überprüfen? Matthias S. schrieb: > Dann inititialisierst du den Timer entsprechend langsamer, das hier >> TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5); // preload for 10ms Ok das werd ich so mal mit aufnehmen. Doch was ich jetzt noch fragen muss ist, welche Funktion brauch ich jetzt letztendlich für diese Überprüfung? short, long, press oder repeat? Ich werd nicht schlau aus dem Code, ich denke ich hab was verstanden und zwei Zeilen weiter bin ich schon wieder raus -.- Bin noch recht neu in Micros programmieren also bitte etwas Verständnis
Sepp schrieb: > short, long, press oder > repeat? Du könntest alles auf 10ms lassen, die REPEAT_START Zeit auf die von dir gewünschte Zeit (für 150ms also eine 15 für REPEAT_START) setzen und dann konsequent nur 'get_key_long' abfragen, das dir erst dann einen Sensor returniert, wenn er länger als die REPEAT_START Zeit (multipliziert mit der Timer Periode) gedrückt ist. Betr. PN Nachricht: Sorry keine Zeit übers Forum hinaus.
:
Bearbeitet durch User
Matthias S. schrieb: > (multipliziert mit der Timer Periode) was genau ist nun das? Aber ich kann wie gewünscht auch alle 3 Sensoren gleichzeitig mit aufrufen nicht? Bin übrigens der "Sepp" hab mich jetzt mal registriert. Ben
:
Bearbeitet durch User
Be N. schrieb: > Matthias S. schrieb: >> (multipliziert mit der Timer Periode) > > was genau ist nun das? Lies dir doch mal bitte die Beschreibung durch. Die Timer Periode steht im Artikel auf 10ms. Die REPEAT_START Zeit steht original auf 50 und ist damit 500ms lang, also 50 multipliziert mit 10ms - der Timer Periode. Wenn also eine Taste länger als 500ms gedrückt ist, liefert get_key_repeat() diese Taste (und auch get_key_long() tut das). Alle REPEAT_NEXT Zeit wird sie dann wieder als aktiv gemeldet, im Artikel also alle 200ms, da REPEAT_NEXT auf 20 steht. Den repeat Krams brauchst du im Moment nicht. Aber die Zeiten schon, denn 'get_key_long()' benutzt die REPEAT_START Zeit. Stell also REPEAT_START auf 15 und frag die Sensoren mit 'get_key_long()' ab.
Ich hoffe das ist jetzt das was du meintest. Habe da eine Seite gefunden, muss laut dieser nun einen externen Quarz hinzufügen mit 16Mhz z.B. Will ich jetzt wie bei mir 10ms PeriodenZeit kommt dann folgendes bei raus. Stimmt das dann so? Gewünscht: 0.01 s Am nächsten gelegen: 0.009984 s Verwendeter prescaler: 1024 Verwendeter preload: 100
1 | TCCR0 |= (1<<CS02) | (1<<CS00) |
2 | |
3 | TCNT0 = 100 |
Ben
Be N. schrieb: > Will ich jetzt wie bei mir 10ms PeriodenZeit kommt dann folgendes bei > raus. Stimmt das dann so? Solange du F_CPU in deinem Projekt so deklarierst, wie es in Wahrheit auch ist, wird der Timer schon richtig initialisiert und du brauchst dich darum nur am Rande zu kümmern. Du musst also keinen Quarz für die Entprellung einsetzen, wenn dein Projekt es sonst nicht erfordert. So, ich muss nun ein paar Schiffsdiesel zum Laufen bringen und bin weg. Viel Glück.
Sepp schrieb: > Ich habe hier erstmal einen 328P auf welchen ich 3 Sensoren mit > Vorschaltungen gelegt habt. Es kommen letztendlich nur Low oder > Highpegel an. Diese möchte ich nun allerdings noch entprellen. Es ist ziemlich seltsam, das Du dei Signale von Sensoren entprellen musst. Normalerweise liefern die immer ein prellfreies Signal. Kannst Du näheres zu den verwendeten Sensoren sagen?
Das Datenblatt der Sensoren hab ich mal hochgeladen. Allerdings habe ich eine Vorschaltung welche die Signale verarbeitet da unter anderem weitere Sensoren vorhanden sind, lediglich diese werden an den Mikro angeschlossen. Aus der vorhergehenden Schaltung kommen (Sensoren haben analogen Ausgang) allerdings lediglich LOW bzw. HIGH-Pegel. Ich habe in der davorgeschalteten Schaltung schon Filter eingebaut, allerdings möchte ich Softwareseitig sicher gehen und diese Signale enptrellen. Ebenso sollen die Sensoren auch eine gewisse Zeit angesprochen werden bevor ich diese im Programm weiterverarbeiten kann. Mir ist bewusst dass ich einen Interrupt-Zähler verwenden kann um das zu überprüfen, aber wenn Peters Entprellung so tadellos funktioniert warum ein anderes System verwenden? Ebenso kann ich, sollten Änderungen notwendig sein, diese leicht ändern. Derzeit habe ich alle Infos von Matthias verarbeitet und widme mich gerade der Verarbeitung, da ich mehrere Mikros miteinander vernetze.
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.