www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie kann ich in AVR-Assembler ein Feld erzeugen?


Autor: Andreas H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich programmiere nicht mit dem AVR-Studio, daher funktioniert der 
".db"-Befehl bei mir (offensichtlich) nicht.
Für eine Ausgabe auf der Anzeige (mein µC ist ein atmega16) würde ich 
aber gerne die dazu benötigten Bitmuster im Speicher (Flash oder SRAM) 
abspeichern, wobei die einzelnen Bitmuster nebeneinander im Speicher 
stehen können/sollten... Aber wie mache ich das? Hier in den Tutorials 
wird das immer mit ".db" gemacht, geht das anders aus? Z-Zeiger 
vielleicht? Aber wie?

Vielen Dank!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas H. wrote:
> Hallo,
> ich programmiere nicht mit dem AVR-Studio,

Es wäre gut, wenn du uns dann sagen würdest, welchen Assembler
du statt dessen benutzt. Letztendlich ist das nämlich eine
Frage dessen, welches Kürzel dem Programmierer deines
Assemblers am sympatischten war.

> daher funktioniert der
> ".db"-Befehl bei mir (offensichtlich) nicht.

Wieso offensichtlich?
So offensichtlich ist das nicht.

> wird das immer mit ".db" gemacht, geht das anders aus?

Das hängt ganz und gar von deinem Assembler ab.
Normalerweise müsste sowas in der Doku zu finden sein.

> Z-Zeiger
> vielleicht?

sicherlich wird es letztendlich auf eine Verwendung des
Z-Zeigers hinauslaufen. Aber das ist ja jetzt noch gar nicht
dein Problem. Jetzt musst du erst mal das Feld (den Text)
anlegen und dann kannst du dir überlegen, wie dein Programm
ihn wieder auslesen kann/soll.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nenn mal ein konkretes Beispiel, in dem ".db" nicht funktioniert.

Gruss Otto

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

.db funktioniert nur im Flash. Beim Zugriff musst du aber beachten, das 
der Flash Wortweise organisiert ist. Der Zugriff über z.B. Z erfolgt 
Bytweise. Wenn du auf dein Feld zugreifen willst musst du Z mit der 
Adresse * 2 laden.


Feld:     .db 11,22,33,44,....


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

MfG Spess

Autor: Andreas H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, danke für deine antwort.

ich habe hier mal einen kleinen beispielcode programmiert. ich möchte 
also einfach nur diese 3 zufällig angelegten 8-bit-werte am PORTC 
ausgeben mittels z-pointer. fehlermeldung bekomme ich keine, jedoch 
leuchtet die anzeige meines DIGIT0 an allen stellen auf (also 
anscheinend bekommt es lauter einser), obwohl das natürlich nirgends in 
meiner tabelle steht. was mache ich falsch?! danke für jeden hinweis!
.include "m16def.inc"

.equ temp, 0x10
.org 0x0000
.section .text

.global Main

ldi  temp,hi8(RAMEND)    ;Stackpointer initialisieren
out SPH, temp          
ldi  temp,lo8(RAMEND)  
out SPL, temp

ldi ZL, lo8(Data)        ;Z-Zeiger anlegen
ldi ZH, lo8(Data)

ldi temp, 0xFF            ;PORTD ist Ausgang (Versorgungsspannung für Anzeige)
out DDRD, temp
ldi temp, 0b00000001    ;Digit0 aktivieren
out PORTD, temp

ldi temp, 0xFF    ;PORTC ist Ausgang für Daten
out DDRC, temp

loop:
        lpm temp,Z+     ;Daten ausgeben und Z-Zeiger erhöhen
        out PORTC, temp
        rjmp loop

;Tabelle:
;========

Data:
  .byte 0b10101011
  .byte 0b00001110
  .byte 0b11110000

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Z-Pointer wird falsch initialisiert:

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

muß das heißen.

Außerdem läuft Deine Schleife zu schnell, da erkennst Du nie etwas.

Autor: Andreas H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich das so wie du sagst programmiere, dann bekomme ich die 
Fehlermeldung:

"Error: invalid sections for operation on 'Data' and 'lo8'"!

Diese Fehlermeldung bekomme ich ohne (data*2) nicht...

Dass die Schleife zu schnell läuft, stört mich jetzt für die testzwecke 
einmal nicht, das werde ich dann ändern, wenn das mit dem Z-Register mal 
klappen sollte, aber danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas H. wrote:
> wenn ich das so wie du sagst programmiere, dann bekomme ich die
> Fehlermeldung:
>
> "Error: invalid sections for operation on 'Data' and 'lo8'"!

Schau dir nochmal deinen Code und den von Travel Rec. genau
an. Insbesondere den Teil in dem du 'lo8' und Travel Rec 'Low'
bzw. 'High' geschrieben hat.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Was ist das für ein Assembler?

Noch etwas: in einer .db-Zeile muss eine geradzahlige Anzahl von Werten 
stehen. Da die nächste Zeile eine neue Wortadrsse darstellt hast du 
sonst immer ein ungenutztes Byte dazwischen und dein Adressierung stimmt 
nicht mehr.

MfG Spess

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also da sind doch gleich richtig viele Fehler drinne:

- temp soll ein Register zugewiesen werden --> .def temp=r16
- An Adresse 0x000 im Flash steht Resetvektor
 .org 0x000
 rjmp MAIN

 MAIN:

- Stackpointer laden: ldi temp,HIGH(RAMEND)...
- Z-Pointer wird bei dir 2x mit LOW-Werten von Daten initialisiert und 
muss mit 2 Multipliziert werden (wegen Wort)
- Die Daten werden mit .db angelegt und durch Komma hintereinander 
aufgelistet (bei einer ungeraden Zahl, ergänzt der Compiler ein Byte mit 
Null)=

Hab den Code im AVR getestet und läuft ohne Problem, außer das die 
Schleife nicht abgebrochen wird.
.include "m16def.inc"

.def temp=r16
.org 0x0000
rjmp Main

Main:

ldi  temp,HIGH(RAMEND)    ;Stackpointer initialisieren
out  SPH, temp          
ldi  temp,LOW(RAMEND)  
out  SPL, temp

ldi ZH, HIGH(Data<<1)        ;Z-Zeiger anlegen
ldi ZL, LOW(Data<<1)

ldi temp, 0xFF            ;PORTD ist Ausgang (Versorgungsspannung für Anzeige)
out DDRD, temp
ldi temp, 0b00000001    ;Digit0 aktivieren
out PORTD, temp

ldi temp, 0xFF    ;PORTC ist Ausgang für Daten
out DDRC, temp

loop:
        lpm temp,Z+     ;Daten ausgeben und Z-Zeiger erhöhen
        out PORTC, temp
        rjmp loop

;Tabelle:
;========

Data:
.db 0b10101011,0b00001110,0b11110000

Gruß Alexander

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dumme Zwischenfrage: warum nutzt der Kollege das AVR-Studio und dessen 
Assembler nicht?

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.