18F45K20+DS1721 retourne -1
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

18F45K20+DS1721 retourne -1



  1. #1
    quichedood

    Unhappy 18F45K20+DS1721 retourne -1


    ------

    Hello,

    Je me bats depuis déjà quelques temps avec mon 18f45k20 et ma sonde de température (DS1721).

    Le code arrive enfin à s’exécuter entièrement mais les 2 octets récupérés valent chacun "-1".

    Pour la gestion de l'I2C j'utilise la librairie fournie par Microchip.

    Suite aux problèmes sur la version de mon pic (0x18) : http://ww1.microchip.com/downloads/e...Doc/80425G.pdf, j'ai décidé de rajouter une tempo après chaque "StopI2C()".

    Le pic fonctionne avec un quartz de 10Mhz.

    Je suis débutant, les erreurs "bêtes" sont donc possibles
    (init des registres du pic notamment)

    Pour info voici le code utilisé :
    Code:
    #pragma config FOSC = XT, FCMEN = OFF, IESO = OFF  
    
    #include "p18f45k20.h"
    #include "delays.h"
    #include "xlcd.h"
    #include "stdlib.h"
    #include "Config.h"
    #include "i2c.h"
    
    //#define CLOCK_FREQUENCY			10000000	// TCY = 4/10 = 2/5µs = 0,4µs
    #define SDA_PIN		LATCbits.LATC4
    #define SCL_PIN		LATCbits.LATC3
    #define TRIS_SDA	TRISCbits.TRISC4
    #define TRIS_SCL	TRISCbits.TRISC3
    
    // Function prototypes
    void init(void);
    
    //Function to initalize oscillator registers
    void init(void) {
    	OSCCONbits.SCS0 = 0; // Internal oscillator block  (P.29)
    	OSCCONbits.SCS1 = 0; // Internal oscillator block  (P.29)
    	OSCCONbits.OSTS = 1; // device is running from the clock defined by FOSC<2:0> (P.29)
    	ADCON0bits.ADON = 0; // ADC is disabled and consumes no operating current (P.271)
    	SSPCON1bits.SSPM0 = 0;
    	SSPCON1bits.SSPM1 = 0;
    	SSPCON1bits.SSPM2 = 0;
    	SSPCON1bits.SSPM3 = 0;
    	SSPCON1bits.SSPEN = 1;
    }
    
    // Main function
    void main (void)
    {	
    	char temp2[5];
    	char temperatureHI = 0b01101010;
    	char temperatureLO = 0b01101010;
    
    	TRIS_SDA = 1;
    	TRIS_SCL = 1;
    	SDA_PIN = 0;
    	SCL_PIN = 0;
    
    	//Function to initalize oscillator registers
    	init();
    
    	// LCD
    	OpenXLCD(EIGHT_BIT & LINES_5X7);  // Init the LCD Display
    	SetDDRamAddr(0x00);
    	putrsXLCD("ligne1");
        SetDDRamAddr(0x40); //line 2
    	putrsXLCD("ligne2");
        SetDDRamAddr(0x14); //line 3
    	putrsXLCD("ligne3");
        SetDDRamAddr(0x54); //line 4 
    
    	// DS1721 (I2C)
    	
    	// Init & conf
    	OpenI2C(MASTER, SLEW_OFF);// Initialize I2C module
    	SSPADD = 0x63;
    
    	StartI2C();
    	IdleI2C();
    	WriteI2C(0x90); //where 9E is the address with the last bit as write
    	IdleI2C(); 
    	WriteI2C(0xAC); // Command byte
    	IdleI2C(); 
    	WriteI2C(0x02); // Data byte		
    	IdleI2C();
    	StopI2C();
    	
    	// Start conversion
    	Delay10KTCYx(5);
    	StartI2C(); 
    	IdleI2C();
    	WriteI2C(0x90);   // sends address to the
    	IdleI2C();
    	WriteI2C(0x51);     // send command to begin temperature conversions
    	IdleI2C();
    	StopI2C();    
    
    	// Read temp
    	Delay10KTCYx(5);
    	StartI2C();           // start I2C communication
    	IdleI2C();
    	WriteI2C(0x90);     // address the chip
    	IdleI2C();
    	WriteI2C(0xAA);     // access the temperature register
    	IdleI2C();
    	StopI2C();    
    
    	// Read temp
    	Delay10KTCYx(5);
    	StartI2C();         // Initiate a RESTART command
    	IdleI2C();
    	WriteI2C(0x91);     // address device w/read
    	IdleI2C();
    	temperatureHI = ReadI2C(); // Returns the MSB byte and stores it in 'temperatureHI'
    	IdleI2C();
    	AckI2C();
    	IdleI2C();
    	temperatureLO = ReadI2C(); // returns the LSB of the temperature
    	IdleI2C();	
    	NotAckI2C();          // send a not-acknowledge
    	IdleI2C();
    	StopI2C();            // stop all I2C communication
    
    	SetDDRamAddr(0x54);
    	putrsXLCD("T:");
    	btoa(temperatureHI, temp2);
    	putsXLCD(temp2);
    	btoa(temperatureLO, temp2);
    	putsXLCD(temp2);
    	
    	while(1) {		
    
    	}
    }

    -----
    Dernière modification par quichedood ; 01/07/2011 à 10h31. Motif: Changement titre

  2. #2
    vincent66

    Re : 18F45K20+DS1721 retourne -1

    Bonjour
    Il te retourne deux bytes qui en complément à 2 valent -1..?
    Je ne connais pas ce circuit précisément mais il est fréquent qu'après initialisation des bytes "exotiques" soient envoyés pour signaler que le circuit est prêt...
    Vincent
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  3. #3
    quichedood

    Re : 18F45K20+DS1721 retourne -1

    Pfff je viens de trouver !!
    Limite la honte de poster la réponse

    Je teste avec une platine d'essai et j'avais relié la masse de ma sonde sur la ligne de la masse de la platine ... sauf que le contact se fait entre les colonnes pas entre les lignes ... voilà super au moins 6h que je suis dessus pour au final un problème d'alimentation

    En tout cas merci pour la tentative d'aide !

Discussions similaires

  1. Le verre d'eau retourné
    Par verdae31 dans le forum Physique
    Réponses: 17
    Dernier message: 11/12/2009, 14h27
  2. verre retourné dans l'eau
    Par invite2f6e1f92 dans le forum Physique
    Réponses: 4
    Dernier message: 12/10/2009, 08h26
  3. Eh oh, eh oh, on retourne au boulot
    Par macros dans le forum Orientation après le BAC
    Réponses: 5
    Dernier message: 20/05/2009, 00h15
  4. oeil retourné
    Par invite865f8bfa dans le forum Physique
    Réponses: 6
    Dernier message: 23/05/2008, 15h05
  5. Aide Physique Verre retourné
    Par invite2f416c20 dans le forum Physique
    Réponses: 6
    Dernier message: 02/04/2006, 20h19
Découvrez nos comparatifs produits sur l'informatique et les technologies.