Forum: Mikrocontroller und Digitale Elektronik Anfänger hat ein probelm mit dem sbis Befehl


von David (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von david (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von david (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.