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
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
die taster werden warscheinlich prellen, damit wird das verhalten nicht berechenbar
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.
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
ähm ok, und für die ganz dummen in diesem forum, wie sähre das jetzt in asm aus?
sieh mal ins Tutorium: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten da sind einige Beispiele, welche Du versuchen kannst....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.