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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.