www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lauflicht (Zeitverzoegerung)


Autor: Daniel Derichs (Gast)
Datum:

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

Autor: Fiffi (Gast)
Datum:

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

Autor: Daniel Derichs (Gast)
Datum:

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

Autor: Johannes M. Richter (Gast)
Datum:

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

Autor: Johannes M. Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, schon wieder; zur Klarstellung: temp ist dabei einfach ein
Register.

Autor: Daniel Derichs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es mit beiden Varianten versucht (temp als r14 definiert).
Beim ldi bekomme ich immer "Illegal argument type or count" (bei
beiden Varianten).

Autor: Daniel Derichs (Gast)
Datum:

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

Autor: Quark (Gast)
Datum:

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

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

wie kann ich dann denn die Register r0 - r15 ansprechen, wenn der ldi
Befehl nur für die oberen Register gültig ist??

Bernhard

Autor: Quark (Gast)
Datum:

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

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.