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?


Code:
#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