Moiiiin!
Hat mal eben einer schnell nen Link parat, wie eine Lookup-Table
funktioniert und wie man sie in Assembler programmiert? Beispielcode?
Ich denke, daß ich das ganz gut für mein Vorhaben gebrauchen könnte. Im
Detail:
Ich möchte auf ein per SPI empfangenes Byte reagieren und im SRAM das
dazugehörige Antwortbyte heraussuchen. Ich benutze einen AT90S8515. Nach
dem Start(/Reset) wird das SRAM aus dem EEProm mit den 256 möglichen
Werten geladen. Dann warte ich darauf, daß per SPI die Anfrage
eintrudelt. Wenn ich diese erhalten habe, soll er dazu aus dem SRAM das
passende Antwortbyte heraussuchen, welches dann beim nächsten
SPI-Durchgang übermittelt wird.
Für Tips und Anregungen hierzu wäre ich dankbar!
ciao,
Andi
Also, hab schon so lange kein Assembler mehr geschrieben, und das, das
ich kann ist für i386 oder 8051... Also in C :)
char lookuptable[256] = { 0x01, 0x02, 0x03 /* usw*/ };
char returnbyte = lookuptable[inbyte];
Das wars auch schon... In Assembler kannst ja mit Arrays nicht so viel
anfangen, also das machen, was C auch macht - Adressenoffsets benutzen.
So in die Richtung:
mov A, baseaddress
add A, inbyte
move R1, A
mov A, @R1
(Das ist irgendwie hingezaubert, kein Anspruch auf
Richtigkeit/Vollständigkeit/wasauchimmer, hab wie gesagt schon ewig kein
ASM mehr geschrieben)
Hallo Andreas,
ich würde die Daten solange im EEPROM lassen, bis ich sie brauche und
erst dann auslesen.
So speicherst Du die Daten im EEPROM:
;**************************************************
.eseg ; EEPROM-Segment
.org 0
table1: DB. 0x00,0xEF,0xAA,0x0C,...
;**************************************************
So werden die Daten zurückgelesen:
;**************************************************
EEREAD:
ldi Temp,0 ; Startadresse Hi
out EEARH,Temp
ldi Temp,0x01 ; Startadresse Lo
out EEARL,Temp
wait: sbic EECR,EEWE ; beschäftigt?
rjmp wait ; warten
sbi EECR,EERE ; auslesen
in f,EEDR ; Daten in f
ret
;**************************************************
In diesem Beispiel würdest Du also ein 0xEF im f-Register stehen haben.
(Position 0x01 im EEPROM)
So sparst Du Dir den gesamten Platz im SRAM.
Gruß Andreas
Moin!
Die Daten erst aus dem Eeprom zu lesen, wenn ich sie auch brauche, hat
zwar den Vorteil, daß ich mir den Platz im Ram spare, aber auch den
Nachteil, das es länger dauert. Ich weiß nicht, ob es schnell genug
geht...
Diese Routine läuft auf einem 8515, der per SPI-Schnittstelle als Slave
antworten muß. Erhält er das Byte vom Master, muß er recht fix das
Antwortbyte aus seinem Speicher finden. Der Master sendet also ein Byte
= 256 verschiedene Möglichkeiten. Also kann ich 256 verschiedene
Antwortbytes haben. Befinden sich diese bereits im SRam, kann ich recht
fix darauf (per Offset) zugreifen. Der Zugriff aufs Eeprom dauert doch
länger. Wieviel Taktzyklen würde das in etwa dauern? Wenn es schnell
genug geht, daß ich das Antwortbyte ins SPI-Data-Register schieben kann,
bevor der Master es abruft, kann ich es so machen. Ansonsten bleibt mir
nur die Möglichkeit, zum Programmstart (wo ich ja genug Zeit habe)
sämtliche Werte ins Ram zu kopieren und dann, wenn benötigt, darauf
zugreife.
Übers SRam würde ich sicherlich mit ein paar Taktzyklen (Schätzungsweise
20) hinkommen. Das müßte dann schnell genug sein. Wieviel würden
hinzukommen, wenn ich die Daten nicht vom SRam hole, sondern aus dem
Eeprom?
Die 512Byte SRam sind übrigens massig mehr also ich benötige, sparen
brauche ich da nix. :)
ciao,
Andi
Hallöchen nochmal...
Hab nochmal nachgeschaut, das Lesen des EEprom dauert ja gar nicht so
lange, müßte also klappen, wenn ich das so mache.
Aaaaber.... ->
@hebel:
> So speicherst Du die Daten im EEPROM:> ;**************************************************> .eseg ; EEPROM-Segment> .org 0> table1: DB. 0x00,0xEF,0xAA,0x0C,...> ;**************************************************
Das speichern der Daten im EEProm scheint bei mir irgendwie nicht zu
funktionieren. Genau diese Zeilen habe ich so ans Ende meines Codes
plaziert. Vielleicht liegt es ja an der 4er Version vom Studio (wegen
"Beta"), jedenfalls tauchen im Debug-Modus die eingegebenen Werte nicht
im EEprom auf. ??? Oder verstehe ich da was falsch?
Hat die Studio v3.x auch eine Möglichkeit, sich im Debugger die Daten
des EEproms anzeigen zu lassen? Kann das mal einer Testen, ob es da
funktioniert? Ich möchte jetzt nicht einfach so die 3er Version auf
meinem Rechner aufspielen, um dann festzustellen, daß es mir nix bringt.
:(
Das lesen des EEproms funktioniert im Debugger sonst einwandfrei. Nur
leider liest er das, was im EEprom drin steht, und das ist nur Müll und
nicht das, was ich nach ".ESEG" hineinschreibe...
Benuztzt hier eigentlich sonst noch jemand die Studio v4 ?
ciao,
Andi
Hallo,
ich benutze ebenfalls die AVRStudio Version 4.
Mir ist auch aufgefallen, dass der Simulator beim Starten den
EEPROM-Inhalt nicht lädt und so nur irgendwelche beliebigen Werte im
"Memorywindow" drinnen stehen.
Man kann aber den Inhalt selbst in den Speicher laden:
- Im Debugging-Modus "Debug -> Up/Download Memories" wählen.
- Bei "Memory Type" "EEPROM" einstellen.
- Bei "Hex-File" die beim kompilierten automatisch erzeugte *.eep-Datei
wählen.
- "Load and Program" und dann sollte der gewünschte Inhalt im
"Memorywindow" erscheinen.
Gruß
Thomas
Hallo Thomas!
Danke für den Hinweis! Stimmt, so geht es. Schade, daß man das von Hand
machen muß und Studio das nicht automatisch macht. Man müßte das
irgendwo in den Options einstellen können, das wäre nicht schlecht.
ciao,
Andi
Hallo,
es gibt auch die Möglichkeit das per Zähler zu machen. Zähler1 auf
tabelle2 stellen und zu Zähler2 2addieren, lpm ausführen und schon hast
du den Wert 210 im Register stehen.
.eseg
Tabelle1: 255, 220, 200, 180, 160
Tabelle2: 244, 210, 100, 80, 60
Hallo,
ja stimmt war mein fehler. Hat aber den Vorteil das du eine sehr große
Tabelle anlegen kannst. Um so kleiner dein Prog desto mehr bleibt dir
von den 8192Bytes über.