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?
MfG JörnCode:#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; }







Zitieren

Lesezeichen