Hoi,
Folgendes:
Ich habe eine Lookuptable im Flash
1
lut:
2
db0x01,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
ldir16,2;2.Byte
2
ldir1,0
3
4
ldiZL,LOW(2*lut)
5
ldiZH,HIGH(2*lut)
6
7
addZL,r16
8
adcZH,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?
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
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
> 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.
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.
>>@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
@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.