Rechnen ist schwer

Feb 10, 2017 29 Replies

Hallo,



wie denn das?



Ich stoppel gerade an einem AVR-Prozessor in C und bekomme vom 10-Bit AD-Wandler einen int-Wert von 8-Bit heraus, der mir erst mal reicht.



In dummer Weise aber nicht lange:



Wertebereich.


Wie geht das? Mit 25 Fallunterscheidungen im Integer-Bereich bleiben oder aber wie, die Betonung liegt auf wie, umstellen auf signed Integer?


peter


Wenn Du in der Regelung "signed" arbeitest, solltest Du den Wert in signed umwandeln:

10bit unsigned in signed int umwandeln, dann den Offset (127) abziehen.

Gruss Udo

"Peter Thoms" schrieb im Newsbeitrag news:o7k2f4$ln$ snipped-for-privacy@news.albasani.net...

100 abziehen ? Das Ergebnis in C hat dann sowieso 16 bit.
MaWin, Manfred Winterhoff, mawin at gmx dot net Homepage http://www.oocities.org/mwinterhoff/ dse-FAQ: http://dse-faq.elektronik-kompendium.de/

Am 10.02.2017 um 11:54 schrieb MaWin:

Am 10.02.2017 um 11:26 schrieb Udo Pi:

Hallo,

sign int 16Bit Rechenwert = int 8 Bit AD-WandlerWert

und gut?

Peter

Am 10.02.2017 um 11:54 schrieb MaWin:

Hallo,

sign_int_16Bit_Rechenwert = int_8_Bit_AD-WandlerWert

und gut?

Peter

Nimm' doch bitte richtige Typen ohne implizite Annahmen, das oben ist nur richtig, wenn "int_8_Bit" unsigned ist:

unsigned char AD_Value= Get_ADC() >> 2; // 10bit als 8bit uchar lesen signed short int Calc= AD_Value; // das ordnet Calc positive Werte von 0..255 zu

char AD_Value= Get_ADC() >> 2; // 10bit als 8bit char lesen signed short int Calc= AD_Value; // das ordnet Calc positive und negative Werte zu

Am 10.02.2017 um 13:17 schrieb Edzard Egberts:

stdint.h:

int8_t int16_t int32_t uint8_t uint16_t uint32_t

hier, wenn du mit 16Bit weiterrechnen willst, doch sinnvoll alle 10 Bits auszulesen:

uint16_t v; /* Bit ADLAR in Register ADMUX nicht gesetzt => "right adjusted" */ v = (uint16_t) ADCL; /* ADCL muss zuerst gelesen werden */ v |= (uint16_t) ADCH

Am 10.02.2017 um 10:51 schrieb Peter Thoms:

(0-1023) in einen beliebigen anderen (ganzzahligen) Bereich abzubilden. Siehe Reference zu map(), dort findest Du ein Beispiel und auch die Formel.

Oder Du programmierst das selbst: aus = (analogRead(A0) - 512) * irgendwas;

DoDi

hier, wenn du mit 16Bit weiterrechnen willst, doch sinnvoll alle 10 Bits auszulesen:

uint16_t v; /* Bit ADLAR in Register ADMUX nicht gesetzt => "right adjusted" */ v = (uint16_t) ADCL; /* ADCL muss zuerst gelesen werden */ v |= (uint16_t) ADCH

"Peter Thoms" schrieb im Newsbeitrag news:o7k8sb$hk0$ snipped-for-privacy@news.albasani.net...

Ja.

uint8_t wandlerwert = ADC>>2;

int16_t rechenwert = wandlerwert - 100;

MaWin, Manfred Winterhoff, mawin at gmx dot net Homepage http://www.oocities.org/mwinterhoff/ dse-FAQ: http://dse-faq.elektronik-kompendium.de/

Ich kann nicht davon ausgehen, dass Pter diese typedefs bekannt sind und

nichts hinzu. Was Du nicht ganz ausgeschrieben hast:

typedef unsigned char uint8_t; typedef signed short int int32_t; typedef signed char int8_t;

Am 10.02.2017 um 10:51 schrieb Peter Thoms:

Hallo,

vielen Dank an alle!

bisschen Nervensache.

Peter

Die zwei sind OK.

Das ist aber Quatsch:

signed short int x; _Static_assert(sizeof(x) == 4, "Failed");

x.c:2:1: error: static assertion failed: "Failed" _Static_assert(sizeof(x) == 4, "Failed");

Die stdint.h Typen sind immer zu bevorzugen, wenn man eine bestimmte

Johannes

>> Wo hattest Du das Beben nochmal GENAU vorhergesagt? Kosmologen: Die Geheim-Vorhersage.

Johannes

>> Wo hattest Du das Beben nochmal GENAU vorhergesagt? Kosmologen: Die Geheim-Vorhersage.

Stimmt, das sollte so aussehen:

typedef signed short int int16_t;

Ich benutze stdint.h selber, ich kenne aber auch den Unterschied zwischen "eingebauten" Typen und Definitionen.

Vermutlich ist die Arduino-Funktion 'map()' gemeint. Die schreibt man dann halt ggf. einfach selbst hin, ist laut [1] ja nicht wirklich kompliziert: | | long map(long x, long in_min, long in_max, long out_min, long out_max) | { | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; | }

Das rechnet so aber mit 'long int' was auf AVR 32 Bit hat. Wenn 'int'

_________________ [1]

Der andere Weg ist wenn die 8Bit reichen (warum den 8bitter mit 16Bit

ui8_AdcValue = ADCL;

Gerald

Am 10.02.2017 um 20:07 schrieb Gerald Oppen:

Hallo,

peter

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required