Forum: Mikrocontroller und Digitale Elektronik pgm_read_word() Problem


von Matthias P. (Gast)


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

von Matthias P. (Gast)


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?

von Mario H. (captorg)


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

von Hc Z. (mizch)


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.

von Mario H. (captorg)


Lesenswert?

Korrektur:
es muss natürlich
1
#define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short))
heissen.

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.