Forum: Mikrocontroller und Digitale Elektronik Lauflicht


von Marcus Bertrand (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

Ja, stimmt ! Aber du mußt immer auch das Carry-Flag beachten, daß wird
nämlich bei LSL mitgeschoben.

von Thorsten (Gast)


Lesenswert?

Sorry, ich habe Schrott geschrieben. Das Carry wird nut bei ROL
mitgeschoben, bei LSL wandert lediglich Bit 7 ins Carry.

von Marcus Bertrand (Gast)


Lesenswert?

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

von AxelR. (Gast)


Lesenswert?

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.

von condor (Gast)


Lesenswert?

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

von Peter Dannegger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.