komme nicht zurecht !Debounce

Hmmmm, auch wenn ich mich langsam unbeliebt mache :date:
aber ich habe schon wieder was zum mosern :D

Sorry Casio, ist echt nicht gegen Dich gement und Du darfst es auch nicht perönlich aufnehmen, ich will Neuuser auch nur auf die richtigen Sprünge helfen ohne ihm dabei gleich eine Komplettlösung vorzukaufen.

Lösungen sind immer am besten, wenn man sie selbst erarbeitet und selbst auf seine eigene Lösung stolz sein kann.

Also, was gibt es diesmal zum aussetzen ....

Zum Thema: Prellen eines Schalters bedeutet, das ein mechanischer Kontakt nicht nur schließt / öffnet, sondern bedingt durch Konstruktion, Federkonstante der mechanischen Teile, Masseträgheitsmoment und Impulserhaltung zunächst nicht in dem gewünschten Zustand verbleibt sondern schwingt. Bedeutet, Du willst einen Schalter schließen und er springt noch x-mal auf bevor er wirklich geschlossen bleibt oder Du wilst ihn öffnen und er schließt noch x-mal durch "Einschwingvorgänge" der Mechanik. Das ist ganz normal. Es gibt wohl ganz hochwertige Taster/Schalter die nicht prellen aber die kann keiner bezahlen.
Einfache und billige Taster/Schalter prellen x-fach. 20 Mal auf/zu/auf habe ich hier durchaus schon beobachtet. Abhängig wie schnell nun Dein Mega rennt bekommst Du alles haar-klein mit und manche zustände vielleicht sogar doppelt.

Also was tun? Man entprellt. Das bedeutet, Du prüfst den Bit-Zustand eines Pins an dem der Schalter hängt auf den gewünschten Schaltzustand. Wenn das gewünschte Ereignis eintritt so wartet man eine bestimmte Zeit x (meistens reichtn 10-15 ms, mit 20-25 ms bist Du auf der sichereren Seite) und man liest den Pin Wert nochmals und schaut, ob der Pegel des Pin's nun einen stationären Zustand eingenommen hat. Wenn ja so kann zu der gewünschten Funktion gesprungen und der Code abgearbeitet werden. Wenn nein so geht man davon aus, das das Eregnis nur eine Störung war und ignoriert die Eingabe.

Weiter:

Der von Dir vorgeschlagene Lösungsweg kann so funktionieren. Aber er ist nur die halbe Wahrheit bzw. nur die Hälfte des Weges zum erfolg?

WO BITTE BLEIBT DEINE ENTPRELLUNG?

Bitwait entprellt nicht! Bitwait prüft nur auf einen Zustand und macht weiter wenn der Zustand erreicht wird. In der aktuellen Implementierung wird das nur das Problem von Neuuser nicht vollständig lösen da der Taster nach wie vor prellt. Die wichtigste Routine, nämlich das Warten (25ms) und das erneute prüfen des Bits fehlt. Wenn neuuser die Lösung so fertig und komplett umsetzt wird er wieder mit springenden Werten kämpfen müssen.

Der Mega 8 läuft immerhin mit 1 MHz, bedeutet 1µs für einen Takt und viele Befehle benötigen nur einen Takt um zu arbeiten. Angenommen der Taster von Neuuser prellt nur für 1 ms dann rennt der Mega trotzdem schon mal 1000 Mal im Kreis (ideal betrachtet, lass es nur 10mal sein, das reicht) und die Variablen und Bit-Abfragen machen grad was sie wollen.

So, nun richte ich mein Wrt an Neuuser:

Die Lösung von Casio ist ein guter Grundbaustein um weiter zu machen. Aber bitte, entprellen nicht vergessen. So nach dem Schema:

- Bitwait
- warten
- Pin lesen
- vergleichen
- OK dann weiter
- NOK mache nix


Grüße,
Markus
 
Hmmmm, auch wenn ich mich langsam unbeliebt mache :date:
aber ich habe schon wieder was zum mosern :D

Hallo Markus!

Na, ist doch in Ordnung!
Genauso stelle ich mir ja auch ein Forum vor und dafür sind sie ja auch da....... zum Gedankenaustausch bzw. gegenseitiger Hilfe. :)


Sicher hat er mit BITWAIT den Taster noch lange nicht entprellt..... und deinen Ausführungen zu dem Thema muss man mal wieder nichts hinzufügen. ;)

