- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 2 von 2

Thema: PCF 8591 auslesen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174

    PCF 8591 auslesen

    Anzeige

    Powerstation Test
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    Ich hab den Fehler jetzt selbst gefunden. Die Variable value war einfach zu klein.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress