STK500 ASM Problem

Gast #1014572
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
Gast #1014606
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
Gast #1014615
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.
Gast #1014627
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.