Lauflicht (Zeitverzoegerung)

Gast #112198
Hallo ;)
Ich bin neu und unerfahren im Bereich der AVRs.
Als ersten Versuch wollte ich ein kleines Lauflicht (mit 3 Dioden)
basteln. Ich habe mir also einen Delay mit dem AVR delay loop generator
schreiben lassen. Dieser Codeschnipsel funktioniert soweit auch.
Nun habe ich mir eine Unterfunktion "delay" geschrieben:
-------
delay:
          ldi  R29, $06
WGLOOP9:  ldi  R30, $37
WGLOOP10: ldi  R31, $C9
WGLOOP11: dec  R31
          brne WGLOOP11
          dec  R30
          brne WGLOOP10
          dec  R29
          brne WGLOOP9

          nop
          ldi R29, 0
          ldi R30, 0
          ldi R31, 0
ret
-------
Diese benutze ich wie folgt:
-------
loop:
         ldi r16, 0b11111011
         out PORTB, r16

         rcall delay

         ldi r16, 0b11111101
         out PORTB, r16

         rcall delay
[...]
         rjmp loop
-------
Wenn ich das ganze nun Assembliere und auf den µC schreibe, leuchtet
nur die letzte Diode (konstant).
Ich habe einige Sourcecodes durchgeschaut, was aber nicht zu einer
Loesung meines Problems fuehrte.
Ueber eine Antwort waer ich sehr dankbar ;)

Daniel "trasher" Derichs
Gast
Hallo Daniel,

leg bitte mal die komplette Datei in den Anhang.

Auf den ersten Blick fehlt oben in deinem Programm, daß du die Pins als
Ausgänge kofigurierts. (Siehe Register DDRB)


Gruß

Fiffi
Gast
Hi,
der Port wurde wie folgt als Ausgang konfiguriert:
         ldi r16, 0xFF
         out DDRB, r16
Das war dann auch schon der gesamte Code.
Wenn ich das "rcall delay" durch den Delay code ersetze, funktioniert
alles Problemlos.
Da ich diesen Code aber mehrfach verwende, wollte ich das ganze
vereinfachen.

Daniel "trasher" Derichs
Gast
Sobald Du ein rcall verwendest, musst Du auch den Stackpointer
initialisieren.

Ich garantiere jetzt nicht fuer Richtigkeit, aber je nach verwendetem
AVR musst Du entweder

ldi temp, LOW(RAMEND)    ; initialize stack pointer
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

oder

ldi temp, RAMEND
out SP, temp

eingeben. Man korrigiere mich bitte, besonders bei der 2. Variante bin
ich unsicher.
Gast
Hab es mit beiden Varianten versucht (temp als r14 definiert).
Beim ldi bekomme ich immer "Illegal argument type or count" (bei
beiden Varianten).
Gast
Problem geloest.
Lag tatsaechlich am Stackpointer ;)
Letztere Variante tut bei mir (ATmega8) wunderbar.
Habe temp nun als R23 definiert, mit R14 wollte es nicht ;)

Danke,
Daniel "trasher" Derichs
Gast
Guten Morgen,

in der Hilfe zum AVR-Studio findet sich auch eine Beschreibung
des ldi -Befehles.

Zitat: "Loads an 8 bit constant directly to register 16 to 31."

Deswegen funzt es mit R14 nicht.

Viel Spaß bei deiner AVR Enseckungstour,

Quark
Gast
Hallo Bernhard

z.B. mit MOV, LD und vielen anderen Befehlen lassen sich
die Register R0-R15 ansprechen.
Sie sind nur nicht zum direkten (Immediate) Laden einer Konstanten
zu gebrauchen.

Grüße

Quark

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.