Forum: Mikrocontroller und Digitale Elektronik Frage zu AVRStudio und LookupTables


von Simon K. (simon) Benutzerseite


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?

von Jens (Gast)


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

von Willi (Gast)


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

von Rolf Magnus (Gast)


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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Gut, also ist das so wohl richtig.

@Jens: Warum sollte das so sein? Beim zweiten mal benutze ich statt
'add' nämlich 'adc'. Da wird das Carryflag mitaddiert.

von Jens (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

@Jens: Versteh ich nicht.

von Jens (Gast)


Lesenswert?

adc kannst sicher nehmen, nur musst du es nicht.
die register können nicht überlaufen

von Rolf Magnus (Gast)


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.

von Jens (Gast)


Lesenswert?

Ooops

yap falscher Thrad sorry
is ein bissl zu warm ;D

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.