Forum: Mikrocontroller und Digitale Elektronik Kommazahlausgabe ADCMessung


von seens (Gast)


Lesenswert?

Hallo zusammen. Zusehen ist eine zweifache ADCMessung. Ich teile den 
Messwert durch 200 damit ich nur eine Zahl zwischen 0 und 5 habe(0-5V). 
Zur Zeit stehen nur ganze Zahlen da.(0 1 2 3 4 5). Wie kann ich es jetzt 
umschreiben, dass eine Kommazahl mit dabei ist.?
Danke euch
MfG
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
#include <stdlib.h>
6
#include <avr/pgmspace.h>
7
#include <stdint.h>
8
9
uint16_t adc_messung(uint8_t channel) {
10
ADMUX = 0b01000000;
11
ADMUX |= channel;
12
uint16_t messwert=0;
13
14
for (uint8_t i=0; i<5; i++) {   
15
ADCSRA |= (1<<ADSC);   
16
while ( !(ADCSRA & (1<<ADIF)) ) 
17
;   
18
messwert = (ADC)+messwert;
19
}
20
messwert /= 5;   
21
22
if (messwert > 1000){
23
  messwert = 1000;
24
}
25
return messwert/200; //Ausgabe 0V - 5V
26
}
27
28
29
30
int main(void){        
31
  
32
  ADMUX |= (0<<REFS1)|(1<<REFS0);
33
  ADCSRA |= (1<<ADEN);   
34
  ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);  
35
36
  uint16_t m1=0;    char puffer1[16];
37
  uint16_t m2=0;    char puffer2[16];
38
  
39
while (1) {  
40
41
    m1 = adc_messung(0);
42
    m2 = adc_messung(1);    
43
    itoa(m1,puffer1,10);
44
    itoa(m2,puffer2,10);           
45
    
46
    LCDSoftText("ADC6=    %",0,54,BLACK);
47
    LCDSoftText(puffer1,35,54,BLACK);
48
    LCDSoftText("ADC7=    %,",64,54,BLACK);
49
    LCDSoftText(puffer2,100,54,BLACK);
50
    LCD_refresh();  
51
  }
52
}

von Karl H. (kbuchegg)


Lesenswert?

Entweder du benutzt richtige Gleitkommavariablen und entsprechende 
Berechnungen oder du lässt dein 'Dogma' fallen, dass aus der Funktion 
unbedingt Werte in Volt rauskommen müssen.

WEnn du in Geld rechnest, hast du ja auch 2 Möglichkeiten. Entweder du 
rechnest alles in Euro, wodurch du ganz automatisch um Kommazahlen nicht 
rum kommst (denn wie willst du sonst €1.99 ausdrücken), oder aber du 
rechnest ganz einfach alles in Cent. Dann hast du statt €1.99 eben 199 
Cent und das ist wieder eine ganze Zahl.

Anstatt von in Volt könntest du zb in Zehntelvolt oder Hunderstelvolt 
rechnen. Sagt ja keiner, dass du eine 'Einheit' benutzen musst, die 
'üblich' sind.

von Falk B. (falk)


Lesenswert?

"Fixkommaarithmetik

Diese Seite enthält momentan noch keinen Text. Du kannst sie bearbeiten, 
ihren Titel auf anderen Seiten suchen oder die zugehörigen Logbücher 
betrachten."

Besser Festkommaarithmetik

von Karl H. (kbuchegg)


Lesenswert?

Falk Brunner schrieb:
>
> Besser Festkommaarithmetik

Danke Falk.
Ich kann mir den Link einfach nicht merken :-)

von seens (Gast)


Lesenswert?

das problem ist: wenn ich in der adc messung float anstatt uint_16 nehme 
und in der main float m1=0 zeigt mir mein display nichts mehr an. was 
mach ich falsch?

von seens (Gast)


Lesenswert?

PS: es geht um ein schulprojekt und da wollte ich schon dass 0.0 bis 5.0 
da steht ;)

von egal (Gast)


Lesenswert?

ich glaube du musst double nehmen.

von Karl H. (kbuchegg)


Lesenswert?

seens schrieb:
> das problem ist: wenn ich in der adc messung float anstatt uint_16 nehme
> und in der main float m1=0 zeigt mir mein display nichts mehr an. was
> mach ich falsch?

Wahrscheinlich hast du die Floating Point Library nicht eingebunden. 
Kann aber auch alles andere sein, kenne ja deinen Code nicht, wenn er 
auf Floating Point umgearbeitet ist.

FAQ
Der Punkt wo es um die Aktivierung der Floating Point Lib geht

von Karl H. (kbuchegg)


Lesenswert?

seens schrieb:
> PS: es geht um ein schulprojekt und da wollte ich schon dass 0.0 bis 5.0
> da steht ;)

Ja, und?
Was hindert dich daran, aus der ganzen Zahl zuerst den Vorkommaanteil 
durch eine Division durch 10 zu erhalten und dann einen '.' hinzumalen 
und den 'Nachkommaanteil' als den Rest von der Division auszugeben? 
(wenn du mit dem 10-fachen des Wertes operierst)

Um bei den Euro zu bleiben.
Sei
1
   uint16_t geld = 199;

dann kriegst du mit
1
  char puffer1[16];
2
3
  sprintf( puffer1, "%d.%02d Euro", geld / 100, geld % 100 );

ein wunderbares "1.99 Euro" in den String, das du ausgeben kannst. Kein 
Mensch weiß, dass du intern mit Cent (also dem 100-ten Teil eines Euros 
und damit 2 'Nachkommastellen') rechnest.

von seens (Gast)


Lesenswert?

Danke. Jetzt habe ich es richtig verstanden. :) Ist glaub die beste 
Lösung


MfG

von amateur (Gast)


Lesenswert?

Wenn man davon ausgeht, dass 200 Counts = 1,0V sind, kann man das 
Problem, am Offensichtlichsten folgendermaßen angehen:

Messwert = Wert vom A/D-Dingsbums.
Zeichen  = Zeichen für den Stringeinbau
Zaehler  = Keine Ahnung
String   = char [4]

Zeichen = '0';
for (Zaehler=0;Zaehler<6;Zaehler++) {
  if (Messwert > 199) {
    ++Zeichen;
    Messwert-=200;
  } else {
    break;
  }
}
String [0]=Zeichen;
String [1]= ’,’;          // oder Punkt
Zeichen = ’0’;
for (Zaehler=0;Zaehler<10;Zaehler++) {
  if (Messwert > 19) {
    ++Zeichen;
    Messwert-=20;
  } else {
    break;
  }
}
String [2]=Zeichen;
String [3]= '\0';

// Wenn gewünscht: char [5]
// und for mit ">=2" nochmal
// ist aber Glaubenssache

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.