mikrocontroller.net

Forum: Compiler & IDEs "Konstante" anlegen?


Autor: N8Surfer (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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


Autor: Hobbytroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint16_t myvar = pgm_read_word(EEPROM-Adresse);
if(myvar == newvar)
{
 foo(newvar);
}
else
{
 return;
}
Es müßte allerdings sogar folgendes gehen:
if(pgm_read_word(EEPROM-Adresse) == newvar)
{
 foo(newvar);
}
else
{
 return;
}
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):
volatile uint16_t myvar;

void getcompare()
{
  myvar = pgm_read_word(EEPROM-Adresse);
}

main()
{
 getcompare();
 // ab hier IRQs und alles andere ...
 while(1){}
}
Oder meintest Du was anderes ?
Aprospos #define ist eine Präprozessor Option, die feste Werte zur 
Compilierung einsetzt !
Beispiel:
#define myvar 12

...

if(myvar == newvar)
...
wird zu
if(12 == newvar)
...
Verstanden ?

Autor: N8Surfer (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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


Autor: Hobbytroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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__...
Findest Du aber sicherlich hier im Forum, wenn Du nach "PROGMEM" suchst 
;)

Autor: N8Surfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, vielen dank!

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.