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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.