www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SRAM auslesen aund ausgeben [AtMega64]


Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe noch nicht sonderlich viel Erfahrung in der programmierung mit 
Assembler. Deshalb wollte ich hier mal nachfragen ob mein Quellcode so 
funktioniert oder was eben daran falsch ist.

Funktionsweise.

Ich habe im Ram 256 Byte gespeichert, die nach und nach an die Ports C 
und E ausgegeben werden sollen. Die position im Ram wird während dessen 
immer wieder neu berechnet.
SET_LED:
  
  mov r30, r1  ; r1: Die aktuelle Position
  rol r30    ; r3 mit 2 multiplizieren um die aktuelle Ramposition zu ermitteln.
  ldi r27, $1  ; Start Adresse des Rams erst bei 0x0100
  add r31, r27  ; Startadresse des Rams zur Position hinzu addieren.
  lds r2, Z  ; Wert aus dem Ram an adresse Z (r30, r31) in einem Register speichern
  out $3, r2  ; Ausgabe an PORTC
  inc Z    ; Z incrementieren
  lds r2, Z  ; Wert aus dem Ram an adresse Z in einem Register speichern
  out $15, r2  ; Ausgabe an PORTE

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LD r2, Z     ; das _s hat eine bedeutung
LDS r2, Z    ; macht nämlich etwas anderes
;)

>>r3 mit 2 multiplizieren um die aktuelle Ramposition zu ermitteln.
versteh ich nicht, aber ich weiß auch nicht wo der Wert in r3 her 
kommt...

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Den benutzen Prozessor sagt mir meine Galskugel: irgendein AVR...

  mov r30, r1  ; r1: Die aktuelle Position
  rol r30    ; r3 mit 2 multiplizieren um die aktuelle Ramposition zu ermitteln.
  ldi r27, $1  ; Start Adresse des Rams erst bei 0x0100
  add r31, r27  ; Startadresse des Rams zur Position hinzu addieren.
  lds r2, Z  ; Wert aus dem Ram an adresse Z (r30, r31) in einem Register speichern
  out $3, r2  ; Ausgabe an PORTC
  inc Z    ; Z incrementieren
  lds r2, Z  ; Wert aus dem Ram an adresse Z in einem Register speichern
  out $15, r2  ; Ausgabe an PORTE

-----------------------
.def aktuell = r1 ; liest sich wesentlich besser...
.def temp    = r2

  mov ZL, aktuell  ; Die aktuelle Position
  rol ZL    ; ZL mit 2 multiplizieren um die aktuelle Ramposition zu ermitteln.
rol schiebt C in Bit 0, was weisst Du zu dieser Zeit in Deinem Programm über den Zustand von C?
Also:
  lsl ZL
Und wenn das einen Übertrag ergibt??? Ist ein 16 Bit-zeiger, also noch ein
  rol ZH ; hinterher, hier rol, weil Bit7 aus ZL in Bit0 von ZH muß

  lds holt einen direkten Wert, da sollte eigentlich der Assembler maulen, wenn das richtige xxxdef.inc für den AVR includet wurde...
Alos
  ld  temp,Z
  out PORTC, temp ; Ports haben Namen, sind auch in der xxxdef.inc definiert...
  inc Z gibt es nicht, da sollte der Assembler maulen...
  adiw Z,1 ginge, nur warum?

  statt ld temp,Z besser
  ld temp,Z+ , dann zeigt Z schon auf das nächste Byte und weiter mit
  ld temp,Z
  out PORTE,temp

  fertig. Nochmal sortiert:

 -----------------------
.def aktuell = r1 ; liest sich wesentlich besser...
.def temp    = r2

 mov ZL,aktuell
 lsl ZL  ; * 2 für Offset von 2 Byte
 rol ZH
 
 addi ZH,0x01 ; kann man hier machen, einen Übertrag kann es hier ja nicht geben und Addition von 0 zu ZL ändert ja nichts
 ld  temp,Z+
 out PORTC,temp
 ld  temp,Z
 out PORTE,temp


Gruß aus Berlin












Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehr schön, so macht das also ein richtiger Asm-progger :)
aber:
 "addi" gibt's nicht bei AVRs!
hast wahrscheinlich
"adiw Z, 0x01"
gemeint (gibt es bei den neueren Typen),
@ Bruno (Gast):
 auf jeden Fall das "AVR Instruction Set"-PDF von Atmel besorgen ;)

auch grüße aus Berlin...

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael U. Jupp ist AVR. Hab ich aber auch in der Überschrift erwähnt.

Danke für eure Hilfe, ich find C dann doch irgendwie einfacher.

Habe mir das AVR Instruction Set herunter geladen, damit ist vieles 
einfacher.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Jörg X: aua aua, das kommt davon, wenn man mehr auf die eigenen 
Kommentare achtet, stimmt natürlich.

adiw geht auch nicht, das kann nur 0...63 als Wertebereich, es müßten 
aber in 16Bit 0x100 addiert werden

subi ZH, -0x01 dagegen geht...

Eigentlich würde ich es aber eher so machen:

{avrasm]
-----------------------
.DSEG
.org 0x0100
DATENTAB .byte 256

.CSEG

.def aktuell = r1 ; liest sich wesentlich besser...
.def temp    = r2

 ldi ZH,high(DATENTAB)
 ldi ZL,low(DATENTAB)
 mov YL,aktuell
 clr YH
 lsl YL
 rol YH
 add ZL,YL
 adc ZH,YH

 ld  temp,Z+
 out PORTC,temp
 ld  temp,Z
 out PORTE,temp

{/avrasm]

ist universeller und unabhängig von der Ram-Position der Wertetabelle.
Man hat nur an einer Stelle was anzupassen. ;)
Wenn ich nicht wieder auf die Schnelle Fehler eingebaut habe...

Eigentlich mache ich dazwischen an den KS0108-Routinen für mein 
"AVR-Radio weiter, das irritiert dann manchmal ;)

Gruß aus Berlin
Michael


Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

typisch, diesmal eben die Klammern beim avrasm-TAG... grrrr

Gruß aus Berlin
Michael

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael U.: verdammt, da hab ich nicht aufgepasst :)

@Bruno:
> ich find C dann doch irgendwie einfacher.
was treibt dich zu Asm? schau mal oben links "AVR-GCC-Tutorial" :)

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein chef will das so.

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.