Ich denke aber, dass Neuuser zum Einen keine Doktorarbeit verfassen möchte und zum Anderen, es ihm nicht um das eigentliche Entprellen geht..... was du so schön beschrieben hast.
Ich gehe viel mehr davon aus. dass er einfach nur ein zeitliches Problem hat....
Es liegt nun mal in der Natur des Menschen, dass er mit unterschiedlichen Geschwindigkeiten einen Taster betätigt. Damit er dieses zeitliche Problem erst einmal "ignorieren" kann, hilft ihm BITWAIT.

Wenn er auch noch das mechanische Prellen eines Tasters in den Griff bekommen möchte, ist natürlich DEBOUNCE die bessere Wahl.
Allerdings wohl erst zu einer späteren Stunde. ;)



ich will Neuuser auch nur auf die richtigen Sprünge helfen ohne ihm dabei gleich eine Komplettlösung vorzukaufen.

Hmmm.... wer hat denn Neuuser vorgeschlagen, dass er ihm vielleicht eine Musterlösung basteln möchte. ;)

Ich habe ihm auch keine Komplettlösung gegeben..... Lediglich eine Möglichkeit aufgezeigt! Komplettieren und verfeinern muss er sie schon selbst. Schließlich lernt er dadurch auch am meisten!



Sorry Casio, ist echt nicht gegen Dich gement und Du darfst es auch nicht perönlich aufnehmen,

Nein? Muss ich nicht?

Allerdings macht immer der Ton die Musik! ;)





Gruß,
Cassio !
 
Ja ja, der Ton macht die Musik :p
Und da bin ich sehr sehr froh das der Ton in unserem Forum echt sehr angenehm und toll ist !!!!!

Ich stoße beim stöbern im Web immer wieder auf andere Foren wo ich wirklich nur den Kopf schüttel kann. Mobbing ist an der Tagesordnung und die Wort- und Ton-Wahl schreibt sich von....

Bedeutet: Leute - ich bin stolz auf unser Forum!!!

Übrigens, Casio, ja, ich Hatte Neuuser eine Musterlösung versprochen. Hätte ich auch eingehalten wenn meine kleine Tochter keinen Krupp-Anfall bekommen hätte und ich die letzten zwei Nächste mehr als 2 Stunden Schlaf bekommen hätte.

Wenn Ihr unbedingt wollt und ich die Zeit finde könnte ich mich bereit erklären, unter Umständen, wenn es denn dann doch notwendig würde eine Musterlösung auszuprobieren und die ggf. dann wenn sie vielleicht tun tut hier abzubilden.

Gute Nacht,
Markus
 
und ich die letzten zwei Nächste mehr als 2 Stunden Schlaf bekommen hätte.

Hi Markus!

Scheibenkleister.......
Da waren die letzten Nächte aber verdammt kurz!
Dann wünsche ich dir jetzt schon mal eine gute Nacht.... mit hoffentlich viiiiiel Schlaf.... und das die Anfälle bei deiner Tochter bald ganz nachlassen!



Ich stoße beim stöbern im Web immer wieder auf andere Foren wo ich wirklich nur den Kopf schüttel kann. Mobbing ist an der Tagesordnung und die Wort- und Ton-Wahl schreibt sich von....

Tztztz.... wo du auch immer rumsurfst. ;)

Also mir ist das noch nicht untergekommen. :cool:


Wenn Ihr unbedingt wollt und ich die Zeit finde könnte ich mich bereit erklären, unter Umständen, wenn es denn dann doch notwendig würde

Hm... ihr?
Ich komme mit beiden Befehlen sehr gut zurecht, aber Neuuser wird sich bestimmt bedanken......
....und etliche andere stummen Leser hier. ;)

Ich habe da momentan ein gaaaaanz anderes Problem. Dafür eröffne ich aber noch einen separaten Thread. :eek:


So, bevor dies nun aber völlig off topic wird.....

Mich würde nun aber mal interessieren, wie weit Neuuser inzwischen gekommen ist. :confused:


Schönen Abend,
Cassio !
 
