Rechnen ist schwer

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

Reply to
Peter Thoms
Loading thread data ...

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

Reply to
Udo Pi

"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/
Reply to
MaWin

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

Reply to
Peter Thoms

Am 10.02.2017 um 11:54 schrieb MaWin:

Hallo,

sign_int_16Bit_Rechenwert = int_8_Bit_AD-WandlerWert

und gut?

Peter

Reply to
Peter Thoms

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

Reply to
Edzard Egberts

Am 10.02.2017 um 13:17 schrieb Edzard Egberts:

stdint.h:

int8_t int16_t int32_t uint8_t uint16_t uint32_t

Reply to
Heiko Lechner

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

Reply to
Michael Bäuerle

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

Reply to
Hans-Peter Diettrich

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

Reply to
Michael Bäuerle

"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/
Reply to
MaWin

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;

Reply to
Edzard Egberts

Am 10.02.2017 um 10:51 schrieb Peter Thoms:

Hallo,

vielen Dank an alle!

bisschen Nervensache.

Peter

Reply to
Peter Thoms

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.
Reply to
Johannes Bauer

Johannes

--
>> Wo hattest Du das Beben nochmal GENAU vorhergesagt? 


Kosmologen: Die Geheim-Vorhersage.
Reply to
Johannes Bauer

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.

Reply to
Edzard Egberts

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]

Reply to
Michael Bäuerle

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

ui8_AdcValue = ADCL;

Gerald

Reply to
Gerald Oppen

Am 10.02.2017 um 20:07 schrieb Gerald Oppen:

Hallo,

peter

Reply to
Peter Thoms

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.