Forum: Mikrocontroller und Digitale Elektronik Umgang mit Tabellen


von Philipp (Gast)


Lesenswert?

Hallo,

ich habe ein Verständnisproblem bei der Handhabung von Arrays im AVR 
Studio. Mit der AVR Lib greift man auf Arrays scheinbar wie folgt zu:
1
    for(tmp=0; tmp<=7; tmp++){
2
      OCR1A = pgm_read_word(pwmtable_8B+tmp);
3
      ... 
4
    }

Normalerweise kenn ich das in C so:
1
    for(tmp=0; tmp<=7; tmp++){
2
      OCR1A = pwmtable_8B[tmp];
3
      ...
4
    }

Wenn ich jetzt mit zwei unterschiedlichen Variablen auf dieselbe Tabelle 
zugreifen will kommt es zu folgendem Problem:
1
    for(tmp=0; tmp<=7; tmp++){
2
      OCR1A = pgm_read_word(pwmtable_8B+2);
3
      OCR1B = pgm_read_word(pwmtable_8B+6);
4
      ...
5
    }

In normal C würde sowas mit der o.g. Methode funktionieren, aber mit der 
AVR Lib geht das irgendwie schief und er zählt jedes mal "weiter" sprich 
OCR1B wäre nicht "+6" sondern "+8". Woran liegt das? kann man das 
Problem "umgehen"?

Grüße,

Philipp

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Der erste Code greift auf das Flash zu, daher "pgm_read_word".
Mit dem zweiten Code greifst Du auf das RAM zu.

Was Du mit dem dritten Code möchtest und was Deine Beschreibung bedeuten 
soll, verstehe ich nicht.

von Philipp (Gast)


Lesenswert?

Das heißt wenn ich im Flash lesen will nehm ich die eine Funktion; im 
RAM die andere. OK!

Dann hab ich noch zwei fragen.

Woher weiß ich wieviel vom RAM benutzt wird?

Frage Zwei:

Christian H. schrieb:
> Was Du mit dem dritten Code möchtest und was Deine Beschreibung bedeuten
> soll, verstehe ich nicht.

Nochmal:

Ich habe folgenden Code:

uint16_t pwmtable_8B[10] PROGMEM = [0,1,2,3,4,5,6,7,8,9];

>       OCR1A = pgm_read_word(pwmtable_8B+2);
>       OCR1B = pgm_read_word(pwmtable_8B+6);

Also müßte OCR1A = 2 sein und OCR1B = 6. Dem ist aber nicht so! OCR1B = 
8!

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

1
ORC1A = pgm_read_word(&(pwmtable_8B[2]));
2
OCR1B = pgm_read_word(&(pwmtable_8B[6]));
Hoffe ich habe mich nicht vertan.

=> http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

von Bernd (Gast)


Lesenswert?

Christian H. schrieb:
> ORC1A = pgm_read_word(&(pwmtable_8B[2]));
> OCR1B = pgm_read_word(&(pwmtable_8B[6]));

Philipp schrieb:
>>       OCR1A = pgm_read_word(pwmtable_8B+2);
>>       OCR1B = pgm_read_word(pwmtable_8B+6);

das ist beides das gleiche,
der Fehler liegt woanders.
Ich vermute mal dass uns wieder Mal nicht der Originalcode gezeigt wird 
...

von Philipp (Gast)


Lesenswert?

Genau DAS habe ich gesucht.

Danke

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.