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ß
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.