Hallo erstmal.
Ich brauch dringend eure Hilfe.
1) irgendwie kann ich mit avrstudio4 das eeprom nicht simulieren
Ist das normal ?
2) Wuerde gerne mit einer 8bit Zahl direkt das eeprom
ansteuern also so, als ob die 8bit Zahl als label fungiert
Vor allem zur zweiten Sache wuerd ich mich riesig ueber Hilfe
erfreuen.!!!!!!!!!!!!!!!!!
Programmiere in Assembler!!!
In dem tutorial Kapitel.7 seite 6 steht unten im Code
.eseg
daten:
.db 0b10101010
AnstattDaten wuerde ich gerne ein 8 bit Zahl verwenden um direkt was
aus dem eeprom zu holen.
OK!
Das Problem ist, dass die ich mit einer 8bit Zahl aus einer A/D
Wandlung direkt Zugriff auf eine "andere Zahl" im Eeprom haben
moechte. Also ich sag mal ich moechte mit 0b00001111 aus der A/D
Wandlung die Zahl 0b11111111 aus dem eeprom bekommen. Also so als ob
die erste binaerzahl als label fungiert.Oder kann man dass irgendwie
anders machen?
Ist nicht schlimm.
Der Zugriff auf das EEPROM geschieht mittels Zeiger "Z". Dieser
besteht aus einer 16Bit-Zahl oder genauer aus einem High-Byte und einem
Low-Byte - der Adress im EEPROM.
Benutzt du nun das Low-Byte als Referenzadresse für deine
Vergleichszahlen, kannst du so 255 "8Bit-Zahlen" lokalisieren.
Du kopierst also das ADC-Ergebnis in das Low-Byte deines Zeigers, holst
die dort hinterlegte Zahl und vergleichst sie miteinander oder stellst
sonstwas damit an.
Hmmm... - Und ich dachte immer, dass man das über das (oder die)
EEPROM-Adress-Register EEAR (EEARL, EEARH) adressiert. Also ADC-Byte
nach EEAR(L) ausgeben, dann EERE in EECR setzen...
Oder meint ihr vielleicht den Programmspeicher (Flash)? Dann würde ich
auch Y-Pointer und LPM nehmen...
Den gibt es in den Atmel-Appnotes, heißt irgendwie so ähnlich wie
"using eeprom"...
ansonsten (so ohne Datenblatt aus dem Hut):
out eear,adcbyte ;Adressregister setzen
sbi eecr,eewe ;EEPROM-Read-Enabled in EE-Steuerregister
in neubyte,eedr ;Datenbyte aus EEPROM lesen
Hat der EEPROM mehr als 256 Bytes (größere AVRs), dann müssen beide
EEPROM-Adressregister (EEARL und EEARH) gresetzt werden.
Weil nur die "Steuerfunktionen" rund ums EEPROM behandelt werden und
die Daten selbst für eine Simulation relativ unwichtig sind.
Bei einer Simulation gehts ja im Grunde nur darum, Funktionen eines
Bausteins und dessen Programm(ierung) zu testen und nicht irgendwelche
Daten, die entweder während Programmablaufs erst generiert werden oder
größtenteils nur der Visualisierung dienen (Texte,Meßwerte o.ä.)
Achja, du musst ja noch Werte im EEPROM ablegen...
.eseg ;EEPROM-Segment
ein_Label: ;oder auch nicht...
.db byte1 ;erstes Byte (statt byte1 Wert eintragen)
.db byte2 ;wieder nur 1 Byte
...
.db byte27,byte28,byte29... ;gleich mehrere Bytes
.db 112,0b10010110,0x7f,255 ;dec,bin,hex,dec, wie es gerade passt
Wird .db im Flash (.cseg) verwendet, sollte die Anzahl der Bytes pro
Zeile aber immer geradzahlig sein...
Achja, es gibt da ein Memoryfenster (habe ich immer unten rechts), da
kann man den Inhalt von Register, Programm, EEPROM usw sehen. Kann
sein, dass da die Werte erscheinen, die du im EEPROM hast. Habe ich
aber noch nicht weiter überprüft, ich lasse mir da immer die Register
drin zeigen. Dann habe ich links mehr Platz für die I/Os...
Wie ist das nun wenn ich mit dem Atmega 8 arbeite der hat doch 512byte.
super die sache mit dem eeprom die dur mir gerade gezeigt hast war
schon wieder ein bisschen am verzweifeln gewesen.Ist eearl von dem
ersten byte dann zum Beispiel 0b00000000 und eearh dann 0b00000000.
Oder ich stell dir mal ne frage wie ist eearh und eearl von byte 270?
Please help amigo!
Na EEARL (Low-Byte) und EEARH (High-Byte) ergeben zusammen eine 16-Bit
Zahl.
Bei den 512 Bytes des Mega8 adressierst du mit EEARL die unteren 256
Bytes wenn EEARH=0 ist und die oberen 512 Bytes wenn EEARH=1 ist.
Andere Werte für EEARH sind nicht erlaubt, da EEARH bei 512 Byte EEP
nur das untere Bit unterstützt. Bei größeren EEPs sind es dann mehr...
Wenn du eine Tabelle zur Umwandlung von 256 Werten brauchst, so geht das
mit dem Flash besser und einfacher.
ldi r1,0 ;(oder clr r1)
ldi zl,low(tabelle) ;Pointer setzen
ldi zh,high(tabelle) ;High-Teil vom Pointer
add zl,r16 ;ADC-Wert sei in R16
adc zh,r1 ;Null und Carry ins ZH addieren (Übertrag)
lpm ;Ergebnis steht jetzt in r0
...
tabelle: ;am Ende des Programmcodes
.db 1,2 ;Wert 1 und 2,
.db 3,5 ;Wert 3 und 4,
.db 8,4,2,5 ;Wert 5 bis 8 (da muss man schon etwas
mitzählen)
...
.db 22,9 ;vorletzter und letzter Wert (256 Werte)
Hamme muss ich morgen unbedingt mal ausprobieren .Ich danke Dir
tausendfach !!!!
.db 1,2 bedeutet das ich die ersten beide werte nebeneinander
hinschreibe. Ist es wieder egal ob binaer oder hex.
Ist das moeglich
eseg
.db 0b11111111,0b10000000 ;Wert1 und Wert2
Du kannst alle gültigen Schreibweisen von 8-Bit-Zahlen mischen, der
Assembler macht eh binär draus weil für jedes Bit ein Flipflop zum
Speichern zur Verfügung steht... (grins)
Ja, Programm steht im Flash, und da ist .cseg
Bytes im EEPROM sind nichtflüchtige Datenbytes .eseg
Bytes im SRAM können mit .dseg und .byte reserviert werden
Steht aber alles in der Hilfe zum AVR-Studio (Tools, AVR-Assembler)