Forum: Compiler & IDEs "Konstante" anlegen?


von N8Surfer (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

> 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.


von Hobbytroniker (Gast)


Lesenswert?

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 ?

von N8Surfer (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

> 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.


von Hobbytroniker (Gast)


Lesenswert?

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 
;)

von N8Surfer (Gast)


Lesenswert?

ok, vielen dank!

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.