Hallo zusammen, ich versuche gerade einige Analogwerte auf ein 2*16 LCD zubekommen. Das Tutorial habe ich mir zur Festkommaarithmetik angeschaut, einige Sachen auch daraus verwendet. Um stehe ich vor dem Problem das da irgendetwas nicht so mit der ganzen Rechnerei paßt. Wenn ich die Umrechnung des Analoagwertes im main aufrufe und den adc Wert übergebe kommt der auch richtig an. Das Rechnen in der Funktion ist auch richtig. Das ergebnis habe ich mir auch schon aus der Funktion heraus anzeigen lassen. Nur der Return Wert "ergbnis" ist vollständiger murks. Wenn ich den dann auch durch den my_itoa schicke und als string über my_print_LCD auf das Display bringen will kommt nur Schrott an. Wenn ich dem char direkt einen Wert zuweise dann geht die Anzeige?!? Weiß jemand vielleicht warum dem so ist? Verwende die LCD lib von P.Fleury und das ganz läuft auf einem ATMega8. Ich habe den Code mal etwas bereinigt reingestellt.
1 | // Include
|
2 | |
3 | #include <avr/io.h> |
4 | #include <avr/interrupt.h> |
5 | #include <util/delay.h> |
6 | #include <ADC_4MW.c> |
7 | #include "lcd.h" |
8 | #include <stdint.h> |
9 | |
10 | // Var
|
11 | int adc; |
12 | long adc_; |
13 | char adc__[11]; |
14 | |
15 | //Umrechnung
|
16 | uint32_t umrech (uint16_t zahl) |
17 | {
|
18 | int k = 15; |
19 | //test_(k); //debug
|
20 | uint32_t ergebnis = 0; |
21 | //test_(zahl); //debug
|
22 | ergebnis = zahl * (long)k; |
23 | //test__(ergebnis);
|
24 | //adc_ = ergebnis;
|
25 | return ergebnis; |
26 | }
|
27 | |
28 | |
29 | int main (void) |
30 | {
|
31 | DDRB = (1<<DDB1); //3 |
32 | |
33 | start(); //i.o |
34 | pwm_timer();//i.o |
35 | while(1) |
36 | {
|
37 | |
38 | //_delay_ms(500);
|
39 | adc = ReadADC(1); // Kanal 1 Wandeln |
40 | umrech(adc); |
41 | my_uitoa(umrech,adc__); |
42 | lcd_gotoxy(5,1); |
43 | my_print_LCD(adc__,3,5,1); |
44 | _delay_ms(500); |
45 | |
46 | //Pulsweitenmodulation
|
47 | OCR1A = adc; // PB1 |
48 | |
49 | |
50 | |
51 | }
|
52 | |
53 | return(0); |
54 | |
55 | |
56 | |
57 | }
|
58 | void my_itoa(int32_t zahl, char* string) { |
59 | uint8_t i; |
60 | |
61 | string[11]='\0'; // String Terminator |
62 | if( zahl < 0 ) { // ist die Zahl negativ? |
63 | string[0] = '-'; |
64 | zahl = -zahl; |
65 | }
|
66 | else string[0] = ' '; // Zahl ist positiv |
67 | |
68 | for(i=10; i>=1; i--) { |
69 | string[i]=(zahl % 10) +'0'; // Modulo rechnen, dann den ASCII-Code von '0' addieren |
70 | zahl /= 10; |
71 | }
|
72 | }
|
73 | |
74 | void my_print_LCD(char* string, uint8_t start, uint8_t komma, uint8_t frac) { |
75 | |
76 | uint8_t i; // Zähler |
77 | uint8_t flag=0; // Merker für führende Nullen |
78 | |
79 | // Vorzeichen ausgeben
|
80 | if (string[0]=='-') lcd_data('-'); else lcd_data(' '); |
81 | |
82 | // Vorkommastellen ohne führende Nullen ausgeben
|
83 | for(i=start; i<komma; i++) { |
84 | if (flag==1 || string[i]!='0') { |
85 | lcd_data(string[i]); |
86 | flag = 1; |
87 | }
|
88 | else lcd_data(' '); // Leerzeichen |
89 | }
|
90 | |
91 | lcd_data(','); // Komma ausgeben |
92 | |
93 | // Nachkommastellen ausgeben
|
94 | for(; i<(komma+frac); i++) lcd_data(string[i]); |
95 | |
96 | }
|