Hallo zusammen,
die folgende Funktion befindet sich in meiner funktionen.c (Ich lese
über ADC0 eine Spannung ein und will diese auf einem LCD ausgeben):
1
voidabfrage_spg_hc(void)
2
{
3
charspg_vor[5],spg_nach[5];//Variablen für Funktion deklarieren
4
uint16_tspg_utoa=0,spg=0;
5
floatresult=0;
6
chardata[12];
7
uint8_tlen=11;
8
9
ADCSR=0xc7;//ADC einschalten und konfigurieren; Teiler 128
10
11
while(!(spg_utoa==10))//arithm. Mittelwert bilden aus 10 Messungen
12
{
13
loop_until_bit_is_clear(ADCSR,ADSC);
14
result+=ADCW;
15
ADCSR|=(1<<ADSC);//ADC-Einzelmessung neustarten
16
spg_utoa++;
17
}
18
19
result/=10;
20
21
spg=result*5000/1024;
22
23
spg_utoa=spg%1000;//Wert für Nachkommazahl umwandeln
Ich möchte die beiden letzten Zeilen aber in meiner main.c benutzen.
Also habe ich die Funktion so umgewandelt, das die Variablen spg_vor und
spg_nach mit Hilfe von Zeigern auch ausserhalb dieser Funktion zu
Verfügung stehen. Wenn ich es denn dann richtig gemacht habe.
funktion.c:
1
voidabfrage_spg_hc(char*spg_vor,char*spg_nach)
2
{
3
uint16_tspg_utoa=0,spg=0;//Variablen für Funktion deklarieren
4
floatresult=0;
5
6
ADCSR=0xc7;//ADC einschalten und konfigurieren; Teiler 128
7
8
while(!(spg_utoa==10))//arithm. Mittelwert bilden aus 10 Messungen
9
{
10
loop_until_bit_is_clear(ADCSR,ADSC);
11
result+=ADCW;
12
ADCSR|=(1<<ADSC);//ADC-Einzelmessung neustarten
13
spg_utoa++;
14
}
15
16
result/=10;
17
18
spg=result*5000/1024;
19
20
spg_utoa=spg%1000;//Wert für Nachkommazahl umwandeln
Mein Display gibt aber nur in der ersten Variante Daten aus. Bei meiner
Änderung wird nichts mehr ausgegeben. Ich hoffe ihr könnte mir bei
diesem Problem helfen.
> char data[12];> sprintf(data, "\x1B""DL""\x1B""ZC""\x03""\x3F""%s"".""%s""\x0D"...data ist etwas sparsam angelegt oder? Allein die festen Bestandteile
ohne die beiden %s-formatierten Strings fressen schon 11 Zeichen.
Deine Arbeitsteilung der Funktionen ist nicht gut.
Besser ist es, wenn die Funktion abfrage_spg_hc nur das tut, was ihr
Name verspricht. Sie misst die Spannung und liefert einen Wert(!)
(keinen Text) zurück, der der Spannung entspricht.
Was mit dem Wert weiter passiert, ob der jetzt in einen String
umgewandelt wird und angezeigt wird, oder ob der in eine Regelung geht
oder .... hat diese Funktion nicht zu interessieren. Sie ist dafür
zuständig die Spannung zu messen und den Spannungswert als Zahl zu
liefern.
Insbesondere hat diese Funktion nicht die Aufgabe den Spannungswert in
den Vorkomma und den Nachkommateil zu splitten.
> char spg_vor[5], spg_nach[5];
Werden die Werte, die Du hiermit
> utoa( spg, spg_vor, 5 );> utoa( spg_utoa, spg_nach, 5 );
versuchst umzurechnen (wie Stefan schon anmerkte, ist die 5 hier fehl am
Platz!), denn auch als Dezimalzahlen nie größer als 9999?
Wenn sie das werden, dann sind spg_vor und spg_nach nämlich zu klein.
Bene Jan schrieb:> @rufus:> Könntest du das noch etwas anders ausdrücken? Ich verstehe noch nicht> ganz was du meinst!?
Sieh dir einfach mal die Doku zu utoa an.
Insbesondere den dritten Parameter.
Der ist nicht das, was du denkst das er ist. Das ist NICHT die Größe des
char-Buffers.
Allerdings brauchst du utoa hier gar nicht, wenn du
* die Funktion mit einer vernünftigen, brauchbaren Schnittstelle
versiehst (wie schon weiter oben angedeutet)
* In main dann sowieso ein sprintf benutzt
Damit ist dann auch der Fehler, dass deine Anzeige ab und zu falsche
Werte anzeigen wird, auch ad Acta gelegt.
utoa erzeugt dir keine führenden 0-en. Das solltest du nämlich bedenken,
wenn du dich fragst, was den Unterschied zwischen 2.5 und 2.05 in Bezug
auf den abgetrennten Nachkommaanteil ausmacht.
So in etwa
1
uint16_tabfrage_spg_hc()
2
{
3
floatresult=0;
4
uint8_ti;
5
6
ADCSR=0xc7;//ADC einschalten und konfigurieren; Teiler 128
An deiner send_to_lcd Funktion solltest du auch noch arbeiten. Es ist
unsinnig, die Länge eines Strings im Vorfeld feststellen zu müssen. Eine
korrekte String-Ausgabefunktion braucht die Länge nicht explizit.