Lukas B. schrieb:> ich Versuche schon eine ganze weile einen Floatwert über die UART -> Schnittstelle (8 Databits ).
Was denn? ... zu senden oder ... zu empfangen?
> Mit Printf, leider funktionierts nicht:
Woran liegts?
Und was noch offen ist:
Welcher uC?
Welcher Compiler?
Welche Libraries?
Pardon, habe noch ein par wichtige sachen Vergessen.
Ich möchte den Floatwert über die Serielle Schnittstelle senden, Wenn
ich einfache Chars sende funktionierts, die initialisierung bzw. die
Schnittstelle arbeitet richtig.
Ich arbeite mit einem ATMEGA16 mit 12MHz Quarz.
Programmiert habe ich den obigen Code in GCC mit dem aktuellen
GCC-Compiler in WinAVR 4.18.
Ich verwende die Standartlibarys vom GCC.
Grüße Lukas
Nachtrag ... ich war wohl zu spät, aber vielleicht ist es ja trotzdem
nützlich:
Die Umwandlung in Ascii ist eigentlich recht einfach dank dem Aufbau der
Ascii-Tabelle. http://www.asciitable.com/
Du musst dir nur überlegen welche Arithmetische Operation du ausführen
musst.
In deinem Fall:
Willst aus einer Zahl "1" eine Asciizeichen "1" erstellen musst du
(dezimal) 48 Addieren.
1+48 = 49 (dezimal ascii "1")
Gleiches Prinzip gilt auch bei Wandlung in groß/kleinbuchstaben o.Ä.
Funktioniert natürlich nur sinnvoll bei Char bzw. wenn man sich sicher
ist was mit dem "überschuss" wie z.B. bei einer Integer passiert.
>Nein es kommt folgendes an:>>?àC<0>N"?àC<0>?àC<0>N"?àC<0>?à
Wann kommt das an? sprintf() sollte eigentlich funktionieren.
Da es keinen kompletten Code gibt ist hier einfach Feierabend.
Zum raten ist mir die Zeit zu schade.
Lukas B. schrieb:> Hallo,> ich Versuche schon eine ganze weile einen Floatwert über die UART -> Schnittstelle (8 Databits ).> Der Floatwert ist so Aufgebaut: xxx.x>> [c]> Ansatz 1:> Mit Printf, leider funktionierts nicht:> float float_wert;> char char_wert[10];> sprintf(char_wert,"%.1f",float_wert);
Doch das funktioniert schon. Aber du musst die floating Point Version
von sprintf aktivieren.
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio> Ansatz 2:> Zugriff auf den Floatwert mit Pointer,> Geht auch nicht, da nicht als Asci Übertragen wird.
Eben.
Diese Version legst du am besten gleich wieder ad acta
Das ist meine Main, in welcher die Daten gesendet werden sollten:
1
#include<stdio.h>
2
3
intInit_Rs232()
4
{
5
6
UBRRL=77;//Baud - Rate, 9600bps, UBRR =
7
UCSRA=0x40;
8
UCSRB=0b10011000;//TXD/RXD, kein TX-Interrup
9
UCSRC=0b10000110;//Aynchron, no parity, 1 stop, 8 Datenbits
10
11
}
12
13
intSend_Rs232(charsend)
14
{
15
delay_ms(50);
16
UDR=send;
17
return;
18
}
19
20
intmain(void)
21
{
22
intcount=0;
23
floattemp_duzel;
24
unsignedchartemperatur_duzel[20];
25
26
reader_init(tempsens_1);
27
Init_Rs232();
28
29
for(;;)
30
{
31
temp_duzel=reader_read_temp(tempsense_1);
32
DDRC=0xFF;//LEDs als Ausgang
33
34
sprintf(temperatur_duzel,"%.1f",temp_duzel);
35
36
while(count<=10)// Gibt die Temperatur an der seriellen Schnittstelle aus.
37
{
38
Send_Rs232(temperatur_duzel[count]);// Sendet jeden char an die Serielle Schnittstelle
39
count++;
40
}
41
count=0;// Setzt den Zähler für die Ausgabe des char Arrays zurück
42
PORTC=temp_duzel;// Zeigt das MSB auf den LED's an
43
44
45
}
46
47
}
Die UART müsste richtig funktionieren, wenn ich zum Beispiel schreibe:
Send_Rs232('A');
kommt auf dem Terminal laufend A.
Daraus Schlussfolgere ich das die Serielle Schnittstelle funktioniert.
Grüße Lukas
Vielen Dank Karl Heiz!!!!
Ich habe übrigens das Programm ein wenig "leserlicher" geschrieben,
allerdings suchte ich überall nur nicht beim Printf und der Floating
Funktion, darauf wäre ich nie gekommen!
Ich Verwende in der fertigen Schaltung einen ATMEGA8, da ich aber
probleme hatte mit dem floating Zeugs habe ich den ATMEGA16 verwendet.
1
intInit_Rs232()
2
{
3
UCSRA=0x00;// mit U2X könnte die Baudrate verdoppelt werden (nicht benötigt)
wenn das Programm fertig ist und funktioniert werde ich es hier
Veröffentlichen, da vieleicht andere dieses Verwenden können.
(Es handelt sich dabei ums auslesen eines DS18S20 1Wire
Temperatursensors)
Viele Grüße
Lukas