PDA

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.

PicNick
17.09.2007, 07:03
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?

PicNick
17.09.2007, 09:54
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

repi64
20.09.2007, 22:42
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.

repi64
22.09.2007, 12:35
Ja,
hast natürlich recht.