PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCF 8591 auslesen



PcVirus
09.11.2007, 14:36
Hi,
ich habe mir eine Funktion geschrieben um 2 PCF 8591 auszulesen.
Die Werte auf meinem Display sind vom PCF2 alle 4 Eingänge bei 1 und beim PCF1 schwanken sie zwischen 12 und 60. Die ist so wenn keine Spannung an einem Eingang angelegt ist. Sobald ich +5V anlege, gibt es einen kleinen Funken. Könnt ihr mal rüberschauen, ob das Programm soweit in Ordnung ist?




#include <avr/io.h>
#include <util/delay.h>
#include <wintek2704.c> //LCD Lib
#include <stdint.h> //Integer datentypen
#include <stdlib.h> //versch. Funktionen
#include "i2cmaster.h" //I2C Lib von Peter Fleury

#define PCF2 0x9E // Adresse von PCF2
#define PCF1 0x90 // Adresse von PCF1

//Liniensensor defines
#define L1 1
#define L2 2
#define L3 3
#define L4 4
#define L5 5
#define L6 6
#define L7 7
#define L8 8

char * int_to_string(uint16_t integer);
uint8_t readLine(uint8_t sensor);
void sleep(uint16_t sleep_ms);

int main(void)
{
i2c_init(); // init I2C interface
lcd_init(LCD_DISP_ON); //Display initialisieren
while(1)
{
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(int_to_string(readLine(L1)));

lcd_gotoxy(10,0);
lcd_puts(int_to_string(readLine(L2)));

lcd_gotoxy(0,1);
lcd_puts(int_to_string(readLine(L3)));

lcd_gotoxy(10,1);
lcd_puts(int_to_string(readLine(L4)));

lcd_gotoxy(0,2);
lcd_puts(int_to_string(readLine(L5)));

lcd_gotoxy(10,2);
lcd_puts(int_to_string(readLine(L6)));

lcd_gotoxy(0,3);
lcd_puts(int_to_string(readLine(L7)));

lcd_gotoxy(10,3);
lcd_puts(int_to_string(readLine(L8)));

sleep(100);

}
return 0;
}

char * int_to_string(uint16_t integer)
{
static char return_string[50];
itoa(integer,return_string,10);
return return_string;
}

void sleep(uint16_t sleep_ms)
{
uint16_t i=0;
while(i<sleep_ms)
{
_delay_ms(1);
i++;
}
}

//Funktion liest die Liniensensoren L1-L8 aus
uint8_t readLine(uint8_t sensor)
{
uint8_t i2c_status = 0;
uint8_t value = 0;

if(sensor <= 4) //Wenn Sensoren 1 - 4, dann PCF1
{
i2c_status = i2c_start(PCF1+I2C_WRITE); // I2C startcondition senden, danach kann geschrieben werden
}
else //PCF2
{
i2c_status = i2c_start(PCF2+I2C_WRITE); // I2C startcondition senden, danach kann geschrieben werden
}
//Status überprüfen
if(i2c_status) //Wenn 1, dann liegt ein Fehler vor
{
value = 0; //Bei Fehler ist value 0
i2c_stop(); //I2C Bus freigeben
}
else
{
//Command zum PCF1 senden, jenachdem welcher Sensor gewählt wurde
if(sensor==L1)
{
i2c_write(0x00); // Commando zum PCF senden. (Analogwert lesen, kanal0)
}
else if(sensor==L2)
{
i2c_write(0x01); // Commando zum PCF senden. (Analogwert lesen, kanal1)
}
else if(sensor==L3)
{
i2c_write(0x02); // Commando zum PCF senden. (Analogwert lesen, kanal2)
}
else if(sensor==L4)
{
i2c_write(0x03); // Commando zum PCF senden. (Analogwert lesen, kanal3)
}

if(sensor <= 4) //Wenn Sensoren 1 - 4, dann PCF1
{
i2c_rep_start(PCF1+I2C_READ); // Erneute startcondition mit nachfolgendem lesen
}
else
{
i2c_rep_start(PCF2+I2C_READ); // Erneute startcondition mit nachfolgendem lesen
}

//3 von 4 mal lesen
for(uint8_t i=0; i<3; i++)
{
value += i2c_readAck();
}
value += i2c_readNak(); //4. mal lesen, NAK
i2c_stop();
value /= 4;
value++; //+1, damit value immer > 0 und somit ein Fehler erkennbar ist (value = 0)
}
return value;
}


MfG Jörn

PcVirus
10.11.2007, 21:24
Ich hab den Fehler jetzt selbst gefunden. Die Variable value war einfach zu klein.