- LiTime Speicher und Akkus         
Ergebnis 1 bis 2 von 2

Thema: Temperatursensor I2C- richtiger Weg?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.10.2013
    Beiträge
    15

    Temperatursensor I2C- richtiger Weg?

    Anzeige

    Praxistest und DIY Projekte
    Hallo liebe Forumsgemeinde,

    ich bin ein Anfänger, was die Programmierung angeht. Ich möchte einen Temperatursensor(DS1621) via I2C mit einem LPC 1769 ansteuern. Als Entwicklungsumgebung kommt Coocox mit dem GCC Compiler zum Einsatz.
    Ich habe auch schon ein paar mögliche Lösungswege gefunden, allerdings komme ich noch nicht an einen Logikanalyser bzw einem Oszi ran, um zu überprüfen, ob überhaupt Signale ankommen.
    Vielleicht kann der eine oder andere mal drüber schauen und mir sagen, ob ich auf dem richtigen Weg bin?

    Includes mit anschließender Initialisierung der I2C-Peripherie:
    Code:
    #define  Start_Convert_Temp	                0xEE 	/*Deklaration des Registers Start_Convert_Temp*/
    #define  Read_Temp 			        0xAA 	//Deklaration des Registers Read_Temp
    #define  DS1621_Write 		                0x90 	//Schreibender Zugriff
    #define  DS1621_Read		                0x91 	//lesender Zugriff
    #define I2CDevice_M LPC_I2C0		//Auswahl der Peripherie -> I2C0
    #define I2CDEV_S_ADDR                       (0x90>1)	//Grundadresse ohne R/W-Bit 0x48
    
    
    I2C_Init(I2CDevice_M,100000);               //Einstellen der Taktrate -> 100kHz
    I2C_Cmd(I2CDevice_M,ENABLE);             // Einschalten der I2C-Peripherie


    1. Lösungsansatz
    Hier habe ich die Funktionen, die Dank der Bibliotheken bereitgestellt werden benutzt. (Im Anhang)

    Code:
    /****** Temperatur Messen****/
    
    				int TempH, TempL;
    
    				I2C_Start(I2CDevice_M);						//Starten im Master Mode
    				I2C_SendByte(I2CDevice_M,DS1621_Write);		//Slave ansprechen 0x90
    				I2C_SendByte(I2CDevice_M,Start_Convert_Temp);	//Beginn der Temperaturmessung 0xEE
    				I2C_STOP(I2CDevice_M);				//Eigentliche Messung beenden (?)
    
    				I2C_Sart(I2CDevice_M);				//Nochmaliger Start
    				I2C_SendByte(I2CDevice_M,DS1621_Write);		//Slave Ansprechen 0x90
    				I2C_SendByte(I2CDevice_M,Read_Temp);			//gemessene Temperatur lesen 0xAA
    				I2C_STOP(I2CDevice_M);
    				_delay_ms(200);							//200ms dem Sensor Zeit zum Messen der Temperatur geben
    
    
    		/******** Temperatur anzeigen lassen *****/
    
    				I2C_Start(I2CDevice_M);				//Starten im Master Mode
    				I2C_SendByte(I2CDevice_M,DS1621_Write);		// 0x90
    				I2C_STOP(I2CDevice_M);
    
    				I2C_Start(I2CDevice_M);
    				I2C_SendByte(I2CDevice_M,DS1621_Read);
    				TempH=I2C_GetByte(I2CDevice_M,*retdat,!FALSE ack); /*schauen, was ich MIT den *retdat machen muss..*/
    				TempL=I2C_GetByte(I2CDevice_M,*retdat,0 ack);
    				I2C_STOP(I2CDevice_M);
    				ret=(TempH*1+TempL/256);
    2. Lösungsansatz
    Hierbei benutze ich nicht die mitgelieferten Funktionen, sondern schreibe meine eigenen..Man beachte, die Syntax

    Code:
    1. Versuch----------------------------------------------------------------------
    	        //Transmit
    
    	        void I2C_write(void)
    			{
    	        	I2C_M_SETUP_Type transferMCfg;
    				transferMCfg.sl_addr7bit = I2CDEV_S_ADDR;   //0x48, muss Grundadresse sein, da hier nur 7 bit zulässig sind
    				transferMCfg.tx_data = DS1621_Write;		//0x90
    				transferMCfg.tx_length = 1;					//ist es nicht besser, einen buffer anzugeben?
    				transferMCfg.rx_data = 0					
    				transferMCfg.rx_length = NULL;
    				transferMCfg.retransmissions_max = 3;
    				I2C_MasterTransferData(I2CDevice_M, &transferMCfg, I2C_TRANSFER_POLLING);
    			}
    
    	        void I2C_send(void)
    	        {
    	        	I2C_M_SETUP_Type receiveMCfg;				// statt transfer -> receive ??
    	        	transferMCfg.sl_addr7bit = I2CDEV_S_ADDR;            //0x48
    	        	transferMCfg.tx_data = DS1621_Read;			//0x91
    	        	transferMCfg.tx_length = 1;
    	        	transferMCfg.rx_data = Read_Temp			        //Temperatur abholen 0xEE
    	        	transferMCfg.rx_length = NULL;
    	        	transferMCfg.retransmissions_max = 2;
    	        	I2C_MasterTransferData(I2CDevice_M, &transferMCfg, I2C_TRANSFER_POLLING);
    	        }

    Der Code soll später noch um eine LCD Anzeige erweitert werden.
    Aber erstmal wollte ich das Programmgerüst zum Laufen bringen.. Ist das so ok? Kann ich vielleicht die I2C Bibliothek von Fleury nehmen, aber die Bibliothek von CooCox für den LCD?
    Ich weiß echt nicht mehr weiter..

    Glg Tom

  2. #2
    Hardware-Entwickler
    Gast
    Kannst du auch ohne Oszilloskop testen.
    Sende in einer Endlosschleife direkt hintereinander das Datenbyte 0x00.
    Dann solltest du mit dem Voltmeter eine kleinere Spannung messen können als wenn nichts gesendet wird.

    Außerdem versuche den Status des Busses anzuzeigen. Wenn ein Acknowledge nach dem Senden der Slave-Adresse folgt, einfach eine LED anschalten und du weißt es funktioniert.

Ähnliche Themen

  1. Temperatursensor mit I2C auslesen
    Von Murmele im Forum Sensoren / Sensorik
    Antworten: 4
    Letzter Beitrag: 05.07.2012, 23:07
  2. I2C-EEPPROM: Strom weg beim Schreiben. Inhalt?
    Von Jaecko im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 09.11.2010, 08:22
  3. richtiger Schrittmotor?
    Von 4fnash im Forum Motoren
    Antworten: 5
    Letzter Beitrag: 08.05.2010, 18:52
  4. Ansteuerung Temperatursensor I2C mit Fleury-Library
    Von rico65 im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 14.06.2006, 23:12
  5. richtiger Motor ?
    Von Adam im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 14.10.2004, 22:56

Stichworte

Berechtigungen

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

LiTime Speicher und Akkus