"if" wird nicht richtig ausgeführt

#5176608
Lesenswert?

Guten Abend!

Folgender code:
1
uint8_t radioAlt()
2
{
3
  uint16_t ra=0;
4

5
  ra=ADC;
6
  ra=~ra/16-192;                          
7
  
8
  if (ra>50)
9
  ra=50;  
10
  
11
  return ra;
12
}

Gibt konstant "50" aus.

Der "if" Teil auskommentiert erbringt, wie gewünscht, Werte zwischen 0 
und etwas über 50. (Ich lese einen IR Distanzmesser aus)

Auch an anderer Stelle im code wird ein einfaches

if (x<0)
x=0;

nicht ausgeführt sondern die negativen Werte einfach weitergeleitet.

Weiss jemand Rat?
#5176635
Lesenswert?

Da steht:
1
  uint16_t ra=0;
2

3
  ra=ADC;
4
  ra= ( (~ra) / 16 )-192;                      
5
}

ADC 12bit(max):   00001111 11111111
~                 11110000 00000000
/16               00001111 00000000 ->3839
-192.             3647

ADC 12bit(min):   00000000 00000000
~                 11111111 11111111
/16               00001111 11111111 ->4095
-192.             3903

Jede Zahl zwischen 3647 und 3903 ist größer 50

PS: für 10bit Wandler gilt das genau so mit anderen Zahlen
Gast #5176693
Lesenswert?

Attila C. schrieb:
> Carl: Wenn der if Teil auskommentiert ist geht es, wie ich bereits am
> Anfang sagte.

Dein Beispiel macht keinen Sinn. Du verwendest
- einen ADC
- "komplexe" Rechenoperationen (~)
- manchen nicht genehme typen etc.

Dein Problem kann ja ausschließlich in der einen Anweisung liegen:

[c]
if(ra>50) {ra=50;}
[c]

Es ist unwahrscheinlich, dass der Compiler dies falsch bearbeitet.

Reduziere also den Code auf das notwendige. Lass ihn z.B. in einer 
Schleife mit i=1..100 laufen, mit ra=i am Anfang.

Es wird sich herausstellen, dass
- Du den Code nicht korrekt abgeschrieben hast (z.B. ein Makro hinterm 
if, dass würde mit {} behoben)
- Du nach laden mit if (warum auch immer) wirklich nur Werte >=50 hast
- Du den code geladen hast, wo das if noch auskommentiert war, das ra=50 
aber schon nicht.

Mit ADC und ~ oder uint irgendwas hat es jedenfalls nichts zu tun.
#5176708
Lesenswert?

Attila C. schrieb:
> Carl und Stefan: Ganz genau!
>
> Ich habe jetzt mal ra vollständig auf dem Display ausgegeben und erhalte
> etwas um die 3800.
>
> Vielen Dank für die Hilfe!

Wenn du eine Wertefolge skalieren ("/16"), Steigung invertieren ("~") 
und verschieben willst ("-192"), dann am besten mit signed int (da die 
12bit aus dem ADC ja gut reinpassen) und nur mit signed-Operatoren.
Also kein Einer-Komplement ("~") und auch kein shift statt Division. Der 
Compiler kennt diese Tricks selber, aber er weiß auch, wann er sie 
benutzen darf. Erst wenn Bits und Takte ganz knapp werden, dann kann/muß 
man tricksen. Davor ist es nur verschwendete Zeit. ;-)
#5176716
Lesenswert?

Lothar M. schrieb:
> Attila C. schrieb:
>> Ich habe jetzt mal ra vollständig auf dem Display ausgegeben und erhalte
>> etwas um die 3800.
> Deine bitweise Neagtion ist dafür irgendwie die Ursache:
> Wenn du 0 vom ADC bekommst, dann kommen da 65535 heraus. Die geteilt
> durch 16 ergeben 4095. Davon 192 abgezogen ergeben irgendetwas "um die
> 3800"...

Und dann nur noch 8-Bit zurück gibst (vor allem, wenn du das if 
auskommentierst)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren