Hallo Zusammen
So habe Hilfe eines bestehenden Beitrages das Display DIP-204-4 zu
laufen gebracht! JUHU! (siehe
Beitrag "LCD EA DIP204-4 Initialisieren") Vielen Dank für das
Hinaufstellen Jochen A. (neurotoxer).
Jetzt habe ich ein kleines Problem. Integer sind ja ganze Zahlen. Die
Temperatur wird umgerechnet und anschliessend als ganze Zahl ausgegeben.
Wie bekomme ich da ein Komma über? also z.B. 23.1°C???
Dann habe ich noch eine Frage: Wieso bekomme ich negative Zahlen, wenn
ich den ADCW-Wert / 1024 * 150 rechne? Oder gar keine Zahl je nach
Anordnung? Wenn ich aber mache 150/1024 = 0.1465 daher die Umwanldung
auf die Temperatur value = value * 0.1465; funktioniert es.
150°C habe ich bei 1024 Bit.
Danke und Gruss Fox
1
#include<avr/io.h>
2
#include"display.h"
3
#include<stdlib.h>
4
5
#define F_CPU 8000000UL /* Quarz mit 8.0Mhz */
6
#include<util/delay.h>
7
8
intmain(void){
9
// DDRC=0b00000001; //led an PC0
10
display_init();
11
display_ptext("Display EA-DIP204-4",1,0);//erstes Koma = Reihe zweites Koma = Zeichenabstand von links
12
display_ptext("mit ATMega8",2,0);
13
display_ptext("Version 1.0",3,0);
14
display_ptext("Temperaturmessung",4,0);
15
//Endlosschleife
16
17
18
19
DDRC=0b11111100;//
20
PORTC=0b0000000;//
21
22
23
ADMUX=0;// Für interne Referenzspannung ADMUX = 0b11000000;
24
// auch ADMUX = 2; (Kanalnummer) oder ADMUX = 0b00000010;
25
ADCSRA=1<<ADEN|1<<ADPS2|1<<ADPS1|1<<ADPS0;// Initialisierung des ADC über das ADCSRA-Register
Das Komma bekommt man, indem man die Temperatur nicht in Grad, sondern
in Zehntelgrad berechnet. Also statt 23,1 eben 231. Und bei der Ausgabe
aufs LCD setzt man dann einfach ein Komma an der richtigen Stelle
dazwischen.
Ok das tönt super! Kein Problem zu Berechnen. Diese Idee hatte ich auch
schon.
Aber wie kann ich dieses Komma dort hineinfügen? Da habe ich keinen
blassen Schimmer.
Das wäre super, dann würde sich auch ein anderes Problem lösen, Wie kann
ich an einen Bestehenden Wert noch C schreiben, also 23.1 C.
Das wäre ja dann hier irgendwo:
1
display_ptext(TempW,4,15);
habe schon probiert mit & Zeichen also TempW & " C" ... geht aber nicht
so.
Komma bekommst du so:
int Variableohnekomma = 231;
int hintermkomma;
hintermkomma = Variableohnekomma % 10;
Variableohnekomma /= 10;
// Inhalt von hintermkomma ist 1
// Inhalt von Variableohnekomma ist 23
//Jetzt einfach erst die Variableohnekomma ausgeben und anschließend ein
Komma ausgeben und zum Schluss hintermkomma ausgeben.
printf("%d",Variableohnekomma);
printf(",");
printf("%d",hintermkomma);
Gruß
geo
Hallo Fox,
das Komma kannst du einbauen, wenn du die Zahl in zwei Komponenten
zerlegst:
Vorkomma- und Nachkommaziffern, z.B. mit 'div' und 'sprintf':
char *sitofix2 ( char *string, int i )
{
div_t di = div(i, 100); // Struktur für Quotient und Rest.
char *sformat = i < 0 ? "-%d,%02d" : "%d,%02d";
sprintf(string, sformat, abs(di.quot), abs(di.rem));
return string;
}
Hier wird aus der ganzen Zahl i ein String mit 2 Nachkommastellen
erzeugt,
z.B. bei i=1234 wird string="12,34", also etwa so:
char s[20];
display_ptext( sitofix(s, 1234), 1, 0);
Schöne Grüsse,
Franz
So Danke für Hilfe
Die Lösung ist nach Jonny Obivan realisiert.
Nach Franz Hamberger bekomme ich Fehler beim Komplieren: (sitofix2 ist
nicht deklariert etc.
Jetzt funktioniert es:
So jetzt kommts langsam gut!
Was denkt Ihr, dass der Counter anspricht, muss ich praktisch Real-Time
haben. Das Problem ist, dass mir der Wert pro Sekunde weiss nicht wie
viel Male aktualisiert wird.
Was wäre die schlauste Lösung für ein Update alle 500-1000ms?
Gruss Fox
Hallo Fox,
hier die korrigierte Version:
... das Komma kannst du einbauen, wenn du die Zahl in zwei Komponenten
zerlegst:
Vorkomma- und Nachkommaziffern, z.B. mit 'div' und 'sprintf':
char *sitofix2 ( char *string, int i )
{
div_t di = div(i, 100); // Struktur für Quotient und Rest.
char *sformat = i < 0 ? "-%d,%02d" : "%d,%02d";
sprintf(string, sformat, abs(di.quot), abs(di.rem));
return string;
}
Hier wird aus der ganzen Zahl i ein String mit 2 Nachkommastellen
erzeugt,
z.B. bei i=1234 wird string="12,34", also etwa so:
char s[20];
display_ptext( sitofix2(s, 1234), 1, 0); // <-- muss sitofix2 heissen.
Schöne Grüsse,
Franz