Hallo, ich mache gerade meine ersten Gehversuche mit dem Atmega8 und wollte mit assembler ein Lauflicht realisieren (wie knight rider). Ich habe den Befehl LSL verwendet. Bin richtig der Annahme das wenn ich den Wert 1 in ein register lade und einmal links shifte, dass ich dann den Wert 2 in diesem Register habe (dann 4,8,16...)? Gruß Marcus
Ja, stimmt ! Aber du mußt immer auch das Carry-Flag beachten, daß wird nämlich bei LSL mitgeschoben.
Sorry, ich habe Schrott geschrieben. Das Carry wird nut bei ROL mitgeschoben, bei LSL wandert lediglich Bit 7 ins Carry.
Danke für die Antwort, ich habe aber jetzt ein anderes Problem. Die LED's leuchten jetzt schön der Reihe nach auf aber nicht so wie ich es wollte. Ich wollte das jeweils immer nur eins an ist, aber jetzt bleiben die an die angesprochen wurden. Hier unten mal mein Programm, vielleicht stell ich mir das Bitweise verschieben auch falsch vor. Kann mir jemand sagen was mein Fehler ist? .include "m8def.inc" ;Definitionsdatei einbinden, ggf. durch ;2333def.inc ersetzen ldi r16, 0xFF ;0xFF ins Arbeitsregister r16 laden out DDRB, r16 ;Inhalt von r16 ins IO-Register DDRB ausgeben ldi r17, 0b11111110 ;0b11111110 in r16 laden anfang: out PORTB, r17 ;r16 ins IO-Register PORTB ausgeben lsl r17 ;bitweise linksschieben ldi r18, 0xFa ;lade wert 250 nach zählreg. 18 ldi r19, 0xFa ;"" ldi r20, 0x02 ; wert 2 nach zählreg. 20 loop: nop nop Nop nop nop nop dec r18 cpi r18, 0 brne loop dec r19 cpi r19, 0 brne loop dec r20 cpi r20, 0 brne loop rjmp anfang
ist doch richtig. Durchs Linksschieben rutschen Dir ja von "Rechts" die Nullen nach. Deine LED's leuchten nur, wenn der Ausgang LOW-Aktiv ist? scheint so. Wenn Du nicht das Carry-Bit mit einbeziehen willst (da laufen die Einsen hin), verwende in dem Fall ROL oder invertiere vor der Portausgabe dein Ergebnis und lade am Anfang R17 mit 0b00000001. Dann laufen Sie nun wenigstens 1x durch. AR.
Machs doch so ! ldi r17, 1 ;0b11111110 in r16 laden anfang: mov r21,r17 com r21 out PORTB, r21 ;r16 ins IO-Register PORTB ausgeben lsl r17 ;bitweise linksschieben ldi r18, 0xFa ;lade wert 250 nach zählreg. 18 ldi r19, 0xFa ;"" ldi r20, 0x02 ; wert 2 nach zählreg. 20 loop: nop nop Nop nop nop nop dec r18 cpi r18, 0 ; kanst du weglassen brne loop dec r19 cpi r19, 0 ; kanst du weglassen brne loop dec r20 cpi r20, 0 ; kanst du weglassen brne loop rjmp anfang
So müßte es gehen: .nolist .include "m8def.inc" .list .equ xtal = 4000000 ;4MHz .equ wait = xtal / 6 ;1s init: ldi r16, 0xFF out ddrb, r16 main: cpi r16, 0b11111110 ror r16 out portb, r16 ldi r28, byte1(wait) ldi r29, byte2(wait) ldi r30, byte3(wait) ldi r31, byte4(wait) delay: sbiw r29:r28, 1 sbci r30, 0 sbci r31, 0 brcc delay rjmp main Peter
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.