Hallo Community,
ich möchte ein Gerät zur Neigungsmessung zusammen bauen und via LCD die
Werte anzeigen lassen.
der Bereich geht von -90.0° bis 90.0°.
Jetzt wollte ich zu testzwecken auf meinem myAVR Board (inkl. LCD) das
ganze schon mal mit dem LCD fertigstellen bis das IC und das neue LCD
kommt.
Also Poti an den ADC und ne kleine Rechnung um meinen Werte-Bereich
anzeigen lassen zu könnrn:
1 | // Wert aus ADC in Buffer übertragen
|
2 | buffer = ADC_Wandler(0);
|
3 |
|
4 | // Umwandlung von -500 bis +500; x ist eine int32_t und textfeld eine char[12] Variable
|
5 | x = (((1000*buffer)/255)-500);
|
6 |
|
7 | itoa (x, textfeld, 10);
|
8 |
|
9 | //Variable textfeld ausgeben
|
10 | lcd_goto(2, 10);
|
11 | _delay_ms(10);
|
12 | lcd_writeText(textfeld, 4);
|
13 | _delay_ms(10);
|
ADC ist auf 0-255 skaliert und mit der kleinen Rechnung, müsste dann
-500 bis +500 als Ergebnis erscheinen. Um nun das "," einfügen zu können
hab schnell diesen Code zusammen gebastelt (ist nicht schön ich weiß,
aber für meine Zwecke vollkommend ausreichend):
1 | //Variable textfeld mit ","
|
2 | lcd_goto(1, 4);
|
3 | if ((x >= (-999)) && (x <= (-100))) {
|
4 | lcd_write('-');
|
5 | lcd_write(textfeld[1]);
|
6 | lcd_write(textfeld[2]);
|
7 | lcd_write(',');
|
8 | lcd_write(textfeld[3]);
|
9 | } else if ((x >= (-99)) && (x <= (-10))) {
|
10 | lcd_write('-');
|
11 | lcd_write(' ');
|
12 | lcd_write(textfeld[1]);
|
13 | lcd_write(',');
|
14 | lcd_write(textfeld[2]);
|
15 | } else if ((x >= (-9)) && (x < 0)) {
|
16 | lcd_write('-');
|
17 | lcd_write(' ');
|
18 | lcd_write('0');
|
19 | lcd_write(',');
|
20 | lcd_write(textfeld[0]);
|
21 | }else if (x == 0) {
|
22 | lcd_write(' ');
|
23 | lcd_write(' ');
|
24 | lcd_write('0');
|
25 | lcd_write(',');
|
26 | lcd_write('0');
|
27 | } else if ((x > 0) && (x <= 9)) {
|
28 | lcd_write(' ');
|
29 | lcd_write(' ');
|
30 | lcd_write('0');
|
31 | lcd_write(',');
|
32 | lcd_write(textfeld[0]);
|
33 | } else if ((x >= 10) && (x <= 99)) {
|
34 | lcd_write(' ');
|
35 | lcd_write(' ');
|
36 | lcd_write(textfeld[0]);
|
37 | lcd_write(',');
|
38 | lcd_write(textfeld[1]);
|
39 | } else if ((x >= 100) && (x <=999)) {
|
40 | lcd_write(' ');
|
41 | lcd_write(textfeld[0]);
|
42 | lcd_write(textfeld[1]);
|
43 | lcd_write(',');
|
44 | lcd_write(textfeld[2]);
|
45 | }
|
Aber aus mir unerklärlichen Gründen kommt bei x ein falscher Wert raus.
Daher hab ich den ganzen Code kopiert und in Dev-C++ eingefügt und alle
lcd_write befehle durch print_f ersetzt --> Es funktioniert ohne wenn
und aber.
Das einzige was ich mir erklären kann, ist das der DEV-C Kompiler eine
andere Biblitothek für itoa benutzt als der des AVR Studio 6.
Habe auch schon den ABS vonx gebildet und dann erst gewandelt. Ebenso
die Rechnung in einzelen Rechenschritte einzuteilen mit
Zwischenergebnissen, es klappt im AVR Strudio einfach nicht.
Hat einer von euch nen Rat? Code sind im Anhang, danke euch im Voraus.
Ich weiß nicht mehr weiter...
mfg
Hohmi