mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik pgm_read_word() Problem


Autor: Matthias P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
    if (zaehler <= WertA) OCR1A = pgm_read_word(pwmtable_10+zaehler);
    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

Autor: Matthias P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mario H. (captorg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,

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

und
  #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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario H. (captorg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:
es muss natürlich
#define pgm_read_word_near(address_short) __LPM_word((uint16_t)(address_short))
heissen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.