Hallo Markus und Cassio,
ich war nun einige Tage nicht Zeitlicht in der Lage zu antworten, hier ist ja einiges geschehen.
Nun habe ich Debounce und Bitwait hoch und runter durch, aber es war keine Verbesserung am Pind.3 zu erreichen.
Der mega soll mit 8 Mhz laufen , mit 1 Mhz sind die Faxen vom Pin noch kontrollierbar, aber unter 8 ist es nicht möglich.
Durch ein kleinen Tipp habe ich es mit einer Zeitpause nun hinbekommen und kann alle Zeiten einzeln langsam einstellen und das sieht so aus.

If Pind.3 = 0 Then 'Mit Taster 2
Incr _hour 'hochzählen
Locate 2 , 1
Lcd _hour
Waitms 100
End If

einfach aber sehr wirkungsvoll.

Gruß Neuuser
 
Hallo Neuuser,

herzlichen Glückwunsch!

Das ist der simpelste und einfachste Ansatz einer zeitlichen Entprellung :flowers:

Du kannst mal schauen ob Du wirklich 100ms benötigst, meiner Meinung nach sollten 25-50 ms bereits reichen!

Grüße,
Markus
 
ja, ich hatte mit 25 angefangen und mit 50 hat er ab und zu noch einige übersprungen, da habe ich also 100 genommen.

Gruß Neuuser
 
Hallo Neuuser!

Tja... so kann man es natürlich auch lösen. ;)
Gratuliere zum Erfolg. :wavey:


Wenn du aber tatsächlich erst bei 100ms einen Erfolg damit hast.......
Öhm.... hast du ggf. noch andere Taster in der Ecke liegen? ;)


Dann wünsch ich mal viel Spaß weiterhin!

Cassio !
 
ja ich glaube das sind nur billig teile, aber gestern hab ich noch ein Hinweis bekommen das auch Widerstände vom Schalter zum mega sein sollten.
ich meinte natürlich sind da welche, aber nach eine weile staunen bekomme ich doch mit das dort doch keine in mein Testboard integriert sind.
Das von Pollin hat welche zwischen aber das von Roland Walter nicht, das ist mir bisher auch nicht aufgefallen.
Ich denke da werde ich mal so 470ohm zwischen töten, dann ist das bestimmt besser, und kann mit niedriger wartezeit arbeiten.

gruß Neuuser
 
Hallo Neuuser!

Was soll denn das bringen, wenn du dort 470 Ohm Widerstände vorschaltest? :confused:

Der µC hat doch interne Pullup Widerstände!!!

Außerdem lässt die Geschwindigkeit deines Programmablaufes davon bestimmt nicht beeinflussen. ;)


Wie heißt aber so schön? Probieren geht über studieren. :p

Viel Spaß beim basteln !

Cassio !
 
hm, na gut also liegt es nur an der Qualität der Schalter ?

noch eine frage zum Programm ich kann feste Zeiten einstellen wann abgeschaltet und eingeschaltet werden soll, wie fange ich das an wen ich es über die Schalter einstellen möchte.

Gruß Neuuser
 
Bin auch gespannt. Ergebnisse bitte in diesem Thread den ich lerne auch noch gerne dazu :adore:
 
Hi Neuuser!

Wie meinen?

Du möchtest aus deiner Uhr, eine Schaltuhr bauen? Habe ich das so richtig verstanden?

Das Grundprinzip ist ähnlich....

Die legst dir vier Variablen an.
Dim Std_ein As Byte , Min_ein As Byte
Dim Std_aus As Byte , Min_aus As Byte


Dann musst du dein Programm erweitern, damit du die Einschaltzeit und Ausschaltzeit einstellen kannst (wie bei der Uhr).

Anschließend musst du in der Hautschleife nur noch deine Variablen mit "_hour" und "_min" vergleichen. Stimmen die Werte überein, springst du in eine Sub und.... schaltest z.B. ein Relais.

Zu bedenken wäre dabei noch.... dass du dir vielleicht einen "Merker" programmierst, damit du innerhalb der "Ein- bzw. Ausschaltminute" nicht bei jedem Durchlauf in die Sub springst und z.B. den "Relaisport" toggelst.
Allerdings ist das nicht zwingend notwendig....... je nach Programmierung.


Hast du das so gemeint?

Gruß,
Cassio !
 
so nun habe es fertig und funktioniert super, :D aber nur mit der LCD anzeige, die Darstellung der Start und endzeiten, ist bissel doof, muss ich mal sehen wie man das noch einfacher darstellen kann.

Gruß Neuuser

