Hallo,
ich versuche zurzeit einen 12Bit I2C ADV (ADC128D818 von TI)an einem
AtMega328 zum Laufen zu bekommen. Nach einigen Schwierigkeiten mit der
I2C Kommunikation funktioniert diese nun. Leider habe ich nun einige
Probleme bei der Konvertierung der beiden 8Bit Werte in einen 16 Bit
Wert und danach in einen Spannungswert. Ich empfange zwei 8 Bit werte
"val1 und val2)welche ich als uint8_t deklariert habe.
Bei val1 setzte ich die oberen 4 Bits auf Null. Anschließend setzte ich
die 2 8Bit werte durch schieben zu einem 16 Bit Wert zusammen.
Anschließende Ausgabe sieht aber nicht wie gewünscht aus. Wenn die
oberen Bits null sind werden diese "abgeschnitten" und damit stimmt der
Wert nicht. ich hoffe mir kann hier jemand helfen. Bin nicht sooo der
Software Mensch.
1 | uint8_t val1, val2;;
|
2 | int Sekunde, Minute, Stunde, Tag, Monat, Jahr;
|
3 | uint16_t Messwert;
|
4 | float Messwert_mV;
|
5 | ...
|
6 | ret = i2c_start(0b00111010);
|
7 | i2c_write(0b00100001)
|
8 | i2c_rep_start(0b00111011);
|
9 | val1 = i2c_readAck();
|
10 | val2 = i2c_readNak();
|
11 | val1 &= ~((1 << 7) | (1<<6)| (1<<5)| (1<<4) );
|
12 | Messwert = ((val1<<8)|val2);
|
13 | itoa(Messwert, uart_string, 10);
|
14 | lcd_clear();
|
15 | lcd_home();
|
16 | lcd_string(uart_string);
|
17 | Messwert_mV = (Messwert*2.56/4095.0*1000.0);
|
18 | lcd_setcursor( 0, 2 );
|
19 | itoa(Messwert_mV, uart_string, 10);
|
20 | lcd_string(uart_string);
|
21 | i2c_stop();
|