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!
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.
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
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!
1
.include "m16def.inc"
2
3
.equ temp, 0x10
4
.org 0x0000
5
.section .text
6
7
.global Main
8
9
ldi temp,hi8(RAMEND) ;Stackpointer initialisieren
10
out SPH, temp
11
ldi temp,lo8(RAMEND)
12
out SPL, temp
13
14
ldi ZL, lo8(Data) ;Z-Zeiger anlegen
15
ldi ZH, lo8(Data)
16
17
ldi temp, 0xFF ;PORTD ist Ausgang (Versorgungsspannung für Anzeige)
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.
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!
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.
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
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.