Code:
''Lcd An Portb , Taster Zum Stellen An Pd.0
'zum Hochzählen An Pd.3.
'über Taster, einstellen der Start und StopZeiten
'zwischen XTAL ist ein 32.xxx Uhrenquarz
'Portd.2 Relais ausgang
'###############################################################################

$regfile = "m8def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 20 * 2

Initlcd
Cursor Off
Cls

Enable Interrupts

Config Date = Mdy , Separator = /
Config Clock = Soft
Config Portd.2 = Output
Relais Alias Portd.2                                        'Ausgang
Dim Std_ein As Byte , Min_ein As Byte
Dim Std_aus As Byte , Min_aus As Byte


Portd.0 = 1                                                 'Taster1, Zeit/Datum stellen, PullUp ein, schaltet gegen Minus
Portd.3 = 1                                                 'Taster2,  Zahl hochzählen, PullUp ein, schaltet gegen Minus
Portd.2 = 0                                                 'Relais

Time$ = "10:10:00"                                          'Setzen auf Startwert

Do
   Locate 1 , 1
   Lcd Time$                                                'Zeige Zeit in Zeile1
   Locate 2 , 1
   Lcd "AN" ; Std_ein ; ":" ; Min_ein ; "AUS" ; Std_aus ; ":" ; Min_aus       ' Anzeige An und aus zeiten



   If Pind.0 = 0 Then Gosub Time                            'wiederhole Anzeige bis Taster 1 zum Stellen gedrückt, springe nach Sub "Time"

'#########  schaltzeiten #######################################################

 If _hour = Std_ein And _min = Min_ein Then Relais = 1      'Einschaltzeit
 If _hour = Std_aus And _min = Min_aus Then Relais = 0      'Ausschaltzeit

'######### LCD Anzeige #########################################################
 If Relais = 1 Then
 Locate 1 , 18
 Lcd "AN_"
 'Locate 2 , 12
 'Lcd " -10:00-"

 Else
 End If

 If Relais = 0 Then
 Locate 1 , 18
 Lcd "AUS"
 'Locate 2 , 12
 'Lcd " -20:00-"

 Else
 End If

Loop
End

'Stunde#########################################################################

Time:
Waitms 200
Cls                                                         'lösche Zeilen
Do
Locate 1 , 1
Lcd "Set Hour:"                                             'Stunden setzen
Locate 2 , 1
Lcd _hour
         If Pind.3 = 0 Then                                 'Mit Taster 2
           Incr _hour                                       'hochzählen
           Locate 2 , 1
           Lcd _hour
           Waitms 100
         End If
If _hour > 23 Then                                          'Zählt bis Max, danach wieder ab 0
Cls
_hour = 00
End If                                                      'solange, bis Taster 1 gedrückt
Loop Until Pind.0 = 0
Waitms 200

'Minute#########################################################################
Cls
Do
Locate 1 , 1
Lcd "Set Minute:"
Locate 2 , 1
Lcd _min
         If Pind.3 = 0 Then
           Incr _min
           Locate 2 , 1
           Lcd _min
           Waitms 100
         End If
If _min > 59 Then
Cls
_min = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls

'Stunden ein####################################################################
Cls
Do
Locate 1 , 1
Lcd "Std_ein:"
Locate 2 , 1
Lcd Std_ein
         If Pind.3 = 0 Then
           Incr Std_ein
           Locate 2 , 1
           Lcd Std_ein
           Waitms 100
         End If
If Std_ein > 23 Then
Cls
Std_ein = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls

'Min ein########################################################################
Cls
Do
Locate 1 , 1
Lcd "Min_ein :"
Locate 2 , 1
Lcd Min_ein
         If Pind.3 = 0 Then
           Incr Min_ein
           Locate 2 , 1
           Lcd Min_ein
           Waitms 100
         End If
If Min_ein > 59 Then
Cls
Min_ein = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls

'Stunden Aus####################################################################
Cls
Do
Locate 1 , 1
Lcd "Std_aus :"
Locate 2 , 1
Lcd Std_aus
         If Pind.3 = 0 Then
           Incr Std_aus
           Locate 2 , 1
           Lcd Std_aus
           Waitms 100
         End If
If Std_aus > 23 Then
Cls
Std_aus = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls

'Minuten Aus####################################################################
Cls
Do
Locate 1 , 1
Lcd "Min_aus :"
Locate 2 , 1
Lcd Min_aus
         If Pind.3 = 0 Then
           Incr Min_aus
           Locate 2 , 1
           Lcd Min_aus
           Waitms 100
         End If
