Forum: Mikrocontroller und Digitale Elektronik Festkommawert auf LCD Display ausgeben


von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.

Als aller erstes ein grosses Kompliment zu dieser perfekten 
Knowledge-Base hier im Forum!

Erst vor kurzem habe ich begonnen mit AVR Derivaten (ASM und GCC) zu 
programmieren und stehe nun vor einem Problem.
Ich verwende den ADC eines ATMega 32 (AVR Studio 4, AVR-GCC), um eine 
Spannung (Genauigkeit ist für diese Art der Anwendung erstmal zu 
vernachlässigen) zu messen und es am LCD mit Festkommaarithmetik 
auszugeben.

Habe schon die Routinen zur Festkommaarithmetik verwendet und soweit 
bekomme ich es auch hin. Also Umwandlung des ADC Wertes
in einen zuerst mit '0' führender String funktioniert. Es ist eine 
unidirektionale Messung, es können also nur positive Werte auftreten.

Nur ich bekomme es nicht hin, den Dezimalpunkt (Wert vor dem 
Dezimalpunkt "." Nachkommastellen) in den gleichen String zu packen,
der dann als Gesamtstring ans LCD mit dem Befehl lcd_string ausgegeben 
werden soll. Das Display zeigt immer nur wirre Dinge an.

In der Routine (Artikel Festkommaarithmetik) ist das mit lcd_data 
gemacht worden, ich benötige aber
erst einen kompletten Sting zur Ausgabe.

Hat jemand eine Idee, wie das gemacht wird?

Mfg

Marco

von Peter D. (peda)


Lesenswert?


von Peter II (Gast)


Lesenswert?

1
  for (i=0;i<strlen(string);i++)

Das ist VIEL zu langsam, das sollte man nicht machen! Es wird bei jeden 
Schleifendurchlauf die länge vom STring neu ermittelt.

