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. ...
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.