Forum: Mikrocontroller und Digitale Elektronik STK500 ASM Problem


von Sentcool (Gast)


Lesenswert?

ich bin ein anfänger in sachen mikrocontroller und asm, ich würde gerne 
bei dem drücken von taster eins die led1 einschalten, und durch erneutes 
drücken des tasters die led wieder ausschalten.

das einschalten funktioniert, doch das ausschalten nicht.. das problem 
liegt am SBIS befehl, der scheint irgendwie nich zu funktionieren, weis 
sjemand wieso?


hier mein source:

Ich habe auf meinem board ein ATMEGA8515L

.include "8515def.inc"

ldi r16, 0xFF
out DDRB, r16       ; Port B ist Ausgang

ldi r16, 0x00
out DDRD, r16       ; Port D ist Eingang


ldi r16, 0xFF
out PORTB, r16      ; PORTB auf 0xFF setzen -> alle LEDs aus

loop: sbic PIND, 0        ; "skip if bit cleared",
                             nächsten Befehl  überspringen,
                             ; wenn Bit 0 im IO-Register
                             PIND =0 (Taste 0 gedrückt)

rjmp loop                 ; Sprung zu "loop:" -> Endlosschleife


cbi PORTB, 0              ; Bit 0 im IO-Register
                            PORTB auf 0 setzen -> 1. LED an

loop3:   sbis PIND, 0     ;warten bis taster losgelassen wird.

rjmp loop3

loop2:   sbic PIND, 0     ;warten bis taster erneut gedrückt wird

rjmp loop2

out PORTB, r16            ; leds ausschalten

ende:    rjmp loop        ; zurück zum loop


sorry, falls die formatierung nicht so gut is

von Paul Baumann (Gast)


Lesenswert?

Ich bin nicht der Assemblermann, aber es sieht mir so aus, als ob 
PIND.0
nur nach dem Initialisieren "1" ist und wenn die Taste dann gedrückt 
wurde
"0" wird, aber nie wieder 1 erreicht. Dadurch "denkt" das SBIC in der 
Loop2
, es wäre nicht gemeint.

Für diese Angaben übernehmen wir kein GEWEHR!
;-)

MfG Paul

von Martin A. (Firma: Siemens AG) (kazuki)


Lesenswert?

die taster werden warscheinlich prellen, damit wird das verhalten nicht 
berechenbar

von Sentcool (Gast)


Lesenswert?

das selbe hab ich mir auch schon gedacht, aber wie kann ich mein projekt 
dann realisieren? :) ... es muss doch eine möglichkeit geben den status 
der taster abzufragen in beide richtungen...

oder kennt ihr vll. eine ausweichende methode? ... p.s. wozu ist der 
befehl SBIS dann sonst gut? denn den kann man ja nur auf IO Register 
anwenden.

von Otto (Gast)


Lesenswert?

so macht man das auch nicht - der Controller "hängt" dann in Deinen 
Warteschleifen und kann nichts anderes erledigen.

1. Port abfragen, ob Taste betätigt (SBIC)
2. Zustand eines Bits eines Registers abfragen
3. wenn "0" -> LED ein und Bit im Register setzen ("1")
4. wenn "1" -> LED aus und Bit im Register löschen ("0")
5. warten bis Taster wieder losgelassen (SBIS)

Dann muß der Controller nur bei Tastenbetätigung warten.

Otto

von Sentcool (Gast)


Lesenswert?

ähm ok, und für die ganz dummen in diesem forum, wie sähre das jetzt in 
asm aus?

von Otto (Gast)


Lesenswert?

sieh mal ins Tutorium:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

da sind einige Beispiele, welche Du versuchen kannst....

von Sentcool (Gast)


Lesenswert?

danke, da werd ich mich doch gleich mal durcharbeiten.

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.