besser ist es so:
1
while ( *string ) {
2
   string++;
3
   ...

1
      
2
if((string[i] == '0') && (flag == 0))
3
  nop();
4
5
if((string[i] != '0') && (flag == 0))
6
{
7
  string_p[k] = string[i];
8
  flag = 1;
9
  k++;
10
}
war erwartest du von dem IF mit dem nop?

von Marco (Gast)


Lesenswert?

Hallo Peter.

Zuerst vielen Dank für die sehr schnelle Antwort.
Ich habe bereits deinen Artikel „Formatierte Zahlenausgabe in C“ 
durchgelesen und habe auch versucht deinen Programmcode in meinem 
Testprogramm einzufügen. Wenn ich das richtig verstehe (bitte 
korrigieren, wenn ich falsch liegen sollte), muss ich die „valout“ – Fkt 
folgendermassen in mein Programm einbinden:

valout( Wert, Anzahl_der_Digits, Position_des_Dezimalpunktes, 
String_Array);

Der ADC Wert kommt aus meiner unsigned int AdcSample(void) – Fkt, der 
dann noch in einer Formel in main (void) weiter berechnet wird. Das muss 
in Wert bei valout eingesetzt werden, richtig?

Kann ich in meinem Programm für das String_Array einen char Buffer[32] 
deklarieren, den ich später mit lcd_string(Buffer); // Send text to 
display an das Display ausgeben kann?

Ich erhalte leider noch folgende Fehlermeldung / Warnungen:

../Voltage_Meas.c:177: warning: pointer targets in passing argument 4 of 
'valout' differ in signedness

D:\Spannungsmessung_ADC\C\FKA\default/../Voltage_Meas.c:177: undefined 
reference to `valout'

Habe ich noch etwas vergessen in den Header zu schreiben?


Vielen Dank schonmal für die Unterstützung.


Mfg Marco

von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.

Ich habe nun die letzten Tage versucht die valout-Fkt zum Laufen zu 
bringen. Es scheitert immer noch an folgender Fehlermeldung:

../Ausgabe.c:13: undefined reference to `valout'.

Bin langsam verzweifelt, was mache ich falsch?
Habe die Dateien als Anhang angehängt, wäre cool, wenn sich das jemand 
mal anschauen könnte.

Vielen Dank

Mfg Marco

von Marco (Gast)


Lesenswert?

Hallo zusammen.

Habe es geschafft.
Das Programm läuft, wie es soll.

Vielen Dank nochmals an Alle, die mir geholfen haben.

Schöner Abend

Mfg Marco

von Stefan F. (sfrings)


Lesenswert?

Warum hast du nicht einfach printf oder sprintf benutzt?

von W.S. (Gast)


Lesenswert?

Stefan Frings schrieb:
> Warum hast du nicht einfach printf oder sprintf benutzt?

Weil man sowas bei einem uC-Projekt nicht benutzt.

Nur Knalltüten, die da glauben, sich auf nem uC genauso benehmen zu 
müssen wie auf dem PC, benutzen sowas. Das ist die Sorte, die sich auch 
über das Fehlen von Dotnet auf'm 8 Bit Atmel mokiert.

W.S.

von Karl H. (kbuchegg)


Lesenswert?

W.S. schrieb:
> Stefan Frings schrieb:
>> Warum hast du nicht einfach printf oder sprintf benutzt?
>
> Weil man sowas bei einem uC-Projekt nicht benutzt.

Was natürlich Blödsinn ist.

Wenn ich den Speicher hab und die Laufzeit nicht kritisch ist, spricht 
nichts dagegen sprintf einzusetzen. Für nicht verbrauchten Flash gibts 
kein Geld zurück.

von HattenWirGerade (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was natürlich Blödsinn ist.
> Wenn ich den Speicher hab und die Laufzeit nicht kritisch ist, spricht
> nichts dagegen sprintf einzusetzen.

Diese Argumentation ist natürlich genauso Blödsinn.

Es kommt draufan, in welcher Richtung man die Anwendung optimiert. Für 
eine, bei der es auf Stromverbrauch oder Bauteilkosten ankommt, wird man 
anders optimieren als bei einer, wo Ziel ist, die Sache irgendwie 
schnell zum Laufen zu bringen.

von Karl H. (kbuchegg)


Lesenswert?

HattenWirGerade schrieb:
> Karl Heinz Buchegger schrieb:
>> Was natürlich Blödsinn ist.
>> Wenn ich den Speicher hab und die Laufzeit nicht kritisch ist, spricht
>> nichts dagegen sprintf einzusetzen.
>
> Diese Argumentation ist natürlich genauso Blödsinn.
>
> Es kommt draufan, in welcher Richtung man die Anwendung optimiert.

OK. Ich hab noch den Stromverbrauch vergessen. Ich könnte allerdings 
auch noch argumentieren, dass der Stromverbrauch in der Laufzeit 
implizit mit drinnen ist. Je langsamer, desto länger kann der µc nicht 
in den Sleep gehen, desto mehr Strom verbraucht er.

Aber wollen wir jetzt wirklich auf des Kaisers Bart rumreiten?

von W.S. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber wollen wir jetzt wirklich auf des Kaisers Bart rumreiten?

Nö.

Aber ich sehe hinter solchen Bemerkingen wie der vom sprintf ganz 
deutlich den Willen zur Ahnungslosigkeit. Ich entsinne mich an eine 
Bemerkung (vor vielen Jahren) von jemandem, der sich darüber mokierte, 
daß er auf'm PIC ja nur lächerliche 8 Plätze im Stack hat, wo er doch 
gewöhnt sei, mindestens 8 K an Stack zu haben. Ahnungslos, großkotzig 
und eigentlich unfähig, aber mit der Attitüde des Großmeisters.

Genauso ist das hier mit sprintf und Konsorten. Immer kommt das Argument 
"ja wenn ich doch auf dem uC sooo viele ungenutzte Ressourcen habe, 
warum sollte ich da selber nachdenken oder gar sparsam sein?" Bei so 
einem Burschen würde ich anregen, daß sein Chef ein bissel sparsamer mit 
dem Salär wäre. Alternativ könnte man dem Burschen nahelegen, seine 
Algorithmen zu überdenken, damit man den nächstkleineren und billigeren 
uC einsetzen kann.

W.S.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.