Forum: Mikrocontroller und Digitale Elektronik Problem bei Vergleich zweier Variablen


von David (Gast)


Lesenswert?

Hallo Leute, ich hab ein Problem.
Bei der Programmierung eines ATmega128 in C mit AVRGCC hab ich folgendes 
Problem: Ich will gerne zwei Variablen miteinander vergleichen. Hab dazu 
folgeden Code aufgesetzt:

if(sensor_grad <= value_grad)
{
     regel_richtung = 1;
}
else
{
     regel_richtung = 0;
}

im debugger hab ich geprüft, welchen Wert die Variablen sensor_grad und 
value_grad haben, abhängig von meiner äußeren Beschaltung ändern die 
sich... aber, egal, ob value_grad größer oder kleiner sensor_grad ist, 
der macht immer nur den teil regel_richtung = 1...
beide variablen sind vom gleichen typ...
was mache ich falsch?
danke im voraus

von Kai G. (runtimeterror)


Lesenswert?

>beide variablen sind vom gleichen typ...
Welcher?
Welche Wertebereiche?

Ich empfehle übrigens den ternären Operator, falls verfügbar.

Gruß

Kai

von David (Gast)


Lesenswert?

der typ ist unsigned char... 0...255

von Kai G. (runtimeterror)


Lesenswert?

Hast du mal testweise konstante Werte für sensor_grad und value_grad vor 
dem Vergleich eingesetzt? Also den Code auf ein Minimum reduziert?

Ansonsten bräuchte ich das Ergebnis aus dem Disassembler - die 
Eigenheiten von C sind nicht ganz so mein Fachgebiet.

char wird nicht lexikalisch verglichen, oder?

>der macht immer nur den teil regel_richtung = 1...
Auf welche Art hast du das festgestellt?

Muss jetzt auch erstmal im Dunkeln stochern...

von holger (Gast)


Lesenswert?

>if(sensor_grad <= value_grad)
>{
>     regel_richtung = 1;
>}
>else
>{
>     regel_richtung = 0;
>}

Wenn avrgcc da Fehler macht würde keines
meiner Programme funktionieren.

Das Problem liegt ganz woanders im Quellcode.

von Jupps (Gast)


Lesenswert?

Wahrscheinlich schreibt der Interrupt die sensor_grad und die Variable 
ist nicht als volatile deklariert... schade ;-)

von David (Gast)


Lesenswert?

ähm, wie ist das mit dem volatile

von Fabian B. (fabs)


Lesenswert?

wenn du eine variable in einem interrupt beschreibst, sie im 
hauptprogramm aber nur liest wird sie vom compiler wegoptimiert weil er 
denkt die wird ja nie geschrieben (gibt aber glaub ich nen warning). 
wenn du die var aber als volaile deklarierst darf der compiler da nicht 
optimieren.

Gruß
Fabian

von holger (Gast)


Lesenswert?

volatile unsigned char sensor_grad;

von David (Gast)


Lesenswert?

so gehts... krass...
danke für die schnelle hilfe...
frag mich nur, wieso das unser prof. net für nötig hielt, das zu 
erwähnen...
vielen dank, lg :-)

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.