Forum: Mikrocontroller und Digitale Elektronik c51 Problem mit Initialisierung von globalen Variablen / extern /


von Markus M. (centrino)


Lesenswert?

Hallo,

ich programmiere hier auf einem c51 und verwende keil als 
editor/debugger (ich versuche ein paar Enocean-Module zu programmieren)

Ich würde gerne über mehrere c-Files hinaus auf eine globale Variable 
zugreifen, aber meine Initialisierungswerte werden einfach nicht so 
übernommen, wie ich mir das vorstelle. Ich versuche das Ganze mal 
beispielhaft darzustellen:

Ich habe mir dafür in meinem header.h (der in allen c-files, die auf die 
Variable zugreifen möchten, eingebunden wird) meine Variable als extern 
deklariert:
1
extern uint8 data my_count;

Nun möchte ich in meinem main.c in einer Funktion int CountTest(testvar) 
auf my_count zugreifen, deshalb habe ich my_count in main.c 
folgendermaßen vor void main() definiert und initialisiert:
1
uint8 data my_count=1;

Nun will ich in der besagten Funktion CountTest (die testvar übergeben 
bekommt) auf my_count zugreifen:
1
int CountTest(testvar)
2
{ 
3
 int i=0;
4
 if (testvar == 1)
5
   my_count++;
6
7
 ....
8
9
 if (my_count > 10)
10
   tu irgendwas;
11
 ....
12
13
}

Nun habe ich das Problem, dass sich my_count anscheinend nie ändert, mir 
kommt es so vor, als würde es immer wieder von neuem mit 1 initialisiert 
werden. Weise ich my_count keinen Wert zu, dann weist der Compiler ihm 
irgendeinen hohen (zufälligen?) Wert zu - da ich damit aber gerne zählen 
würde, brauche ich einen bestimmten Anfangswert.... Ich hätte die 
Funktion CountTest auch schon extern deklariert in der header.h mit 
(extern int CountTest(int testvar);) aber das bringt auch nicht wirklich 
was...

Was mache ich falsch?

Danke für jeden Tipp!

von g457 (Gast)


Lesenswert?

> Was mache ich falsch?

Sind Interrupts im Spiel?

von Markus M. (centrino)


Lesenswert?

Hallo,

nein, eigentlich sollte es keine Probleme mit Interrupts geben.

von Peter D. (peda)


Lesenswert?

Markus Meier schrieb:
> Weise ich my_count keinen Wert zu, dann weist der Compiler ihm
> irgendeinen hohen (zufälligen?) Wert zu

Nö.
Der Compiler nullt alle globalen/statischen Variablen ohne Zuweisung.

Der Fehler liegt also woanders.

von Ralf (Gast)


Lesenswert?

> ...my_count anscheinend nie ändert, mir kommt es so vor, als ...
Wieso schaust du dir im Simulator nicht an, was passiert? Dann wäre der 
"Anschein" weg und du hast einen Ansatzpunkt, wo's klemmt.

> Nun will ich in der besagten Funktion CountTest (die testvar übergeben
> bekommt) auf my_count zugreifen:
Und welchen Wert hat 'testvar'?
Nach deinem obigen Code wird 'my_count' nur inkrementiert, wenn 
'test_var' gleich eins ist.

Ralf

von Markus M. (centrino)


Lesenswert?

ja, so soll es auch sein, der wert von testvar stimmt. aber my_count 
kann ich weiterhin nicht initialisieren - hätte es schon als volatile 
deklariert, aber auch keine änderung..

von Matthias (Gast)


Lesenswert?

Kannst du mal die memory map aus dem Mapfile posten?

von Matthias (Gast)


Lesenswert?

Achso, und eine andere Frage: Watchdog ist aus?

von Markus M. (centrino)


Lesenswert?

wo finde ich das mapfile?

hmm watchdog ist nicht aus!

von Peter D. (peda)


Lesenswert?

Markus Meier schrieb:
> hmm watchdog ist nicht aus!

Und wie willst Du dann debuggen?

Den Watchdog implementiert man erst, nachdem die volle Funktion des 
Programms fertig gestellt ist.

von Markus M. (centrino)


Lesenswert?

naja, die grundsoftware ist eben schon fertiggestellt, ich möchte nun 
die firmware für das modul erweitern/modifizieren. dabei geht es um ein 
STM310-modul von enocean: 
http://www.enocean.com/en/download/STM31xHW-STMSEN_Firmware_V2.4.0.0.zip/

von Karl H. (kbuchegg)


Lesenswert?

Markus Meier schrieb:
> naja, die grundsoftware ist eben schon fertiggestellt, ich möchte nun
> die firmware für das modul erweitern/modifizieren.

... dann stell den Watchdog erst mal ab bzw. mach dir ein Testprojekt an 
dem du die grundsätzliche Problematik mit einem Einfachstbeispiel 
probierst.


Natürlich kann man nicht ausschliessen, dass dein Compiler Fehler hat. 
Die wahrscheinlichere Ursache ist aber, dass es irgendeinen Fehler im 
Programm gibt. Mit einem Einfachstbeispiel, welches sich erst mal nur 
auf diesen Problemkreis konzentriert kann man dieses im Vorfeld erst mal 
abklären.

von Markus M. (centrino)


Lesenswert?

ok, danke - ich werde zuerst den watchdog abstellen und dann versuchen 
das ganze mit einem noch einfacheren code zu testen.

bisher habe ich leider noch nicht ganz durchschaut, wie man bei diesen 
enocean-modulen am besten debuggt. ich habe mir ein paar leds angelötet, 
aber das ist auch nicht das wahre.. eigentlich hätte ich ja gerne per 
UART gedebuggt - wie bei meinen anderen µc-projekten auch - aber ich 
weiß noch nicht, wie ich das bei diesen modulen anstellen soll...

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.