Kommazahlausgabe ADCMessung

Gast #3219371
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
}
#3219378
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.
#3219411
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
#3219422
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.
Gast #3219486
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

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