Temperaturausgabe LCD Festkommaarithmetik

OP (Firma: Angestellter/Freelancer) #2371098
Lesenswert?
• ▲
▼
Hallo,

ich brauche Eure Unterstützung!
Ich habe einen NTC-Widerstand an den ADC angeschlossen und der µC 
ermittelt
mit Hilfe der gemessenen Spannung und der Steinhart-Hart Gleichung die 
Temperatur.

Die Temperatur wird in °C auf ein LCD ausgegeben. Soweit funktioniert es 
auch...
aber nur die Vorkommastellen werden angezeigt [Bsp. 25].

Ich möchte aber eine Kommazahl ausgeben lassen [Bsp. 00,00].

Ich habe mich über Festkommaarithmetik und ftoa() informiert, kann es 
aber nicht
konkret auf mein Projekt anwenden.

Probleme:

-Datentyp der Konstanten bzw. Variablen und deren Genauigkeit (zu genau, 
falscher Typ)

-Anwendung der Festkommaarithmetik auf die Formeln  (vorallem T=...) ???

Vielen Dank für jedwede Hilfe!

(bitte keine Verweise auf G..gle)
1
//Atmega32, 16MHz, RN-Control
2

3
#include <avr/io.h>
4
#include "lcd-routines.h"
5
#include <util/delay.h>
6
#include <math.h>
7
#include <stdlib.h>
8
 
9
int main(void)
10
{
11

12
const double A1= 0.003354016;
13
const double B1= 0.0002569850;
14
const double C1= 0.000002620131;
15
const double D1= 0.00000006383091;
16

17
double Vin;
18

19
double Analog;
20

21
double T;
22

23
double Rx;           
24

25
double R;
26

27
double Rref=9810;
28

29
char Buffer[25];
30

31
lcd_init();
32

33
ADCSRA |=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
34
//ADC Grundeinstellungen
35

36
while(1)
37
{
38

39
 ADCSRA |=(1<<ADSC);
40

41
 while(ADCSRA & (1<<ADSC))
42
 {;}
43

44
 Analog=ADC;
45

46
 Vin=(Analog*5)/1024;
47

48
 R=((5-Vin)/Vin)*Rref; //R(NTC)-Widerstand
49

50
 Rx=R/Rref;
51

52
 T=1/(A1+B1*log(Rx)+C1*log(Rx)*log(Rx)+D1*log(Rx)*log(Rx)*log(Rx));
53
 // Steinhart-Hart Gleichung
54
 
55
 T=T-273.15; //Konvertierung in °C
56

57
 lcd_setcursor(0,1);
58

59
 itoa(T,Buffer,10);
60

61
 lcd_string(Buffer);
62
 
63
 _delay_ms(500);
64
  
65
}
66
 return 0;
67
}
#2371138
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:
> Marvin B. schrieb:
>
>> Ich habe mich über Festkommaarithmetik und ftoa() informiert, kann es
>> aber nicht
>> konkret auf mein Projekt anwenden.
>
> da du sowieso schon double benutzt, kannst du ruhig auch ftoa benutzen.
> Was genau verwirrt dich an ftoa? Funktioniert fast genauso wie itoa.

Mein Fehler. Ich hab nicht mitgedacht. Ein ftoa gibt es ja gar nicht. Du 
brauchst dtostrf()
#2371154
Lesenswert?
• ▲
▼
Marvin B. schrieb:
> Marvin B. schrieb:
>> itoa(T,Buffer,10);
>
> Diesen Abschnitt durch dtostrf(T,Buffer,10) ersetzen oder andere
> Übergabeparameter ?

Wie wärs wenn du die Funktion ergoogelst um zu sehen welche Parameter 
sie haben will? Bei einer Gleitkommazahl gibt es noch mindestens einen 
Parameter mehr, der interessant ist: wieviele Nachkommastellen will man 
haben. Dafür sind die letzten 10 von itoa wieder eher uninteressant. 
Kein Mensch wird sich eine Gleikommazahl in Hexadezimal oder einem 
anderen Zahlen-System ausgeben lassen.
#2371162
Lesenswert?
• ▲
▼
Marvin B. schrieb:
> Marvin B. schrieb:
>> (bitte keine Verweise auf G..gle)

Gut. Dann nicht.
Wie wärs mit einem C-Buch


(Wir werden hier nicht für dich Abhandlungen über ein Thema schreiben, 
dass du problemlos und ausführlich in jedem Buch und/oder wahlweise in 
15 Sekunden ergoogeln kannst. Sorry. Ein wenig Eigeninitiative wird von 
dir erwartet. Was machst du, wenn die nächste Funktion ansteht, die du 
noch nie benutzt hast? Du kriegst gerne einen Funktionsnamen als 
Stichwort. Bei komplexeren Dingen auch mal eine Erklärung dazu. Aber im 
Allgemeinen Fall musst du lernen, dir mit einem Stichwort selbst zu 
helfen. Das ist heute einfacher als je zuvor)
#2371167
Lesenswert?
• ▲
▼
Marvin B. schrieb:
> dtostrf(double __val,signed char __width,unsigned char __prec, char*
> __s)
>
> dtostrf(double T,signed char ????? ,unsigned char 2, Buffer)
>
> ????? diesen Parameter verstehe ich nicht aus der Beschreibung?

OK.

val     ist klar. Das ist der Wert
width   wieviele Zeichen soll die Ausgabe insgesammt maximal breit
        sein.
        Das ist inklusive eines möglichen Vorzeichens und des
        Kommapunktes
prec    wieviele Zeichen von width sollen hinter dem Komma sein
s       buffer in den der String geschrieben werden soll (wie bei itoa)


  -78.345

wären also   width -> 7
             prec  -> 3

damit sind dann alle Zahlen von -99.999 bis +99.999 abbildbar. dennn 
alle diese Textrepräsentierungen benötigen 7 Zeichenpositionen. Wenn, 
wie zb bei 0.000 die 7 Zeichen nicht aufgebraucht werden, wird links mit 
Leerzeichen aufgefüllt.

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.