If Min_aus > 59 Then
Cls
Min_aus = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls


_sec = 00                                                   'Springe Nach Setzen Von Zeit / Datum Wieder Zurueck


Return
End
 
Hallo !

Na also... es wird doch!

Das Prinzip hast du schon mal verstanden.
In laufe der Zeit, wird dein Code dann auch immer kürzer und effektiver..... und "betriebssicherer". ;)

Wenn du ein fertiges Programm hast, dann nimm es als Vorlage und spiel damit ein wenig rum. Probiere deine Hauptschleife sp kurz wie möglich zu halten und lagere alles in Subroutinen aus, die nicht ständig benötigt werden.

Selbst wenn du die Subs "ineinander" verpackst, um einen wiederholten Code nicht ständig wieder schreiben zu müssen, erspart es dir nicht nur Arbeit, sondern sorgt auch für Platz im Speicher. ;)


Es ist eben noch kein Meister vom Himmel gefallen und deine ersten Gehversuche hast du nun schon mal erfolgreich vollbracht.

Wenn du so weiter machst, wirst du in einem Jahr auch verstehen, warum wir jetzt manchmal ein wenig über deine Codezeilen schmunzeln. ;)

Letztlich ist das aber nicht wichtig.... Die Hauptsache ist, du hast Spaß dabei und lernst immer etwas dazu.


Viel Spaß weiterhin,

Cassio !
 
ja macht Spaß, da geht es auch gleich weiter, wo finde ich was das ich mir mal anschauen kann, wie der Aufbau zur Ansteuerung einer7-Segment Anzeigen so aus sieht.

Gruß Neuuser
 
Hi Neuuser!

Hui... nun mal langsam mit den jungen Pferden!
Ein LCD-Display dazu zu bewegen, die richtigen Zahlen und Wörter anzuzeigen ist wesentlich einfacher, als eine Siebensegmentanzeige anzusteuern.

Dafür fehlt dir momentan einfach noch zu viel Grundwissen.

Hm, ich überlege gerade, was du als nächstes mal ausprobieren könntest... was dich dann auch bei den LED-Anzeigen weiterbringt.

Ach ja....
Versuch doch erst mal, den Wochentag deines Datums zu bestimmen und auch in Klartext im Display anzeigen zu lassen.
Wenn das problemlos klappt und du verstanden hast wie das funktioniert, dann ist es bis zur LED-Siebensegmentanzeige nicht mehr soooo weit. ;)


Ich wünsche dir viel Spaß, beim tüfteln an den Wochentagen.

Cassio !
 
Hm,das Datum an meiner Zeituhr hab ich komplett rausgenommen, weil ich es nicht brauche.
Das hindert ja nicht das aber zu machen, aber ! wen man an einer Sache Rumwerken würde was man eigentlich nicht wirklich brauch,t ist es schwierig dazu Interesse zu zeigen und Elan ein zu bringen. :(.
Ist ja bestimmt gut gemeint, aber hast du nicht ein Programm wo ich mir das mal anschauen kann, mit 7-Segmentansteuerung.

Gruß Neuuser
 
Hallo !

Wegen der Entprellung ein kleiner Tip ;)

Ich hab da bei meinen Programmen (Assembler) auch immer nicht ganz so
befriedigende Ergebnisse gehabt. Da hab ich mal in nem anderen Schaltplan
gestöbert ...

GND -------Taster-----o-----6,8k||100nF----- +5V

Also der Taster war mit GND verbunden. Der Andere Pin natürlich am Port
des uC (das o in der Zeile) und zu +5V nen Pullup-R und parallel nen 100nF
Kondensator. Den Pullup kann man sich sparen, wenn man den internen
verwendet. Aber der Kondensator bewirkt Wunder - auch bei meinem
Encoder für die Eingabe :D Mit dem kleinen Bauteil hab ich ne Menge
Code und Probleme gespart :D
Der Kondensator frißt mir die ganzen Spikes vom Kontaktprellen weg.
Den kleinen Rest bekomme ich über ne normale Entprellung hin. Da stören
auch etwas schlechtere Schalter nicht mehr. Evtl kann man den Kondensator
auch noch auf 10nF verkleinern - hab ich aber noch nicht getestet.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)