pgm_read_word() Problem

Gast #1612150
Lesenswert?

Hi Leute,

ich habe ein Problem mit einem Lookuptable.

Es sollen für 2 LEDs OCR1A und OCR1B linearisiert eingefadet werden. 
Prinzipiell Zählt ein Zähler in einer Schleife vom Anfang(0) bis zum 
Ende der Tabelle(63).
Die Werte werden wie folgt übergeben:
1
    if (zaehler <= WertA) OCR1A = pgm_read_word(pwmtable_10+zaehler);
2
    if (zaehler <= WertB) OCR1B = pgm_read_word(pwmtable_10+zaehler);

Nun bleibt der Zähler immer bei WertB "hängen", wenn WertB größer WertA 
ist. Deswegen wollt ich mal wissen, ob das an der Funktion pgm_read_word 
liegt und wie man das umgehen kann.

Matthias
Gast #1612280
Lesenswert?

Ich habe das Problem gelöst.

So ganz versteh ich die pgm_read_word() Funktion aber noch nicht. Wenn 
ich den Wert für meine PWM über pgm_read_word(pwmtable_10+zaehler) holen 
möchte. Was sind da die Grenzen? Was passiert wenn ich beispielsweise 
immer beim Hochdimmen "++" mache und ich über die Grenze 
(pgm_read_word(pwmtable_10+64)) komme? Geht es wieder bei Position 0 
los?
#1812792
Lesenswert?

Hallo Matthias,

in avr/pgmspace.h ist zu finden:
1
  #define pgm_read_word(address_short)    pgm_read_word_near(address_short)

und
1
  #define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short))

Die Adresse ist demnach ein WORD (16 Bit), sodass max. 65536 
Byteadressen angesprochen werden können. Mit Erreichen von 65535 erfolgt 
wie erwartet ein Überlauf.

Mfg,
Mario
#1812809
Lesenswert?

Matthias P. schrieb:
> Was passiert wenn ich beispielsweise
> immer beim Hochdimmen "++" mache und ich über die Grenze
> (pgm_read_word(pwmtable_10+64)) komme? Geht es wieder bei Position 0
> los?

Nein.  Das Argument von pgm_read_word() ist einfach eine Adresse.  Du 
bekommst also beim Hochzählen das, was hinter pwmtable_10 im Flash 
steht.  Weder C noch pgm_read_word kümmern sich um Arraygrenzen.

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