Ein HALLO in die Runde, ich habe ein Problem mit der Übertragung von float über den UART. Am Anfang habe ich ein kleines Programm geschrieben das mir auf Tastendruck die ASCII-Tabelle anzeigt (um mal zu testen ob es überhaupt mal funktioniert). Das ging auch wunderbar...also kann es mal nicht an der Übertragung liegen. Anschliesend wollte ich etwas "größeres" machen: Durch einen PT-100 fließt ein Konstantstrom von 10mA und erzeugt über diesem einen Spannungsabfall, den ich an ADC0 einlese. Nach der Umrechnung in eine Temperatur soll diese in ASCII Zeichen konvertiert werden (dtostrf) und über den UART durch ein Konsolenprogramm(Hyperterminal) sichtbar gemacht werden. Doch irgenwie kommt nur Müll raus! Ich habe schon ettliche Sachen versucht, aber ohne Erfolg...ist bestimmt irgendeine Kleinigkeit,trotzdem sehe ich es nicht.Ich hoffe mal einer von euch weis Rat? Hardware: ATMEGA16L Software: AVR-Studio v.4.13 / WinAVR-20071221 Die Libary libm.a für die Funktion dtostrf habe ich drin. Hier mal der Code:
1 | #include <avr/io.h> |
2 | #include <stdlib.h> |
3 | |
4 | void adc_init (void) |
5 | {
|
6 | |
7 | ADCSRA |= (1<<ADEN)|(1<<ADPS2) |
8 | |(1<<ADPS1)|(1<<ADPS0); // Aktivierung ADC mit Prescaler 128 --> 8Mhz/128 = 62.5kHz |
9 | //Der Prescaler sollte zwischen 50-200kHz ergeben
|
10 | ADMUX = 0; // Auswahl von ADC0 durch MUX |
11 | }
|
12 | |
13 | void ser_init (void) |
14 | {
|
15 | UCSRC|=(1<<URSEL)|(3<<UCSZ0); //Asynchron 8N1 |
16 | UBRRH= UBRR_VAL>>8; |
17 | UBRRL= UBRR_VAL & 0xFF; //Baudrate auf 9600 Bits/sek |
18 | |
19 | }
|
20 | |
21 | |
22 | int uart_putc(unsigned char c) |
23 | {
|
24 | while(!(UCSRA & (1<<UDRE))){;}; //Warten bis senden möglich |
25 | UDR=c; |
26 | return 0; |
27 | }
|
28 | |
29 | |
30 | void uart_puts(char *temp_string) |
31 | {
|
32 | while (*temp_string!='\n') |
33 | {
|
34 | uart_putc(*temp_string); |
35 | temp_string++; |
36 | }
|
37 | }
|
38 | |
39 | |
40 | int main(void) |
41 | {
|
42 | unsigned int i=0; |
43 | char temp_string[10]={0,0,0,0,0,0,0,0,0,0}; |
44 | float spannung=0,temp=0,temp_insg=0; |
45 | |
46 | adc_init(); |
47 | ser_init(); |
48 | |
49 | |
50 | for(;;) |
51 | |
52 | {
|
53 | for(i=0;i<10;i++) |
54 | {
|
55 | ADCSRA |= (1<<ADSC); //Start conversion |
56 | while (ADCSRA & (1<<ADSC) ) {;} // wait until converstion completed |
57 | |
58 | spannung=(float)((5* ADCW)/1024); //Umrechnen von Binär |
59 | temp=(float)(((spannung-1))/0.00391); //Errechnen der Temperatur |
60 | temp_insg=(float)temp_insg+temp; |
61 | }
|
62 | |
63 | temp_insg=(float)(temp_insg/10); //Mittelwert errechnen |
64 | dtostrf(temp_insg, 7, 3, temp_string); //Zerlegung von temp_insg in String |
65 | |
66 | |
67 | uart_puts(temp_string); //senden des Strings |
68 | uart_putc('\n'); |
69 | |
70 | |
71 | |
72 | }
|
73 | return 0; |
74 | }
|
Gruß Mani