Forum: Mikrocontroller und Digitale Elektronik Entprellung von Sensoren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sepp (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

von Stefan A. (ripper121)


Bewertung
0 lesenswert
nicht lesenswert
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;

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Sepp (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
1 lesenswert
nicht lesenswert
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
von Be N. (ben90)


Bewertung
0 lesenswert
nicht lesenswert
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
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Be N. (ben90)


Bewertung
0 lesenswert
nicht lesenswert
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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Be N. (ben90)


Bewertung
0 lesenswert
nicht lesenswert
Ebenso und Danke :)

von Harald W. (wilhelms)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Be N. (ben90)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.