Forum: Mikrocontroller und Digitale Elektronik Software-Probs???


von Schlunz (Gast)


Lesenswert?

Folgendes Software-Problem in C:

Ich habe ein struct definiert

struct speicher
{
    unsigned short strom;
    unsigned short strom_mess;
}var;

Diesen Speicherbereich initialisiere ich

void init_speicher
{
    var.strom=0x0000;
    var.strom_mess=0x0000;
}

Ich lese über den AD-Wandler innerhalb einer ISR einen Messwert ein,
und schreibe ihn ins struct "var.strom".
Soweit so gut! Nun möchte ich den realen Wert aus dem Messwert
berechnen und ins struct "var.strom_mess" schreiben. Allerdings
klappt das nicht. Ich versuche es auf diese Weise: (bspw)
var.strom_mess=var.strom*5.5
Ich kann diese Umrechnung weder in der ISR, noch innerhalb einer
Funktion vornehmen. Es klappt partout nicht!!!
Allerdings, kann ich per printf den berechneten Wert ausgeben
printf("%f", (var.strom*5.5));
Kann mir jemand evtl nen Tipp geben, wie ich diesen berechneten Wert
ins struct bringen kann???

Außerdem habe ich Probleme mit nem simplen Vergleich. Wenn ich bspw.
if(var.strom<14){...}
dann ist die Aussage nur dann wahr, wenn var.strom=0!!! Wie kann das??
Sollte nicht auch ein True rauskommen, wenn var.strom=13.9 etc ist???

Bin für jeden Tipp wirklich dankbar

Gruß

von Rolf Magnus (Gast)


Lesenswert?

> Folgendes Software-Problem in C:

Welcher Mikrocontroller?

> Allerdings klappt das nicht.

Was bedeutet das? Was genau erwartest du und was passiert statt
dessen?

> Ich versuche es auf diese Weise: (bspw)
> var.strom_mess=var.strom*5.5
> Ich kann diese Umrechnung weder in der ISR, noch innerhalb einer
> Funktion vornehmen. Es klappt partout nicht!!!

Nochmal: Was heißt: "Es klappt nicht"?

> Außerdem habe ich Probleme mit nem simplen Vergleich. Wenn ich
> bspw. if(var.strom<14){...}
> dann ist die Aussage nur dann wahr, wenn var.strom=0!!! Wie kann
> das??

Entweder der Compiler bzw. der Prozessor ist kaputt, oder du machst was
falsch. Mehr kann man aus dieser Fehlerbeschreibung nicht rausholen.

> Sollte nicht auch ein True rauskommen, wenn var.strom=13.9 etc
> ist???

var.strom kann nicht 13.9 sein, da du es als Ganzzahl definiert hast.

Sorry, wenn mein Posting etwas oberlehrerhaft klingt, aber mit deiner
Fehlerbeschreibung und der geringen Menge an Code, die du zeigst, kann
man wirklich nicht viel anfangen.

von Fritz G. (fritzg)


Lesenswert?

Wie hier im Forum schon etwas mehr als einmal erwähnt wurde:

Variablen die in ISR verwendet werden müssen volatile deklariert sein.

Der Compiler sieht:

var.strom=0;

printf var.strom

und schreibt natürlich 0 raus. Weil die Funktion (also deine ISR) nie
aufgerufen wurde.
Dafür ist volatile da, die sagt dem Compiler dass die Variable geändert
werden kann ohne dass er davon was weiss. Dann wird sie immer brav im
Speicher abgelegt statt im Register, wobei er bei obigen Beispiel er
sich ja ausrechnen kann, dass da 0 drinnen steht.

von Schlunz (Gast)


Lesenswert?

Okay, zunächst besten Dank der Kommentare. Bin jetzt ein wenig
vorangekommen. Inzwischen habe ich es geschafft, dass die berechneten
Werte im struct gespeichert werden. Das struct sieht nun so aus:

struct speicher
{
    volatile short strom;
    volatile float strom_calc;
}var;

Der gemessene Wert geht nach var.strom und der berechnete Wert nach
var.strom_calc. Kann beide Werte über printf auf Display ausgeben.
Wenn ich nun aber die Abfrage

if(var.strom_calc<14){...}

ausführen möchte, dann ist die Abfrage nur dann wahr, wenn
var.strom_calc = 0 (also nicht, wenn var.strom_calc = 1 oder 1.5 etc.
ist)!!!
Das verstehe ich nicht?!?!?
Hat da jemand evtl nen Tipp parat!!!???

P.S. Ich hoffe, die Infos, ich gegeben habe, sind ausreichend :-)

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.