Autor |
Assemblerdirektvien im ATmega16 Suche nach: atmega16 (131) |
|
|
|
|
BID = 158455
drrgne Gerade angekommen
Beiträge: 2
|
|
Hallo!
Ich habe hier eine Aufgabe, in der ich eine Tabelle von 10 Hex-Werten im Speicher des ATmega16 ablegen soll.
Im Internet hab ich dazu gefunden, dass dies eigentlich mit
.org $adresse
.byte $wert
gehen sollte...
Im Assembler des AVR Studio4 krieg ich damit aber immer die Fehlermeldung error: .byte not allowed in .CSEG
Was mache ich da falsch oder wie sonst kann ich Werte im Speicher ablegen?
Thx for help! |
|
BID = 158462
Benedikt Inventar
Beiträge: 6241
|
|
Im AVR Studio heißt es nicht
.byte
sondern
.db für ein Byte
.dw für ein Word usw.
Schau mal in die Hilfe, da ist das gut erklärt. |
|
BID = 158485
drrgne Gerade angekommen
Beiträge: 2
|
Danke, das hat mir schonmal geholfen!
Ich hab jetzt folgende Tabelle im Speicher abgelegt:
.ORG $02a
digittab:
.dw $3f ; Ziffer 0
.dw $06 ; Ziffer 1
.dw $5b ; Ziffer 2
.dw $4f ; Ziffer 3
.dw $66 ; Ziffer 4
.dw $6d ; Ziffer 5
.dw $7d ; Ziffer 6
.dw $07 ; Ziffer 7
.dw $7f ; Ziffer 8
.dw $6f ; Ziffer 9
Nun will ich ausgehend vom Label digittab und einer Ziffer zwischen 0-9 einen Wert aus dieser Tabelle laden... Wie mach ich das? Ich steig bei diesen ganzen Adressierungsarten nicht durch
|
BID = 158505
Jornbyte Moderator
Beiträge: 7178
|
Da deine Daten im Flash liegen geht es so:
ldi zh,high(digittab*2)
ldi zl,low(digittab*2)+9
lpm
Das Ergebnis ist in R0.
Du solltest auch das .dw in .db ändern, sonst ist der nächste Fehler vorprogrammiert.
.db $3f ;Byte
.dw $40af ;Word
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 158758
MinceR Stammposter
Beiträge: 277
|
Zitat :
|
ldi zh,high(digittab*2)
ldi zl,low(digittab*2)+9
lpm
|
ich versteh grad nicht warum denn *2? dann ist er doch an ner ganz andern stelle.
wäre es nicht sinnvoller:
ldi zh,high(digittab) : zh auf oberes byte von adresse
ldi zl,low(digittab) : zl auf unteres byte von adresse
addiw Z, 9 :zum word register Z 9 dazuaddieren
lpm : aus adresse Z lesen und in r0
weil sonst könnts ja auch passieren das es an ner blöden stelle steht und sobald du 9 zum unteren register dazuaddierst es zufällig nen überlauf des registers gibt und du nu gaaaanz wo anders liest weil ZH eins zu wenig hat.
MfG MinceR
|
BID = 158769
Benedikt Inventar
Beiträge: 6241
|
Die 2 kommt von dem 16bit Programmspeicher. Du verwendest jedoch 8bit Werte.
|
BID = 158790
MinceR Stammposter
Beiträge: 277
|
stimmt stimmt..
der programmspeicher ist 1 word breit aber mit dem Z pointer benutz ich ihn als 2mal so gross aber mit byte.
hrhr.
ey moment, mir fällt gerade auf das ich somit ja auch nur 2048 befehle in nen 4k speicher krieg. das ist ja mies.
|
BID = 158797
Benedikt Inventar
Beiträge: 6241
|
Zitat :
MinceR hat am 4 Feb 2005 15:49 geschrieben :
|
ey moment, mir fällt gerade auf das ich somit ja auch nur 2048 befehle in nen 4k speicher krieg. das ist ja mies.
|
Ja, die hohe Geschwindigkeit des AVR wird teilweise durch die 16bit OpCodes erkauft.
Naja, man kann ja nicht alles habe: Den superkleinen Code mit hoher Geschwindigkeit
|