Forum: Mikrocontroller und Digitale Elektronik Look-up-Table


von Andreas H (Gast)


Lesenswert?

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

von Rainer (Gast)


Lesenswert?

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)

von hebel (Gast)


Lesenswert?

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

von Andreas H (Gast)


Lesenswert?

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

von Andreas H (Gast)


Lesenswert?

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

von Thomas F (Gast)


Lesenswert?

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

von Andreas H (Gast)


Lesenswert?

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

von Thomas O. (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

"lpm" und ".eseg" - das passt nicht zusammen. Wenn dann ".cseg".

von Thomas O. (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.