PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine Frage zu einer Schleife



White_Fox
08.01.2016, 21:26
Hallo

Eine Frage zu dem kleinen Codeschnipsel hier:
Port A ist als Eingang, Port B als Ausgang geschaltet. Jeder Pin von Port B ist mit einer LED bestückt. An Port A hängen zwei Taster. Wird ein Taster gedrückt, springt das Programm in die jeweilige s-Schleife, schreibt 0xFF in das Pin-Register und wartet, bis der Taster wieder losgelassen wird.


l0:
sbis PinA, 0
rjmp l1
rjmp s0
l1:
sbis PinA, 1
rjmp l0
rjmp s2


;Schleife Taster 1
s0:
ldi R16, 0xFF
out PINB, R16
s1:
sbic PinA, 0
rjmp s1
rjmp l0


;Schleife Taster 2
s2:

ldi R16, 0xFF
out PINB, R16
s3:
sbic PinA, 1
rjmp s3
rjmp l0

Laut Datenblatt soll das Schreiben einer 1 ins Pin-Register zur Folge haben, das der jeweilige Pin getoggelt wird. Dies funktioniert in diesem Programm auch, wenn ich vor dem geposteten Codeschnipsel ein Bitmuster auf den LEDs anzeigen lasse, wird es jedesmal brav invertiert.

Was mich aber wundert:
Ich kann eine Schleife nicht zweimal hintereinander ausführen. Wenn ich einen von beiden Tastern drücke, wird das Bitmuster invertiert-so weit, so gut. Wenn ich denselben Taster aber noch einmal drücke, passiert nichts. Ich muß erst den anderen Taster drücken, damit das Bitmuster wieder invertiert wird. Und dann ist es wieder dasselbe, auf nochmaliges Drücken des zweiten Tasters kommt keine Reaktion.
Beide Tasterschleifen führen diesselbe Aktion aus. Es muß auch jedesmal zum Ausgang l0 zurückgesprungen werden, sonst würde der andere Taster nicht ansprechen.

Warum wird ein Taster aber nicht zweimal hintereinander ausgewertet?

Searcher
09.01.2016, 11:49
Hallo,
ich behaupte mal, daß das Problem nicht im geposteten Codeschnipsel liegt. Welcher µC? Welcher Assembler? Wie sind die Tasten am µC angeschlossen? Kurze Skizze mit Pulldowns? wäre hilfreich.

Gruß
Searcher

EDIT. Der Codeschnipsel funktioniert, wenn ein Taster bei Betätigung ein HIGH auf den Eingang legt. Wenn er ein LOW anlegt, scheint mir Dein beschriebenes Verhalten aufzutreten.

i_make_it
09.01.2016, 13:12
Die Befehle sind soweit ich das sehe Amtel AVR.

http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SBIS.html
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SBIC.html
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RJMP.html
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_LDI.html
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_OUT.html



l0:
sbis PinA, 0 ;wenn gesetzt springe zu s0 (überspringe Jump l1)
rjmp l1
rjmp s0
l1:
sbis PinA, 1 ;wenn gesetzt springe zu s2 (überspringe Jump l0)
rjmp l0
rjmp s2


;Schleife Taster 1
s0:
ldi R16, 0xFF
out PINB, R16
s1:
sbic PinA, 0 ;wenn zurückgesetzt springe zu l0 (überspringe jump s1 - was eine Warteschleife ist solange der Taster gedrückt ist)
rjmp s1
rjmp l0


;Schleife Taster 2
s2:

ldi R16, 0xFF
out PINB, R16
s3:
sbic PinA, 1 ;wenn zurückgesetzt springe zu l0 (überspringe jump s3 - was eine Warteschleife ist solange der Taster gedrückt ist)
rjmp s3
rjmp l0


ich würde zum Testen mal zwichen:
ldi R16, 0xFF
und
out PINB, R16
eine Zählschleife oder andere Manipulation des Registerwertes einbauen, um zu sehen ob da nicht doch bei jedem Tastendruck was passiert.
Beim schnellen durchsehen kommt mir der Code von der Logik auch korrekt vor.
Weshalb ich auch nicht mehr sagen kann als anstelle der orginal Sequenzen s0: und s2: halt einen testcode zu nehmen.
(eventuell reicht ein LSL und LSR oder ROL/ROR, je nach Bitmuster)
Die Sprunglogik scheint zu funktionieren.
Wenn tatsächlich die Schalter gegen Vss schalten und nicht gegen GND sollte es von der Sprunglogik her richtig sein.

White_Fox
09.01.2016, 18:31
Oh Mann...Danke Searcher, dein Gedanke war der Richtige.

Ich hab die Taster tatsächlich gegen GND schalten lassen-und diesen Umstand vergessen. :(
Das kommt davon, wenn zwischen Hardwarebau und Programmierung viele Monate liegen.

Ach ja...es ist natürlich ein AVR gewesen (ATMega644PA, um genau zu sein), und der entsprechende Assembler aus AVR-Studio 4.

Searcher
09.01.2016, 20:51
http://www.smiliesuche.de/smileys/grinsende/grinsende-smilies-0016.gif (http://www.smiliesuche.de/daumen-hoch/)