Es lag an dem Programm vom I2C von der Wiki Seite. Da waren die Werte WriteI2C und ReadI2C drin.
ret = StartI2C(pcf8591_address+WriteI2C); // Sende Start Condition
ret = StartI2C(pcf8591_address+ReadI2C); // Sende Start Condition
Diese sind aber Falsch, es muss so aussehen.
ret = StartI2C(pcf8591_address+WRITE);
ret = StartI2C(pcf8591_address+READ);
Ich bekomme aber bei ret immer den Wert 1. Ich habe den Code so geändert, dass er immer auf 0 geht aber das ist ja eigentlich so nicht gedacht. Hier mal der Code:
Code:
unsigned char read_pcf8591_adc(unsigned char adc)
{
unsigned char ret;
unsigned char byte = 0;
ret = StartI2C(pcf8591_address+WRITE); // Sende Start Condition
ret=0;
if (ret == 0)
ret = WriteI2C(adc); // Senden des Control Bytes startet die A/D Wandlung
StopI2C(); // Sende Stop Condition, Bus freigeben
Sleep(10); // Warten bis A/D Wandlung benedet (mind. 90µs)
ret = StartI2C(pcf8591_address+READ); // Sende Start Condition
ret=0;
if (ret == 0)
{
// Mehrmaliges Lesen um alte A/D Werte zu ignorieren
byte = ReadI2C(1); // Lese Byte + acknowledge
byte = ReadI2C(0); // Lese Byte + no acknowledge
}
else ret = 3;
StopI2C(); // Sende Stop Condition, Bus freigeben
return byte;
}
Kann man das US Modul umbauen, dass dieser einfach eine Spannung wiedergibt, wenn etwas in 10 cm entfernung ist?
Lesezeichen