PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was ist hier falsch?



Foooob
01.06.2005, 20:22
Hallo

Ich habe für meinen Mega 8 folgendes Programm geschrieben




$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

PicNick
02.06.2005, 09:23
Kollege, du hast die Sub's mitten in die DO..LOOP Schleife reingeschrieben. Das bringt Unglück.
Darf ich dir eine andere Reihenfolge empfehlen


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

PicNick
02.06.2005, 14:22
Aha. Du sagst, du hast keine Taster angeschlossen. Dann mußt du aber die Pins mit Pullup auf +5V legen. Ist das so ?

BlueNature
02.06.2005, 15:12
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).



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

PicNick
02.06.2005, 16:10
Du, ich werd mal den "debounce" genau analysieren, dann weiß ich mehr.
Ist der Effekt bei allen drei Tasten ?

PicNick
02.06.2005, 16:58
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

Foooob
04.06.2005, 14:08
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 :)