www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lauflicht mit ROL AVR Assembler


Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht 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:
include "tn2313def.inc"


        ldi r16,0xFF
        out DDRB,r16    ;PORTB Ausgang


        ldi r19,0x01
main:
        out PORTB,r19    ;r19 auf PORTB ausgeben
        rcall longdelay  ;Pause
        rol r19          ;Bits in r19 links rotieren
        rjmp main


longdelay:
        clr r16
        clr r17
        ldi r18,0x03
delay:
        dec r16
        brne delay
        dec r17
        brne delay
        dec r18
        brne delay
        ret

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich habs jetzt so gemacht
start:
        ldi r19,0x01
main:
        out PORTB,r19
        rcall longdelay
        lsl r19
        brcs start
        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?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht 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
include "tn2313def.inc"

        ldi r16,0xFF    ;r16 mit 255 laden
        out DDRB,r16    ;alle pins von PORTB Ausgang

        ldi r19,0x01    ;r19 mit 1 laden
forwards:
        out PORTB,r19           ;r19 auf PORTB ausgeben
        rcall longdelay         ;Pause
        lsl r19                 ;r19 ein Bit nach links schieben
        cpi r19,0b10000000      ;LED7 an?
        brne forwards           ;falls nicht weiter

backwards:
        out PORTB,r19           ;r19 auf PORTB ausgeben
        rcall longdelay         ;Pause
        lsr r19                 ;r19 ein Bit nach rechts schieben
        cpi r19,0b00000001      ;LED0 an?
        brne backwards          ;falls nicht weiter
        rjmp forwards           ;nächster Durchlauf

longdelay:
        clr r16                 ;r16 null setzen
        clr r17                 ;r17 null setzen
delay1:
        dec r16                 ;r16 -= 1
        brne delay1             ;if r16 != 0 -> Sprung
        dec r17                 ;r17 -= 1
        brne delay1             ;if r17 != 0 -> Sprung
        ret                     ;return

Autor: 8AF6lUf8OT (Gast)
Datum:

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

Autor: 8AF6lUf8OT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(könnte C gewesen sein)

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Oder wird es automatisch gemacht?

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

MfG Spess

Autor: M. S. (sadmarvin)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.