Hallo,
ich habe ein kleines Problem an dem ich mir zurzeit die Zähne ausbeisse,
und zwar möchte ich eine Variable in einen String einfügen und diesen
dann mit Festkommaarithmetik in eine "Komma-Zahl" umwandeln, aber leider
weis ich nicht wie ich das machen soll. Ich habe mir schon die Seite
"http://www.mikrocontroller.net/articles/Festkommaarithmetik" durch
gelesen und es funktioniert auch soweit alles nur das mit der Variable
geht nicht?!
Evtl habt Ihr eine Idee oder einen Denkanstoß für mich ?
Hey, danke für die Antwort mein Ziel ist es mit dem Adc einen Wert
einlesen den dann umzurechnen und dann mit Komma zu versehen. z.b
Adc-wert 1023 dann umrechnen 1023*375/128 wäre 2997 möchte aber dann auf
dem Display 29.97 stehen haben. Oder gibt es da einen anderen Weg? Ich
muss auch zugeben das ich noch am Anfang stehe aber bis jetzt doch gut
durch gekommen sind bin:-) Zur Zeit ändere ich noch die variable mit
tasten da ich den adc noch erstmal aussen vor lasse.
Hallo Daniel,
ich weiss nicht, ob ich Deine Frage richtig verstanden habe, aber so wie
ich das sehe, reicht ja das umrechnen ganz normal. Dann müsstest Du
einen Float bekommen. Diesen musst Du dann noch in einen String pappen,
da bietet sich sprintf an.
Grüsse,
René
Hallo René
leider klappt das mit dem float und dem sprintf nicht so richtig, auf
dem Display steht dann leider nichts, ich habe mal meinen ganzen code
angehangen ich würde schon gerne die Festkomma-Funktion nutzen.
> Evtl habt Ihr eine Idee oder einen Denkanstoß für mich ?>> void my_print_LCD(char* string, uint8_t start, uint8_t komma, uint8_t frac)
Die Idee hinter diesem my_print_LCD ist es, so benutzt zu werden
1
charbuf[8];
2
intvalue=1234;
3
4
itoa(value,buf,10);
5
my_print_LCD(buf,0,2,2);
d.h. das ist in erster Linie eine String-Ausgabe Funktion, die
allerdings davon ausgeht, dass in diesem String Zahlendarstellungen
enthalten sind. Ergo musst du dir aus deiner Zahl erst mal einen String
machen. Und genau da kommt itoa ins Spiel.
Im übrigen hat diese Funktion keinerlei Vorkehrungen dafür, wenn die
Formatierung nicht mit dem Text übereinstimmt. Um universell benutzbar
zu sein, müsste man da also noch nachlegen.
1
charbuf[8];
2
intvalue=1234;
3
4
sprintf(buf,"%2d.%02d",value/100,value%100);
5
lcd_string(buf);
ist einfacher, wenn du dir das bischen Mehrcode durch sprintf leisten
kannst.
Edit:
Ich seh grad, du hast dir vom Original auch 2 Funktionen
1
voidmy_uitoa(uint32_tzahl,char*string)
2
voidmy_round(char*string,uint8_tdigit)
mitkopiert.
Mit denen geht das. my_uitoa ist als Ersatz für itoa gedacht. Die sind
zum Zusammenspiel mit deiner my_print_LCD gedacht.
Daniel Pfeiffer schrieb:> Hey, danke für die Antwort mein Ziel ist es mit dem Adc einen Wert> einlesen den dann umzurechnen und dann mit Komma zu versehen. z.b> Adc-wert 1023 dann umrechnen 1023*375/128 wäre 2997 möchte aber dann auf> dem Display 29.97 stehen haben. Oder gibt es da einen anderen Weg? Ich> muss auch zugeben das ich noch am Anfang stehe aber bis jetzt doch gut> durch gekommen sind bin:-) Zur Zeit ändere ich noch die variable mit> tasten da ich den adc noch erstmal aussen vor lasse.
Hi,
also hast du den Wert als int/uint vorliegen und möchtest den quasi
durch 100 Teilen?!
int16_t upper = adc_value/100; //links vom komma
uint16_t lower = adc_value%100; //rechts vom komma
also bei 2997 wäre upper = 29 und lower = 97. Dann brauchst du das nur
noch ausgeben.
Gruß
Karl Heinz schrieb:> Edit:> Ich seh grad, du hast dir vom Original auch 2 Funktionen>
1
>voidmy_uitoa(uint32_tzahl,char*string)
2
>voidmy_round(char*string,uint8_tdigit)
3
>
>> mitkopiert.> Mit denen geht das. my_uitoa ist als Ersatz für itoa gedacht. Die sind> zum Zusammenspiel mit deiner my_print_LCD gedacht.
Aber Achtung
1
voidmy_uitoa(uint32_tzahl,char*string)
2
{
3
int8_ti;
4
5
string[10]='\0';
6
for(i=9;i>=0;i--)
7
{
8
string[i]=(zahl%10)+'0';
9
zahl/=10;
10
}
11
}
will ganz offensichtlich ein char Array der Länge 11 haben, um dort den
String reinzuschreiben.