AT90:Code Frage

R

R.Freitag

Guest
Hallo

wie definiere ich im ROM-Bereich des o.g. eine Tabelle mit 256 Einträgen a
16 bit?

mit 256 * .dw ist es zu aufendig.

Robert
 
Hi

wie definiere ich im ROM-Bereich des o.g. eine Tabelle mit 256 Einträgen a
16 bit?

mit 256 * .dw ist es zu aufendig.
Irgendwie musst du die Werte doch angeben - also wirst du um das
eintippen nicht herumkommen. Du kannst natuerlich mehrere Werte pro
Zeile angeben:
.dw 2,3,5,7,11,13,17,19,23

Wenn du zu faul bist, 256 Nullen einzutippen, kann ich dir ja
vielleicht helfen:

table:
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

SCNR.
Bye,
Thomas
 
Hallo

wie definiere ich im ROM-Bereich des o.g. eine Tabelle mit 256 Einträgen
a
16 bit?


mit 256 * .dw ist es zu aufendig.


.cseg
table: .dw 0x00, 0x01, 0x02, 0x03, ...
.dw 0x10, 0x11, 0x12, 0x13, ....


Schon mal in die Doku geschaut?

http://www.atmel.com/dyn/resources/prod_documents/doc1022.pdf

Georg
 
R.Freitag <rfr-mailbox@gmx.de> schrieb im Beitrag <c12lbr$ees$2@newsreader2.netcologne.de>...
wie definiere ich im ROM-Bereich des o.g. eine Tabelle mit 256 Einträgen a
16 bit? mit 256 * .dw ist es zu aufendig.

Die Eintraege sollen ja wohl nicht alle 0 sein, also was sonst ausser DW ?
--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
 
"R.Freitag" wrote:
Hallo

wie definiere ich im ROM-Bereich des o.g. eine Tabelle mit 256 Einträgen a
16 bit?

mit 256 * .dw ist es zu aufendig.

Robert
.rept 256
.byte 0x23,0x45
.endr

würde ich beim avr-as bzw. gcc verwenden :)
Die Repeats und endr. lassen sich dabei auch beliebig schachteln.


Mir ist allerdings nicht klar welchen Inhalt das ganze dann haben soll
:)



Gruß
Klaus
 
Klaus Rudolph wrote:

"R.Freitag" wrote:


Mir ist allerdings nicht klar welchen Inhalt das ganze dann haben soll
:)

Ich habe eine Reihe von Unterprogrammen, die mit ijmp ausgeführt werden
sollen. Der Befehl ijmp verzweigt dahin, wo das z-Register hinzeigt.

Der Inhalt des Z-Registers soll jetzt gebildet werden. Das bedeutet, dass
ich eine Adresse aus einer Tabelle lesen muss.

Beispiel: ich will Befehl Nr 60 ausführen, dann lade ich 60, shifte das
einmal nach links und addiere das Ergebnis des Shiftens (mit Cy) zum
Tabellenoffset. Im adressiertem Feld steht dann die 16-bit-Sprungadresse,
die in das Z-Register geladen wird.

Am einfachsten hätte ich gerne eine Tabelle mit Labeln der Unterprogramme.

Für Ideen dankbar

Robert
 
Warum schreibst du dann nicht einfach die Labels in die .dw Zeilen?

label1: ...

..dw label1


mfg
Andreas

R.Freitag wrote:
Klaus Rudolph wrote:

"R.Freitag" wrote:


Mir ist allerdings nicht klar welchen Inhalt das ganze dann haben soll
:)

Ich habe eine Reihe von Unterprogrammen, die mit ijmp ausgeführt werden
sollen. Der Befehl ijmp verzweigt dahin, wo das z-Register hinzeigt.

Der Inhalt des Z-Registers soll jetzt gebildet werden. Das bedeutet, dass
ich eine Adresse aus einer Tabelle lesen muss.

Beispiel: ich will Befehl Nr 60 ausführen, dann lade ich 60, shifte das
einmal nach links und addiere das Ergebnis des Shiftens (mit Cy) zum
Tabellenoffset. Im adressiertem Feld steht dann die 16-bit-Sprungadresse,
die in das Z-Register geladen wird.

Am einfachsten hätte ich gerne eine Tabelle mit Labeln der Unterprogramme.

Für Ideen dankbar

Robert
 
"R.Freitag" wrote:
Klaus Rudolph wrote:

"R.Freitag" wrote:


Mir ist allerdings nicht klar welchen Inhalt das ganze dann haben soll
:)

Ich habe eine Reihe von Unterprogrammen, die mit ijmp ausgeführt werden
sollen. Der Befehl ijmp verzweigt dahin, wo das z-Register hinzeigt.

Der Inhalt des Z-Registers soll jetzt gebildet werden. Das bedeutet, dass
ich eine Adresse aus einer Tabelle lesen muss.

Beispiel: ich will Befehl Nr 60 ausführen, dann lade ich 60, shifte das
einmal nach links und addiere das Ergebnis des Shiftens (mit Cy) zum
Tabellenoffset. Im adressiertem Feld steht dann die 16-bit-Sprungadresse,
die in das Z-Register geladen wird.

Am einfachsten hätte ich gerne eine Tabelle mit Labeln der Unterprogramme.

Für Ideen dankbar
Ja und warum das alles in manuellen Tabellen???? Das geht auch in C
völlig ohne
Overhead:

void f1(void) {
}

void f2(void) {
}

void f3(void) {
}

#define FLASH __attribute__ ((progmem))

void FLASH (*const ptr[] )() = {
f1,
f2,
f3
};

int main() {
int tt;
for (tt=0; tt<3; tt++) {
ptr[tt]();
}

return 0;
}

Der Compiler baut Dir Deine Tabelle:
0000001a <__ctors_end>:
1a: 2c 00 .word 0x002c ;
1c: 2d 00 .word 0x002d ;
1e: 2e 00 .word 0x002e ;

Und der Zugriff ist wie gewünscht:
66: ca e1 ldi r28, 0x1A ; 26 Y wird mit dem
Zeiger auf die tabelle geladen
68: d0 e0 ldi r29, 0x00 ; 0
6a: 0c 2f mov r16, r28 integer counter //ist ja nur
wg. der for schleife
6c: 1d 2f mov r17, r29
6e: 0c 5f subi r16, 0xFC ; 252
70: 1f 4f sbci r17, 0xFF ; 255
72: e9 91 ld r30, Y+ und hier wird aus der tabelle
der Wert nach Z gebracht
74: f9 91 ld r31, Y+
76: 09 95 icall und per icall die Funktion ge-icalled
78: 0c 17 cp r16, r28 und wieder der rest der
for-Schleife
7a: 1d 07 cpc r17, r29
7c: d4 f7 brge .-12 ; 0x72


Wozu bitte Assembler?????

Nur mal so als Anregung, den C ist besser als der Ruf. Mit -mint8 kann
man auch mit 8 Bit
integern Schleifen bauen usw. Besser kriegst Du es nicht hin....

Wenn doch, ich wills sehen :))))

Gruß
Klaus
 

Welcome to EDABoard.com

Sponsor

Back
Top