Hallo zusammen, Ich möchte zur Zeit einen HYT 221 über I2C Ansprechen und Abfragen. Ich bediene mich den ic2-Routinen von Peter Fleury. Mir ist es möglich den Sensor anzusprechen, nur tauchen dann auf dem LCD nur wirre Zeichen auf. Die Frage: mache ich einen Fehler mit den Datentypen uint8 und uint 16? Ist für die Ausgabe am Display eine weitere Umrechnung nötig? Vielen Dank für Eure Hilfe Matthias
Matthias Kugler schrieb: > Die Frage: mache ich einen Fehler mit den Datentypen uint8 und uint 16? > Ist für die Ausgabe am Display eine weitere Umrechnung nötig? Du musst deinen wie auch immer gearteten 16bit-Zahlenwert erst in eine Zeichenkette umwandeln. Das geht z.B. damit: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#LCD_Beispiel_2 mfg mf
Vielen Dank für die Info, Ich hab den Code so abgeändert: [c]raw_RH16 = AusleseBuffer[0] < 8 | AusleseBuffer[1]; raw_T16 = AusleseBuffer[2] < 8 | AusleseBuffer[3]; RH = ( raw_RH16 * 100 ) / 2^14; T = (( raw_T16 * 165 ) / 2^14 ) - 40; T /=4; char RHchar[20],Tchar[20]; itoa( RH, RHchar, 10 ); itoa( T, Tchar, 10 ); lcd_clear(); lcd_setcursor( 0, 1 ); lcd_string(RHchar); lcd_setcursor( 0, 2 ); lcd_string(Tchar);[c] Leider bekomme ich noch immer irgendwelche sinnlosen Zahlen. Kann es sein das meine Auslesung nicht i.O. ist? mfg
Matthias Kugler schrieb: > 2^14 0b00000010 EXOR 0b00001110 = 0b00001100 = 0x0C = 12 Das war bestimmt nicht gewollt, oder? exklusiv-oder? Für "x hoch y" nimmt man die pow()-Funktion. Dazu brauchst du die math.h; sobald du die aber einbindest und das hier benutzt, wird in Fließkommazahlen gerechnet. Das frisst Flash und Rechenzeit. Darum schau dich mal nach "Bitoperationen", "Schiebeoperator" und "Festkommaarithmetik" um(bemüh die Forensuche). Für Unsigned 16-Bit Zahlen kann man zum Umwandeln in ein String z.B. folgendes hernehmen(auch wenn es nicht sonderlich effizient ist):
1 | uint16_t number = 12345; |
2 | uint16_t buffer; |
3 | uint8_t mystring[6]; |
4 | |
5 | //Zehntausender
|
6 | buffer = number / 10000; |
7 | mystring[0] = buffer + '0'; |
8 | number = number - (buffer * 10000); |
9 | //Tausender
|
10 | buffer = number / 1000; |
11 | mystring[1] = buffer + '0'; |
12 | number = number - (buffer * 1000); |
13 | //Hunderter
|
14 | buffer = number / 100; |
15 | mystring[2] = buffer + '0'; |
16 | number = number - (buffer * 100); |
17 | //Zehner
|
18 | buffer = number / 10; |
19 | mystring[3] = buffer + '0'; |
20 | number = number - (buffer * 10); |
21 | //Einer... das mit dem Buffer und der 1
|
22 | //hier nur zur Einheitlichkeit des Codes
|
23 | buffer = number / 1; |
24 | mystring[4] = buffer + '0'; |
25 | number = number - (buffer * 1); |
26 | //String mit Stringende-Zeichen abschliessen
|
27 | mystring[5] = '\0'; |
28 | |
29 | //Ausgeben
|
30 | lcd_clear(); |
31 | lcd_setcursor( 0, 1 ); |
32 | lcd_string(mystring); |
Dein Part ist es jetzt, das Ganze in eine Funktion zu packen. Irgendwo hier im Forum gab es auch schon mal eine ("selbstgeschriebene", als Platzsparend bekannte)ItoA()-Funktion, die Signed 16-Bit Zahlen verarbeitet(Auch mal suchen, bitte). mfg mf PS: Das C-Beispiel ist dazu gedacht, dass du dir ausdenkst, wo und wie das Komma hier irgendwo rein kommen könnte. Und überleg dir, wie man einen gegebenen Zahlenbereich mit maximaler Genauigkeit ausnutzt.
Ich habe das Problem gelöst und bekomme jetzt Daten auf dem LCD ausgegeben, die i.O. sind! Mein Fehler war unter anderem das Bitschieben! Iach hatte fälschlicherweise geschrieben: "raw_T16 = AusleseBuffer[2]< 8" dabei muss es ja << 8 heißen! Vielen Danke für deine Hilfe und Hinweise! mfg
1 | raw_RH16 = AusleseBuffer[0] * 256 + AusleseBuffer[1]; |
2 | raw_T16 = AusleseBuffer[2]<< 8 | AusleseBuffer[3]; |
3 | raw_T16 /=4 ; |
4 | |
5 | RH =(100 / pow(2,14)) * raw_RH16; |
6 | T = (165 / pow(2,14)) * raw_T16 -40; |
7 | |
8 | char Buffer1[20], Buffer2[20]; // in diesem {} lokal |
9 | itoa(RH, Buffer1, 10 ); |
10 | itoa( T, Buffer2, 10 ); |
11 | |
12 | lcd_clear(); |
13 | lcd_setcursor( 0, 1 ); |
14 | lcd_string("rF "); |
15 | lcd_setcursor( 3, 1 ); |
16 | lcd_string(Buffer1); |
17 | lcd_setcursor( 5, 1 ); |
18 | lcd_string("%"); |
19 | |
20 | lcd_setcursor( 0, 2 ); |
21 | lcd_string("T "); |
22 | lcd_setcursor( 2, 2 ); |
23 | lcd_string(Buffer2); |
24 | lcd_setcursor( 5, 2 ); |
25 | lcd_string("C"); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.