hi, ich lese am anfang von meinem programm einen wert (16bit) aus einem eeprom den immer wieder zum vergleich brauche. gibt es eine möglichkeit, diesen als eine art konstante zu speichern (so wie bei #define xxx ###) um nicht auf dauer im programm ein 16bit register zu verlieren? den wert im mc-programm ablegen geht nicht, da er teil einer ablaufsteuerung ist, deren paramter ich mit verschiedenen eeproms für verschiedene programme speicher, und jeweils zu dem eeprom gehört. das ganze läuft unter c prog. mit avr-gcc. wenn ihr mir zu eurem vorschlag beispiel-code zufügt, bin ich euch sehr dankbar! grüßle flo
> diesen als eine art konstante zu speichern um nicht auf > dauer im programm ein 16bit register zu verlieren? Eine Konstante ist etwas, von dem der Compiler den Zahlenwert kennt. Da du den Wert aber aus dem EEprom liest, kann es per Definition keine Konstante sein. #define speichert gar nichts. #define vereinbart lediglich mit dem Preprozessor eine Textersetzung. Wenn du machst #define MY 3 int main() { printf( "%d", MY ); } denn läuft vor dem eigentlichen Compiler der Preprozessor über den Quelltext. Das #define ist die Anweisung an den Preprzessor eine Textersetzung zu machen. Überall wo im Quelltext MY steht, soll er statt dessen 3 einsetzen. D.h. der Preprozessor ändert das Programm um zu: int main() { printf( "%d", 3 ); } und erst dieses Programm geht dann durch den Compiler.
Ich verstehe Dein Problem gerade nicht ? Ist Dir der zugriff auf's EEPROM zu langsam als das Du (GCC) via PROGMEM Funktionen darauf zugreifen kannst ? Im Programm gehen Dir logischerwiese immer 16bit "verloren", sobald Du etwas aktiv lädst und verwendest. Üblicherweise sieht sowas folgendermaßen aus:
1 | uint16_t myvar = pgm_read_word(EEPROM-Adresse); |
2 | if(myvar == newvar) |
3 | {
|
4 | foo(newvar); |
5 | }
|
6 | else
|
7 | {
|
8 | return; |
9 | }
|
Es müßte allerdings sogar folgendes gehen:
1 | if(pgm_read_word(EEPROM-Adresse) == newvar) |
2 | {
|
3 | foo(newvar); |
4 | }
|
5 | else
|
6 | {
|
7 | return; |
8 | }
|
Wenn ich mich irren sollte, bitte korrigieren ;) Solltest Du das in verschiedenen IRQs brauchen müßte es folgendermaßen aussehen (dann geht Dir 16bit verloren, ist aber nicht zu vermeiden):
1 | volatile uint16_t myvar; |
2 | |
3 | void getcompare() |
4 | {
|
5 | myvar = pgm_read_word(EEPROM-Adresse); |
6 | }
|
7 | |
8 | main() |
9 | {
|
10 | getcompare(); |
11 | // ab hier IRQs und alles andere ...
|
12 | while(1){} |
13 | }
|
Oder meintest Du was anderes ? Aprospos #define ist eine Präprozessor Option, die feste Werte zur Compilierung einsetzt ! Beispiel:
1 | #define myvar 12
|
2 | |
3 | ...
|
4 | |
5 | if(myvar == newvar) |
6 | ...
|
wird zu
1 | if(12 == newvar) |
2 | ...
|
Verstanden ?
hi, erstmal danke für die antworten! dass ich mit dem define hier eine welle lostreten würde war mir klar :D mein fehler, nicht klar genug ausgedrückt^^ sorry. ich hab meinen mc, der eine ablaufsteuerung darstellt. die werte die er steuert, stehen in einem externen eeprom. 1 eeprom = 1 "programm". wenn ich ein anderes programm (werte die gesteuert werden) will, wechsle ich das eeprom. und der wert den ich hinterlegen möchte ist von "programm" (eeprom) zu programm unterschiedlich, der mc ist aber immer der gleiche. damit ich den wert nicht permanent(!!!) in einem 16bit register vorhalten muss, wollte ich den irgendwo am anfang wenn ich den mc einschalte hinterlegen. weiss etz auch wie, werd den ins interne eeprom schreiben, wie hobbytroniker es beschrieben hat. mal gucken ob da wieder ein register zu retten ist :D vielen dank nochmal!
> damit ich den wert nicht permanent(!!!) in einem 16bit register > vorhalten muss, wollte ich den irgendwo am anfang wenn ich den mc > einschalte hinterlegen. Warum faselst du da ständig von permanent in einem Register halten?Das passiert mit allergrößter Wahrscheinlichkeit sowieso nicht. Hol den Wert aus dem EEprom in eine globale Variable. Wenn die Variable benutzt wird, dann kümmert sich schon der Copiler darum, dass der Wert aus dieser Variablen in ein Register geholt wird, benutzt wird und anschliessend das Register für andere Zwecke wieder freigemacht wird.
Kleiner Tipp: Zitat: >... ich lese am anfang von meinem programm einen wert (16bit) aus einem >eeprom den immer wieder zum vergleich brauche. Immer gleich eineindeutig schreiben, das es sich um VERSCHIEDENE externe EEPROMS handelt ! In Deinem Falle mußt Du lediglich eine Funktion schreiben, die beim Start des Programms aus dem externen EEPROM den Vergleichswert ins interne EEPROM schreibt und dann dieses verwenden. Wobei Du vielleicht noch testen solltest, ob die Zeit zwischen internem Zugriff und externem Zugriff wirklich so kritisch ist ! Infos zur AVR-Lib und speziell EEPROM gibt's hier: http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html Findest Du aber sicherlich hier im Forum, wenn Du nach "PROGMEM" suchst ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.