www.mikrocontroller.net

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


Autor: Schlunz (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Fritz Ganter (fritzg)
Datum:

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

Autor: Schlunz (Gast)
Datum:

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

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.