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
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.
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
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
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.