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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.