Frage zu AVRStudio und LookupTables

OP Persönliche Seite #355797
Lesenswert?
• ▲
▼
Hoi,

Folgendes:

Ich habe eine Lookuptable im Flash
1
lut:
2
db 0x01, 0x10, 0x50, 0xFF

Nun möchte ich zu eines dieser Bytes springen. Dabei soll aber das
angesprungene Byte von einem anderen Wert abhängen. Also
1
ldi r16, 2    ;2. Byte
2
ldi r1, 0
3

4
ldi ZL, LOW(2*lut)
5
ldi ZH, HIGH(2*lut)
6

7
add ZL, r16
8
adc ZH, r1

Das wäre die Methode, wie ich das machen würde. Labeladresse auf
Byteaddressierung erweitern (*2) und das passende Byte anspringen.

Ist dies so korrekt? Oder muss erst alles addiert werden, und danach
multipliziert?
Gast #355798
Lesenswert?
• ▲
▼
das klappt, so lannge ZL NICHT 254 / 255 hat, an sonsten ist ZL 0 oder 1
und ZH aendert sich nicht.

wenn du eine konstante addieren willst, mach es mit
adiw Z, 0x02

an sonsten musst du das carry flag abfragen, und wenn gesetzt ZH
incrementieren
gruss
Gast #355799
Lesenswert?
• ▲
▼
Hi Simon,
du willst wahrscheinlich wissen,
ob du den Tabellenoffset (in deinem Beispiel die 2)
auch mal zwei nehmen musst, wie die Adresse der Tabelle.
Nein, nur wenn du dich auf Labels (lut:)
im Flashspeicher beziehst, musst du umrechnen.

MfG Willi
Gast #355800
Lesenswert?
• ▲
▼
> das klappt, so lannge ZL NICHT 254 / 255 hat, an sonsten ist ZL 0
> oder 1 und ZH aendert sich nicht.

Quatsch.

> wenn du eine konstante addieren willst, mach es mit
> adiw Z, 0x02

Das geht auch, aber nur für Konstanten bis 63.

> an sonsten musst du das carry flag abfragen, und wenn gesetzt ZH
> incrementieren

Genau das macht das adc in Simons Code.
Gast #355802
Lesenswert?
• ▲
▼
>>@Jens: Warum sollte das so sein? Beim zweiten mal benutze ich statt
>>'add' nämlich 'adc'. Da wird das Carryflag mitaddiert.

durch das schieben ist die zahl maximal 4 Bit gross.
wenn du nun das 'A'-1 addierst hast du nie mehr als 0xff
'A'-1 muesste um die 40 liegen habs gerade nicht im kopf
somit kommst auf maximal 55 :D
Gast #355805
Lesenswert?
• ▲
▼
@Jens: Ich frage mich worüber du hier spricht. Sicher, daß du im
richtigen Thread geantwortet hast? Oder ist es nur zu warm? ;-)

> durch das schieben ist die zahl maximal 4 Bit gross.

Schieben? Wo?

> wenn du nun das 'A'-1 addierst

Wieso 'A'? Es geht hier doch nicht um irgendwelche ASCII-Zeichen.

> 'A'-1 muesste um die 40 liegen habs gerade nicht im kopf
> somit kommst auf maximal 55 :D

Du meinst, er will Buchstaben von A bis O darstellen?

> adc kannst sicher nehmen, nur musst du es nicht.

Oben hast du noch gesagt, er muß das Carry-Flag mitaddieren, was das
adc ja auch tut.

> die register können nicht überlaufen

Das kommt drauf an, wo die LUT im Speicher ist und wie groß sie ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren