mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik in Assembler indexiert auf AVR Flash zugreifen?


Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Für eine Schrittmotorsteuerung will ich Werte im Flash lesen.
Eigentlich will ich ein Register als Index verwenden (Array).
Es gibt aber keinen Befehl ADIW rd,r1
Ich habe mir jetzt mit einer Schleife und ADIW rd,k63 beholfen.
Aber schön finde ich das nicht.
Was mache ich wenn meine Look-Up-Tables mal grösser sind als 4
Einträge?

Dank im Voraus.

.
.
.

  ldi ZH, high((pattern)*2)
  ldi ZL, low((pattern)*2)

TCmp1C:
  cpi temp1, 0
  breq TCmp1D
  adiw ZL, 2
  dec temp1
  rjmp TCmp1C
TCmp1D:
  lpm ; Programmspeicher nach r0
.
.
.
pattern:  .dw  0x0009, 0x000c, 0x0006, 0x0003

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so geht`s auch

TCmp1C:
  add  ZL,temp1
  brcc PC + 2
  inc  ZH
  add  ZL,temp1
  brcc PC + 2
  inc  ZH
TCmp1D:
  lpm ; Programmspeicher nach r0

Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank.
 Ich nehme an, Ich könnte auch (nur) einen Addiervorgang machen, wenn
ich die Addresse wortmässig vorliegen habe.

Dirk

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
richtig aber danach ist dann

lsl ZL
rol ZH

zur Adresskorrektur erforderlich

  ldi  ZH, high(pattern)
  ldi  ZL, low(pattern)
  add  ZL,temp1
  brcc PC + 2
  inc  ZH
  lsl  ZL
  rol  ZH

Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
Nochmals danke. Aber jetzt musste ich doch eine Weile überlegen.

Wenn bezogen auf deinen ersten Code mein temp1 als Byteoffset
vorliegt,
(Also quasi temp1 = 2 * temp1) muss ich doch nix korrigieren.

Dein zweite Code bezog sich doch auf die Annahme, dass temp1 die
Wortdifferenz ist, oder? Dann wird aber mit lsl ZL und rol ZH die
gesammte Adresse geshiftet. Das geht aber nur, wenn 'pattern' ein
Wort index ist, aber nicht mit einem Label, so wie ich's in meinem
ersten Code verwende?

Oder hab ich jetzt krumm gedacht?

Danke für Geduld
    Dirk

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Label ist im Atmel-Assembler immer eine Wort-Adresse, deshalb das
"*2" bzw. "lsl  ZL; rol  ZH".

Für den zweiten Code muss in temp1 ein Wort-Index stehen.

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.