-
Was ist hier falsch?
Hallo
Ich habe für meinen Mega 8 folgendes Programm geschrieben
Code:
$regfile = "m8def.dat" 'ATmega8
$crystal = 3686411 'Quarz: 3686411 Hz
Declare Sub Tasterlinks
Declare Sub Tasterrechts
Declare Sub Anhalten
Ddrd = &B11110000 'Pin PD4 bis PD7 als Ausgänge
Ddrb = &B00000000
Portd.2 = 1 'Taser 1
Portd.3 = 1 'Taster 2
Portb.0 = 1 'Taster 3
Do
Portd.4 = 1 'Motoren drehen in gleiche Richtung
Portd.5 = 0
Portd.6 = 1
Portd.7 = 0
Debounce Pind.2 , 0 , Tasterlinks , Sub 'Taster 1
Sub Tasterlinks
Portd.4 = 0
Portd.6 = 0
Portd.5 = 1
Portd.7 = 1
Waitms 1500
Portd.4 = 1
Portd.7 = 1
Portd.6 = 0
Portd.5 = 0
Waitms 2000
End Sub
Debounce Pind.3 , 0 , Tasterrechts , Sub 'Taster 2
Sub Tasterrechts
Portd.4 = 0
Portd.6 = 0
Portd.5 = 1
Portd.7 = 1
Waitms 1500
Portd.4 = 0
Portd.7 = 0
Portd.6 = 1
Portd.5 = 1
Waitms 2000
End Sub
Debounce Pinb.0 , 0 , Anhalten , Sub 'Taster 3
Sub Anhalten
Portd.4 = 0
Portd.5 = 0
Portd.6 = 0
Portd.7 = 0
Waitms 20000
End Sub
Loop
End
Bei den Tastern handelt es sich um Schließer. Sie liegen jeweils zwischen dem Mega8 und Masse
Wenn ich das Programm aber auf meinen Mega8 überspiele benimmt er sich ziemlich komisch, ich habe ihn noch nicht an die Motoren angeschlossen sondern nur mit dem Messgerät die Spannung an den Outputs für die Motoren abgegriffen.
Der AVR schaltet hier ständig zwischen 0V und 12V (Maximalspannung) hin und her. Ich schätze mal er geht den Befehler für die Taster nach, die aber nicht angeschlossen sind und er das deswegen gar nicht sollte...was ist hier denn falsch? :-s
-
Kollege, du hast die Sub's mitten in die DO..LOOP Schleife reingeschrieben. Das bringt Unglück.
Darf ich dir eine andere Reihenfolge empfehlen
Code:
Do
Portd.4 = 1 'Motoren drehen in gleiche Richtung
Portd.5 = 0
Portd.6 = 1
Portd.7 = 0
Debounce Pind.2 , 0 , Tasterlinks , Sub 'Taster 1
Debounce Pind.3 , 0 , Tasterrechts , Sub 'Taster 2
Debounce Pinb.0 , 0 , Anhalten , Sub 'Taster 3
Loop
End
'--------------------------- SUB -------------------------------------
Sub Tasterlinks
Portd.4 = 0
Portd.6 = 0
Portd.5 = 1
Portd.7 = 1
Waitms 1500
Portd.4 = 1
Portd.7 = 1
Portd.6 = 0
Portd.5 = 0
Waitms 2000
End Sub
'--------------------------- SUB -------------------------------------
Sub Tasterrechts
Portd.4 = 0
Portd.6 = 0
Portd.5 = 1
Portd.7 = 1
Waitms 1500
Portd.4 = 0
Portd.7 = 0
Portd.6 = 1
Portd.5 = 1
Waitms 2000
End Sub
'--------------------------- SUB -------------------------------------
Sub Anhalten
Portd.4 = 0
Portd.5 = 0
Portd.6 = 0
Portd.7 = 0
Waitms 20000
End Sub
-
Aha. Du sagst, du hast keine Taster angeschlossen. Dann mußt du aber die Pins mit Pullup auf +5V legen. Ist das so ?
-
Das mit dem PullUp's passt schon soweit. Die internen PullUp's sind aktiviert. Damit genügt ein Taster genen GND um Low-Aktiv zu schalten (gedrückt = 0, losgelassen, Ruhestellung = 1).
Code:
Ddrd = &B11110000 'Pin PD4 bis PD7 als Ausgänge
...
Portb.0 = 1 'Taster 3
Portd.2 = 1 'Taser 1
Portd.3 = 1 'Taster 2
Nach dem Code sind die Pins PD0, PD2 und PD3 intern auf High gelegt mit dem internen Widerstand.
DDR = 0
PORT = 1
ist immer interner PullUp
DDR = 0
PORT = 0
ist immer ohne internen PullUp
Grüße Wolfgang
-
Du, ich werd mal den "debounce" genau analysieren, dann weiß ich mehr.
Ist der Effekt bei allen drei Tasten ?
-
Also, ich seh' so keinen Fehler.
Für ihn sind die Pins ganz einfach auf LOW
Müßt' nochmal in der M8 Doku lesen., ob's mit Pullup was besonderes gibt.
Setz' sie zu Testen mal extern auf high
-
Hallo
Ja es funktionert so, dass ein gedrückter Taster 0 ist, ein nicht angeschlossener/nicht gedrückter Taster auf 1 ist. So stand es auch in meinem Buch, das habe ich direkt so übernommen.
Der Fehler lag darin dass ich die Subs in die DoLoop Schleife gesetzt habe.
Danke für die Hilfe :)