Forum: Mikrocontroller und Digitale Elektronik Lauflicht mit ROL AVR Assembler


von M. S. (sadmarvin)


Lesenswert?

Hallo,

ich bin noch blutiger Anfänger was µC angeht. ;)

Ich habe hier einen ATtiny2313 auf dem Pollin Board.
Über die 40polige Leiste habe ich 8 LEDs am Port B des tiny 
angeshlossen.
Das funktioniert auch wunderbar.

Jetzt wollte ich ein Lauflicht mittels Bitrotation (ROL) programmieren.
Auch das funktioniert. Aber zwichen LED 7 aus und LED 0 an ist halt eine 
längere Pause. Da ja noch das Carry Bit "durchlaufen" wird.

Gibt es da einen Assembler Befehl zum Bitrotieren der das Carry Bit 
nicht berücksichtigt. Also direkt Bit 7 in bit 0 schiebt?

hier mal mein kleines Programm:
1
include "tn2313def.inc"
2
3
4
        ldi r16,0xFF
5
        out DDRB,r16    ;PORTB Ausgang
6
7
8
        ldi r19,0x01
9
main:
10
        out PORTB,r19    ;r19 auf PORTB ausgeben
11
        rcall longdelay  ;Pause
12
        rol r19          ;Bits in r19 links rotieren
13
        rjmp main
14
15
16
longdelay:
17
        clr r16
18
        clr r17
19
        ldi r18,0x03
20
delay:
21
        dec r16
22
        brne delay
23
        dec r17
24
        brne delay
25
        dec r18
26
        brne delay
27
        ret

von Lukas K. (carrotindustries)


Lesenswert?

M. S. schrieb:
> Gibt es da einen Assembler Befehl zum Bitrptieren der das Carry Bit
> nicht berücksichtigt. Also direkt Bit 7 in bit 1 schiebt?
LSL (Logical left shift)

von M. S. (sadmarvin)


Lesenswert?

hm, wenn ich die Doku zu LSL richtig verstehe,würde das mit dem Programm 
wie es jetzt ist ja nur einmal dürchlaufen, oder?

Man müsste dann noch das C Flag des SREG (weiss noch nicht was das ist 
;) )
auf 1 testen und wenn es 1 ist r19 wieder mit 0x01 laden.

Würde das gehen so gehen?

        ldi r19,0x01
main:
        out PORTB,r19
        rcall longdelay
        lsl r19
        WENN SREG C-Flag 1 DANN
        ldi r19,0x01
        rjmp main

von MWS (Gast)


Lesenswert?

Luk4s K. schrieb:
> M. S. schrieb:
>> Gibt es da einen Assembler Befehl zum Bitrptieren der das Carry Bit
>> nicht berücksichtigt. Also direkt Bit 7 in bit 1 schiebt?
> LSL (Logical left shift)

Falsch. LSL schiebt eine 0 an Bitposition 0.

von Lukas K. (carrotindustries)


Lesenswert?

MWS schrieb:
> Luk4s K. schrieb:
>> M. S. schrieb:
>>> Gibt es da einen Assembler Befehl zum Bitrptieren der das Carry Bit
>>> nicht berücksichtigt. Also direkt Bit 7 in bit 1 schiebt?
>> LSL (Logical left shift)
>
> Falsch. LSL schiebt eine 0 an Bitposition 0.
War ich wohl tatsächlich ein wenig zu voreilig:
Rd(n+1) ← Rd(n), Rd(0) ← 0
geschoben wird dennoch

von M. S. (sadmarvin)


Lesenswert?

also ich habs jetzt so gemacht
1
start:
2
        ldi r19,0x01
3
main:
4
        out PORTB,r19
5
        rcall longdelay
6
        lsl r19
7
        brcs start
8
        rjmp main

Es kommt mir zwar so vor als ob umschalten von LED7 auf LED0 etwas 
länger dauert. Aber das sind doch nur 2 Befehele (der Sprung nach start 
und das laden von r19) mehr. Das dürfete man doch eigentlich nicht 
merken oder?

von MWS (Gast)


Lesenswert?

M. S. schrieb:
> Das dürfete man doch eigentlich nicht merken oder

Sicher nicht, außer Du kannst Verzögerungen im Mikrosekundenbereich 
wahrnehmen :D

von M. S. (sadmarvin)


Lesenswert?

glaub nich ;)
War wohl Einbildung...

Habs nun ein Lauflicht mit vor und zurück hinbekommen.
Macht irgendwie Spaß damit rumzuspielen. Vielleicht hab ich ja ein Hobby 
gefunden. Mal schauen..

wen es interessiert hier mal das fertige Lauflicht Programm
1
include "tn2313def.inc"
2
3
        ldi r16,0xFF    ;r16 mit 255 laden
4
        out DDRB,r16    ;alle pins von PORTB Ausgang
5
6
        ldi r19,0x01    ;r19 mit 1 laden
7
forwards:
8
        out PORTB,r19           ;r19 auf PORTB ausgeben
9
        rcall longdelay         ;Pause
10
        lsl r19                 ;r19 ein Bit nach links schieben
11
        cpi r19,0b10000000      ;LED7 an?
12
        brne forwards           ;falls nicht weiter
13
14
backwards:
15
        out PORTB,r19           ;r19 auf PORTB ausgeben
16
        rcall longdelay         ;Pause
17
        lsr r19                 ;r19 ein Bit nach rechts schieben
18
        cpi r19,0b00000001      ;LED0 an?
19
        brne backwards          ;falls nicht weiter
20
        rjmp forwards           ;nächster Durchlauf
21
22
longdelay:
23
        clr r16                 ;r16 null setzen
24
        clr r17                 ;r17 null setzen
25
delay1:
26
        dec r16                 ;r16 -= 1
27
        brne delay1             ;if r16 != 0 -> Sprung
28
        dec r17                 ;r17 -= 1
29
        brne delay1             ;if r17 != 0 -> Sprung
30
        ret                     ;return

von 8AF6lUf8OT (Gast)


Lesenswert?

Ich glaube, mal einen Einzeiler für ein Lauflicht gesehen zu haben. Nur 
durch logische Operationen..

von 8AF6lUf8OT (Gast)


Lesenswert?

(könnte C gewesen sein)

von Harry (Gast)


Lesenswert?

Nur mal so als Frage, fehlt da nicht noch etwas für den Stack?
du nutzt RCALL und RET und nirgendwo seh ich was wo der Stackpointer 
initialisiert wird...

Oder wird es automatisch gemacht?

von spess53 (Gast)


Lesenswert?

Hi

>Oder wird es automatisch gemacht?

Beim ATTiny2313 ja. Bei anderen kann das zur Falle werden.

MfG Spess

von M. S. (sadmarvin)


Lesenswert?

Ah, ok. Wieder was gelernt.
Wie gesagt, beschäftige mich erst seit ein paar Tagen mit 
Mikrocontrollern.
;)

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.