Hallo Leute,
ich habe vor nicht all zu langer zeit angefangen mich mit dem
atmga8l-8pu zu beschäftigen. Also genau genommen diese woche. Ich hab
auch schon ein paar programme in Assembler geschreiben die so weit
laufen. Jetzt hab ich ein problem mit dem sbis Befehl. Das Brogramm soll
volgendes machen: Wenn Taster 1 gedrückt led 1 an, wenn Taste 2 gedrückt
led 2 an, wenn beide Taster gedrückt dann led 3 an. mein Programm sieht
wie volgt aus:
;-----------------------------------------------------------------------
-
mainloop: wdr
sbis PIND,2
rjmp nein ;taste 1 nicht gedrückt
sbis PIND,3 ;Taste 1 gedrückt, Taste 2 gedrückt?
rjmp LED1 ;Taste 1 ja, Taste 2 nein
out PORTB,0b00000100 ;Taste 1 ja, Taste 2 Ja
rjmp mainloop
nein: sbis PIND,3 ;Taste 1 nein, Taste 2 gertückt?
rjmp mainloop ;Taste 1 nein, Taste 2 nein
out PORTB,0b00000010 ;Taste 1 nein, Taste2 ja
rjmp mainloop
LED1: out PORTB,0b00000001 ;Taste 1 ja, Taste 2 nein
rjmp mainloop
;-----------------------------------------------------------------------
--
das ergebnis ist volgendes: wenn keine taste gedrückt dann leuchten alle
led´s wenn taste 1 gerückt geht led 2 aus wenn taste 2 gedrückt geht led
1 und 2 aus und wenn beide gedrückt sind gehen auch led 1 und 2 aus.
kann mir einer von euch vieleicht helfen?
bielen dank schon mal im vorraus
david
David wrote:
> Hallo Leute,> ich habe vor nicht all zu langer zeit angefangen mich mit dem> atmga8l-8pu zu beschäftigen. Also genau genommen diese woche. Ich hab> auch schon ein paar programme in Assembler geschreiben die so weit> laufen. Jetzt hab ich ein problem mit dem sbis Befehl. Das Brogramm soll> volgendes machen: Wenn Taster 1 gedrückt led 1 an, wenn Taste 2 gedrückt> led 2 an, wenn beide Taster gedrückt dann led 3 an. mein Programm sieht> wie volgt aus:
So wird das nix, das stimmt logisch nicht und lässt sich sicherlich auch
nicht assemblieren, da es syntaktisch nicht stimmt...
>> ;----------------------------------------------------------------------- -> mainloop: wdr>> sbis PIND,2> rjmp nein ;taste 1 nicht gedrückt
vermutlich logisch falsch...
Ich gehe davon aus, dass die Taster gegen GND schaslten und die internen
PullUp-Widerstände aktiviert sind und bei offenen Tastern für H-Pegel
sorgen.
sbis pind,2 ;überspringt den nächsten Befehl, wenn die Taste nicht
;gedrückt ist, also H-Pegel anliegt.
>> sbis PIND,3 ;Taste 1 gedrückt, Taste 2 gedrückt?> rjmp LED1 ;Taste 1 ja, Taste 2 nein>> out PORTB,0b00000100 ;Taste 1 ja, Taste 2 Ja
Das geht nicht! Du kannst keine Konstante an einen Port ausgeben. Da
müsste auch der Assembler einen Fehler melden. Um den Wert 4 an Portb
auszugeben könntest Du schreiben:
ldi r16,4 ;(oder ldi r16,0b00000100)
out portb,r16
> rjmp mainloop>> nein: sbis PIND,3 ;Taste 1 nein, Taste 2 gertückt?> rjmp mainloop ;Taste 1 nein, Taste 2 nein>> out PORTB,0b00000010 ;Taste 1 nein, Taste2 ja
Das geht nicht, siehe oben...
> rjmp mainloop>> LED1: out PORTB,0b00000001 ;Taste 1 ja, Taste 2 nein
Das geht nicht, siehe oben...
> rjmp mainloop> ;----------------------------------------------------------------------- --
Logisch korrekt ginge Folgendes:
mainloop:
sbis pind,0 ;ist Taste 1 (an PD0) gedrückt? - nein, skip...
cbi portb,0 ;ja, LED an PB0 ausschalten
sbis pind,1 ;ist Taste 2 (an PD1) gedrückt? - nein, skip...
sbi portb,0 ;ja, LED an PB0 einschalten
rjmp mainloop ;nochmal...
Das ist aber nicht der Stein der Weisen, daher solltest Du Dir mal das
hiesige AVR-Tutorial ansehen und durcharbeiten, bei Abfrage von Tastern
ist besonders das Kapitel über Entprellung interessant.
>> das ergebnis ist volgendes: wenn keine taste gedrückt dann leuchten alle> led´s wenn taste 1 gerückt geht led 2 aus wenn taste 2 gedrückt geht led> 1 und 2 aus und wenn beide gedrückt sind gehen auch led 1 und 2 aus.>> kann mir einer von euch vieleicht helfen?>> bielen dank schon mal im vorraus>> david
...
Ja danke erst mal. ich werd mich dann wohln noch mal mit dem Tutorial
bescheftigen.
Was meintest du denn mit:
> So wird das nix, das stimmt logisch nicht und lässt sich sicherlich auch> nicht assemblieren, da es syntaktisch nicht stimmt...
das programm ist eingentlich eine oder/und verknüpfung taste 1 oder
taste 2 oder taste 1 und taste 2. ich denke das sollte funktionierren.
das mit den tastern stimmt der pullup-Wiederstand ist sktiviert und die
taster ziehen auf gnd runter wenn sie gedrückt sind.
> out PORTB,0b00000100 ;Taste 1 ja, Taste 2 Ja
gibt keine konstante aus sonder gibt jedem einezelnen pin von port b an
welchen zustand er haben soll also hig oder low. Hier wäre es dann PIN2
hig der rest low.
Aus deiner mainloop werd ich noch nicht schlau.
wer weiß vileicht ja nach dem Tutorial.
also noch mal danke und bis dann david
david wrote:
> Was meintest du denn mit:>>> So wird das nix, das stimmt logisch nicht und lässt sich sicherlich auch>> nicht assemblieren, da es syntaktisch nicht stimmt...
Das heißt, dass der Assembler Fehlermeldungen ausgeben müsste, weil die
Syntax falsch ist.
>> out PORTB,0b00000100 ;Taste 1 ja, Taste 2 Ja>> gibt keine konstante aus sonder gibt jedem einezelnen pin von port b an> welchen zustand er haben soll also hig oder low. Hier wäre es dann PIN2> hig der rest low.
0b00000100 ist eine Konstante, und die kannst Du nicht direkt mit
out ausgeben! out gibt einen Wert in einem Rechenregister an ein
I/O-Register aus. Der Wert muss erst (z.B. mit ldi ) in ein
Rechenregister geschrieben werden.
ok das mag sein das ich das so eigneltich nicht machen können sollte.
Aber bis jetzt bin ich damit immer ganz gut hingekommen und mein
assembler beschwert sich auch bei dem programm nicht.
er übersetzt und brennt ohne zu mucken.
ich benutze myAVR_Workpad in der demo version.
david wrote:
> ich benutze myAVR_Workpad in der demo version.
Cool, das ist ja ein Assembler, der Dinge assembliert, die der AVR gar
nicht kann.
Ich nutze AVR-Studio in der (kostenlosen) Vollversion, das ist von ATMEL
(also vom Hersteller der AVRs), macht eine gute Syntaxprüfung und hat
auch einen recht brauchbaren Simulator, der besonders für Anfänger (aber
nicht nur) recht hilfreich ist.
Achja, schicke mein Programm (oben) mal durch den Simulator, vielleicht
verstehst Du es ja dann. Es schaltet mit Taste 1 eine LED aus, die mit
Taste 2 eingeschaltet werden kann. Es dient erstmal nur zur Erklärung
des Befehls SBIS und hat eigentlich keinen praktischen Nährwert, da man
sooooo nicht programmiert.
...