Software-Probs???

Gast #221487
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ß
Gast
> 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.
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.
Gast
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 :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.