Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage Pins mit Debounce merkwürdig
autoguider
16.09.2007, 23:06
Hallo zusammen,
ich programmiere mit der BASCOM Demo auf einem ATMEGA8.
In der Init Routine möchte ich einen Taster abfragen und je nach Ergebnis einen Initialwert verändern. Veränderung des Wertes wenn TAste 5 s gedrückt.
Der Pin am Prozessor ist mittels einen 33k Widerstands auf +5V gelegt. Durch Drücken der Taste wird der Pin auf 0-Potential gezogen.
Obwohl keine Taste gedrückt wurde verzweigt der nachfolgende Debounce Befehl auf die Routine welche eim Drücken der Taste ablaufen soll.
Nach meiner Ansicht müsste der Pin auf High liegen und deshalb der befel der auf den Debounce Befehl folgt ausgeführt werden.
Wo ist der Fehler ?
Hier ein Code Ausschnitt:
' Definition der Taste
Config Portd.7 = Input
Taste_1 Alias Portd.7
.
Init()
Config Debounce = 5000 ' 5s gedrückt wechselt Grunddrehrichtung
Debounce Taste_1 , 0 , Change_hard_direction , Sub
Config Debounce = 25
.
.
Change_hard_direction:
Direction = Hard_direction
Print "In Hard"
If Direction = 1 Then
Direction = 0
Else : If Direction = 0 Then Direction = 1
End If
return
Ich kann mir das Verhalten nicht erklären und bitte deshalb um Hilfe
beste Grüsse
Christian
stefan_Z
17.09.2007, 00:39
5 Sekunden ist vielleicht zu lang gewählt? Ich könnte mir vorstellen, dass das eine Byte-Variable ist. Also wäre 255 das Maximum.
Debounce einfach manuell:
Falls das Programm gleichzeitig eh nix machen soll, Frage den Wert ab, warte 5 Sekunden und frage nochmal ab. Wenn Wert A und B gleich sind, dann gilt die Taste als gedrückt.
Eleganter ist bestimmt, einen Timer mit Interrupt zu verwenden... der fragt den Taster ab und springt alle X Millisekunden in eine Sub, die den Taster erneut abfragt und bei positivem Ergebnis einen Zähler erhöht, dann nach 5 Sekunden das Ereignis auslöst.
Außerdem würde ich die Variable DIRECTION einfach als Bit dimensionieren und mit TOGGLE umschalten - spart CPU-Power und Codespace.
als Bit dimensionieren ....spart CPU-Power und Codespace.
Vorsicht, das stimmt nicht ! Bascom arbeitet immer über das T-Bit, das erhöht die Befehlszahl unangenehm
Schau dir mal den generierten Code an.
Das Kürzeste an Code / CPU ist ein einzelnes Byte und ggf. selbst Bits ein- und ausmaskieren
autoguider
17.09.2007, 09:47
Ich habe jetzt vor dem DEBOUNCE den Pin abgefragt und mir dann eine Meldung auf die serielle Schnittstelle geschickt.
If Taste_1 = 0 Then Print "low"
Trotz externem Pull-Up Widerstand wurde mir LOW geschickt !!!!
Ist da noch etwas zu konfigurieren ?
mfg
Christian
stefan_Z
17.09.2007, 09:52
Worauf hast du den DEBOUNCE gesetzt? Weniger als 255?
Config Portd.7 = Input
Ich galub, das muß heissen
Config Pind.7 = Input
MeckPommER
17.09.2007, 10:27
Das mit Direction mache ich immer gerne kurz und knapp wie folgt, wenn es wie in diesem Fall zwischen 0 und 1 toggeln soll. man kann es natürlich auch an andere Wechsel anpassen:
direction = 1 - direction
Das mit port und pin ist wirklich manchmal recht fehlerträchtig, so sollte es gehen:
Config Portd.7 = Input ' beim configurieren ists noch der port
Taste_1 Alias Pind.7 ' damit im programm der alias richtig ersetzt wird, muss hier pin stehen
Gruß MeckPommER
P.S.: warum einen externem Pull-Up, wenn ein interner vorhanden ist, der nur "angeschaltet" werden muss?
Panzer4000
17.09.2007, 12:52
Hallo autoguider !
Wo ist der Fehler ?
Da ist kein Fehler.
Der Debounce Befehl den Du prog. hast sagt doch folgendes aus:
Wenn Portd.7 auf low geht,führt Subroutine ( hier) Change_hard_direktion aus.
Portd.7 muss auf high gehen, bevor der Sprung in die Subroutine ausgeführt werden kann.
Zum Label Change_hard_direktion , wenn Portd.7 auf low ist.
Hier ein Code Ausschnitt:
' Definition der Taste
Config Portd.7 = Input
Taste_1 Alias Portd.7
.
Init()
Config Debounce = 5000 ' 5s gedrückt wechselt Grunddrehrichtung
Debounce Taste_1 , 0 , Change_hard_direction , Sub
Config Debounce = 25
.
.
Change_hard_direction:
Direction = Hard_direction
Print "In Hard"
If Direction = 1 Then
Direction = 0
Else : If Direction = 0 Then Direction = 1
End If
return
ich hoffe dir das richtig verständlich erklärt zu haben.
MfG
Config PORTx
Taste alias PINx.y !!!
da es ja Debounce PINx.y und nicht Portx.y heißt.
roboterheld
21.09.2007, 08:21
.....Config Portd.7 = Input .....
so etwas geht in bascom nicht!
es heisst "pind.0" bis "pind.7" für einzelne belegungen oder "portb" für den gesamten port.
lest mal die hilfe von bascom und das datenblatt vom atmega.
Ja,
hast natürlich recht.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.