Forum: Mikrocontroller und Digitale Elektronik AVR Assembler - Tabelle im Programmspeicher


von Peter (Gast)


Lesenswert?

Hallo,

ich habe eine Tabelle im Programmspeicher abgelegt und greife über lpm 
darauf zu. Über R16 steuere ich den Offset. In R17 steht dann der Wert:
1
clr r0
2
ldi r16, 0
3
ldi ZL, lo8(table)
4
ldi ZH, hi8(table)
5
add ZL, r16
6
adc ZH, r0          
7
lpm r17, Z
8
9
...
10
...
11
12
.section .progmem.data
13
.type table, @object
14
.size table, 8
15
table:
16
.byte  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07

Im Netz habe ich nun gelesen, dass man die Addresse der Tabelle um eins 
nach links schieben muss, und im Bit 0 dann das Low oder High Byte 
auswählt.

Wie man oben sieht, mache ich das ja nicht. Der Code funktioniert aber 
trotzdem.

Ist das nun Zufall (kann ich kaum glauben)? Oder woran liegt das?

Könnte es vlt. daran liegen, dass ich mit dem GCC arbeite, welcher mit 
der Libc mitkommt, und es sich da anders verhält?

Danke und Gruß, Peter

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Peter schrieb:
> Könnte es vlt. daran liegen, dass ich mit dem GCC arbeite, welcher mit
> der Libc mitkommt, und es sich da anders verhält?

 Ja.

 Adressen im Flash sind Wordadressen, im RAM sind es Byteadressen.
 In reinem Assembler würde dir das oben nicht durchgehen, bzw.
 die Flashadresse auf welche ZL:ZH zeigt, wäre um Faktor 2 kleiner.

von Timm T. (Gast)


Lesenswert?

Peter schrieb:
> Der Code funktioniert aber
> trotzdem.

Das glaube ich nicht.

Das muss so heissen:

ldi ZL, lo8(2 * table)
ldi ZH, hi8(2 * table)

Der Code liest zwar irgendwelche Bytes, aber nicht an der Stelle table, 
sondern irgendwo anders.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Hängt von den Makros 'lo8' und hi8' ab. Die sind mir nicht bekannt, aber 
wenn man 'low' und 'high' benutzt, dann ist schieben angesagt:
1
   ldi ZH, high(table << 1)           ;
2
   ldi ZL, low(table << 1)            ;
3
´

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wir können wohl davon ausgehen, daß 'lo8' und 'hi8', wie bereits 
vermutet, Makros sind, Die sich um diese Anpassung 'Tabelle im 
Programmspeicher' kümmern.
Mit diesen Makros eine Tabelle im DSEG anzusprechen, dürfte dann 
fehlschlagen.

Wieder: nicht der komplette Code oder hi8/lo8 sind interne Makros dieses 
Assembler (gibt's ja nun auch die eine oder andere Variante von ...)

MfG

von Stefan E. (sternst)


Lesenswert?

Patrick J. schrieb:
> Wir können wohl davon ausgehen, daß 'lo8' und 'hi8', wie bereits
> vermutet, Makros sind, Die sich um diese Anpassung 'Tabelle im
> Programmspeicher' kümmern.

Nicht wirklich.

Patrick J. schrieb:
> Mit diesen Makros eine Tabelle im DSEG anzusprechen, dürfte dann
> fehlschlagen.

Nein, auch das geht.

Der GCC, und damit auch der dazugehörige Assembler, arbeiten 
grundsätzlich Byte orientiert. Alle Label sind Byte-Adressen, egal ob 
Flash oder RAM. Datenzugriffe gehen daher "einfach so". Aber man braucht 
dann halt spezielle Vorkehrungen, wenn man die Wort-Adresse benötigt, 
z.B. für indirekte Sprünge oder Sprungtabellen.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Vielleicht sollte Peter doch ein wenig C-Code mit in sein Programm 
aufnehmen:
1
const uint8_t table[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
2
3
uint8_t getVal(uint8_t index)
4
{
5
  return table[index];
6
}

grinz

von Peter (Gast)


Lesenswert?

Timm T. schrieb:
> Peter schrieb:
>> Der Code funktioniert aber
>> trotzdem.
>
> Das glaube ich nicht.

Ich kann mich nur wiederholen: Das geht so.

Stefan E. schrieb:
> Der GCC, und damit auch der dazugehörige Assembler, arbeiten
> grundsätzlich Byte orientiert. Alle Label sind Byte-Adressen, egal ob
> Flash oder RAM. Datenzugriffe gehen daher "einfach so".

Und das wäre auch eine passende Erklärung dafür.

Gruß Peter

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.