Ds1307 ET 18F452
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Ds1307 ET 18F452



  1. #1
    invite489d7312

    Ds1307 ET 18F452


    ------

    Bonjour, j'ai le programme avec lequel je n'arrive pas à afficher l'heure.

    Code:
    #include <p18f452.h>
    #include <delays.h>
    #include <stdio.h>
    #include <i2c.h>
    #include <xlcd.h>
    
    
    #pragma config WDT =OFF
    
    int octetrecu1;
    int octetrecu2;
    int octetrecu3;
    int octetrecu4;
    int octetrecu5;
    int octetrecu6;
    int octetrecu7;
    int octetrecu8;
    
    
    /////////////////////////////////////////////////////////////
    // PROTOTYPE //
    /////////////////////////////////////////////////////////////
    
    void ack(void);
    void init_I2C(void);
    void read_trameI2C(int *octet1, int *octet2, int *octet3, int *octet4,int *octet5, int *octet6, int *octet7, int *octet8);
    void tempo(unsigned int count);
    unsigned int SWReadI2C( void );
    void SetPosition(unsigned char x, unsigned char y);
    void SetDDRamAddr(PARAM_SCLASS unsigned char);
    void efface (void);
    
    /////////////////////////////////////////////////////////////
    // read_tram_i2c(); //
    /////////////////////////////////////////////////////////////
    
    void read_trameI2C(int *octet1, int *octet2, int *octet3, int *octet4,int *octet5, int *octet6, int *octet7, int *octet8)
    {
    *octet1 = ReadI2C();
    SSPCON2bits.ACKEN = 1;
    ack();
    *octet2 = ReadI2C();
    SSPCON2bits.ACKEN = 1;
    ack();
    *octet3 = ReadI2C();
    SSPCON2bits.ACKEN = 1;
    ack();
    *octet4 = ReadI2C();
    SSPCON2bits.ACKEN = 1;
    ack();
    *octet5 = ReadI2C();
    SSPCON2bits.ACKEN = 1;
    ack();
    *octet6 = ReadI2C();
    SSPCON2bits.ACKEN = 1;
    ack();
    *octet7 = ReadI2C();
    SSPCON2bits.ACKEN = 1;
    ack();
    *octet8 = ReadI2C();
    }
    
    ////////////////////////////////////////////////////////////////////////
    // TEST ACK //
    ////////////////////////////////////////////////////////////////////////
    
    void ack(void)
    {
    IdleI2C();
    while (SSPCON2bits.ACKSTAT);
    }
    
    
    ////////////////////////////////////////////////////////////////////////
    // TEMPO //
    ////////////////////////////////////////////////////////////////////////
    
    void tempo(unsigned int compte)
    {
    while (compte--);
    }
    
    
    /////////////////////////////////////////////////////////////
    // INITIALISATION I2C //
    /////////////////////////////////////////////////////////////
    
    void init_I2C(void)
    {
    DDRCbits.RC3=1;
    DDRCbits.RC4=1;
    SSPCON1=0x28;
    
    SSPSTATbits.SMP=1;
    
    SSPADD=9;
    }
    
    
    /////////////////////////////////////////////////////////////
    // Fonction Principale //
    /////////////////////////////////////////////////////////////
    
    void main(void)
    {
    
    int Valeur = 1;
    //InitLCD();
    stdout = _H_USER;
    OpenXLCD(FOUR_BIT & LINES_5X7);	//la librairie XLCD du C
    
    init_I2C();
    IdleI2C();
    
    StartI2C();
    while (SSPCON2bits.RSEN);
    
    WriteI2C(0xD0);
    ack();
    
    WriteI2C(0x00);
    ack();
    
    WriteI2C(0x00);
    ack();
    
    WriteI2C(0x01);
    ack();
    
    WriteI2C(0x00);
    ack();
    
    WriteI2C(0x02);
    ack();
    
    WriteI2C(0x51);
    ack();
    
    WriteI2C(0x03);
    ack();
    
    WriteI2C(0x03);
    ack();
    
    WriteI2C(0x04);
    ack();
    
    WriteI2C(0x11);
    ack();
    
    WriteI2C(0x05);
    ack();
    
    WriteI2C(0x03);
    ack();
    
    WriteI2C(0x06);
    ack();
    
    WriteI2C(0x09);
    ack();
    
    WriteI2C(0x07);
    ack();
    
    WriteI2C(0x03);
    ack();
    
    StopI2C();
    
    while (SSPCON2bits.PEN);
    
    tempo(60000);
    
    IdleI2C();
    
    StartI2C();
    
    while (SSPCON2bits.RSEN);
    
    WriteI2C(0xD1);
    ack();
    
    ////////////////////////////////////////////////////////////////////////
    // lecture de la trame I2C //
    ////////////////////////////////////////////////////////////////////////
    
    read_trameI2C(&octetrecu1, &octetrecu2, &octetrecu3, &octetrecu4, &octetrecu5, &octetrecu6, &octetrecu7, &octetrecu8);
    
    
    ////////////////////////////////////////////////////////////////////////
    // CLOTURATION I2C //
    ////////////////////////////////////////////////////////////////////////
    
    NotAckI2C(); // transmet l'acquittement du maître
    while (SSPCON2bits.ACKEN); // attend fin de l'acquittement
    
    StopI2C(); // initialise une stop-condition
    
    
    while (SSPCON2bits.PEN); // attend fin de stop-condition
    //void efface(void);
    
    
    
    SetPosition(2,0);
    printf("test\n");
    
    printf("=%X", octetrecu2);
    printf("=%X", octetrecu3);
    printf("=%X", octetrecu4);
    printf("=%X", octetrecu5);
    
    SetPosition(0,1);
    
    printf("=%X", octetrecu6);
    printf("=%X", octetrecu7);
    printf("=%X", octetrecu8);
    
    //while(1); // boucle infinie
    
    } 
    
    void SetPosition(unsigned char x, unsigned char y)
    {
    if (y) SetDDRamAddr(0x40+x);
     else SetDDRamAddr(x);
    }
    
    void DelayFor18TCY(void)
    {
        Delay10TCYx(2);
    }
    void DelayPORXLCD(void)
    {
     	Delay1KTCYx(15);     //Delai de 15 ms
    }
    void DelayXLCD(void)
    {
     	Delay1KTCYx(20);     //Delai de 20 ms
    }
    
    void efface(void)
    {
    	SetPosition(0,0);
    	printf("                ");
    	SetPosition(1,0);
    	printf("                ");
    }[/quote]
    
    
    Et voici un autre programme où j'arrive à afficher "bonjour":
    
    [quote="code"]
    // CD 01/2005
    // test printf sur PICDEM2+ et MCC18 v2.40
    #include <p18f452.h>
    #include <stdio.h> 	// inclure stdio.h si la fonction printf est appelée
    #include <xlcd.h>  	// inclure xlcd.h pour la déclaration des pattes du pic comme 
    		   			// étant reliées aux broches RS,RW,E,Données du LCD
    #include <delays.h>	// bibiothéque contenant des fonctions de temporisations
    #include <spi.h>   //bibliotheque simplifiant l'utilisation du protocole SPI
    /*
    unsigned char c;
    int i;
    unsigned char tampon[10];
    rom const unsigned char chrom[]=" en ROM";
    unsigned char chram[]=" en RAM";
    unsigned char * pram;
    rom unsigned char *prom;
    float f;
    */
    char code_test=0b10110110;
    char SSP1BUF=0b00000000;
    
    void SetPosition(unsigned char x, unsigned char y);	// positionne le curseur sur un n° de colonne puis de ligne
    void efface(void);									// efface lcd
    void touche(void);									// détecte l'appui et attends le relâchement du BP
    void DelayFor18TCY(void);							// temporisations ajustables au type de l'afficheur utilisé
    void DelayPORXLCD(void);							// pour connaître les valeurs des durées d attentes necessaires
    void DelayXLCD(void);								// LIRE la doc de l afficheur LCD!!!
    
    
    void main(void)
    {	
    	TRISDbits.TRISD4=0;
    	TRISDbits.TRISD5=0;
    	TRISCbits.TRISC1=1;								// PORTC bit1 en entrée pour S2
    	PORTDbits.RD4=1;
    	PORTDbits.RD5=0;
    	ADCON1=6;
    	stdout=_H_USER;	// on affiche vers le LCD
    	OpenXLCD(FOUR_BIT & LINES_5X7);	//la librairie XLCD du C
    	OpenSPI(SPI_FOSC_4, MODE_01, SMPEND); //Initialisation du module SPI
    	WriteSPI(code_test); //envoyer la variable code test dans le buffer SPI
    
    //if((SSPSTATbits.BF==1) && (SSP1BUF==code_test))//information au technicien que le test est un succes
    
    if((SSPBUF==code_test) && (SSPSTATbits.BF==0))//information au technicien que le test est un succes
    {
    
    
    			SetPosition(1,0);
    			printf("bon\n");
    			while(1);
    
    
    
    
    }
    else//information au technicien que le test décele une anomalie
    {
    
    			SetPosition(0,0);
    			printf("bonjour \n");
    			while(1);
    
                
    
    }
    
    		}
    
    
    
    /************************************************/
    /* SetPosition	(colonne, ligne)				*/
    /* rôle: positionne le curseur de l'affichage	*/
    /*		à l'une des 32 adresses d'affichages	*/
    /*		L'affichage débute à partir du curseur	*/
    /* entrées:										*/
    /*  x le n° de la colonne (une adresse)			*/
    /*	ligne 0: de 0x00 à 0x0F	(16 caractères max)	*/
    /*	y le n° de la ligne 						*/
    /*	ligne 1:de 0x40 à 0x4F(addition de 0x40 à x)*/
    /*	sortie: RIEN! sauf sur l'écran...			*/
    /************************************************/						
    void SetPosition(unsigned char x, unsigned char y)
    {
    if (y) SetDDRamAddr(0x40+x);
     else SetDDRamAddr(x);
    }
    void efface(void)
    {
    	SetPosition(0,1);
    	printf("                ");
    	SetPosition(0,0);
    	printf("                ");
    }
    void touche(void)
    {
     while(PORTC & 0x02);
     while(!(PORTC & 0x02));
     efface();
    } 
    void DelayFor18TCY(void)
    {
        Delay10TCYx(2);
    }
    void DelayPORXLCD(void)
    {
     	Delay1KTCYx(15);     //Delai de 15 ms
    }
    void DelayXLCD(void)
    {
     	Delay1KTCYx(20);     //Delai de 20 ms
    }

    -----
    Dernière modification par HULK28 ; 04/05/2010 à 22h18. Motif: miodification des balises html -> utiliser [code]

  2. #2
    invite7a49d0d5


  3. #3
    Tropique

    Re : Ds1307 ET 18F452

    nasserarien,

    Je rappelle que les doublons sont interdits par la charte, et seront sanctionnés à l'avenir.
    Pas de complexes: je suis comme toi. Juste mieux.

  4. #4
    invite489d7312

    Re : Ds1307 ET 18F452

    oui ok je reste que ici, je m'excuse pour les doublons, les gars je suis presque, l'heure tourne mais maladroitement.

    Citation Envoyé par code
    #include <p18f452.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <xlcd.h>
    #include <delays.h>
    #include <i2c.h>

    /*
    #pragma config OSC = HS, FCMEN=OFF, IESO=OFF
    //type oscillateur HS,
    //Fail Safe clock Monitor Enabled OFF
    //intern extern switch over mode OFF
    #pragma config PBADEN = OFF
    //PORTB ADc pins enabled OFF
    #pragma config WDT = OFF,WDTPS=512
    //Wtchdog Timer OFF mais Watchdogprescaler=512
    #pragma config LVP = OFF
    // Low Program Voltage OFF
    #pragma config PWRT = OFF , BOREN=OFF
    //PowerUpTimer ??? OFF, Brown Out Reset OFF
    #pragma config MCLRE = ON,CCP2MX = PORTC
    //MasterClearEnabled RE3 disabled ON
    //CCP2 MUX oui RC1
    */


    void SetPosition(unsigned char x, unsigned char y);

    unsigned char sec,min,hrs,day,wkd,mes,yer;
    /*void DelayFor18TCY(void); // temporisations ajustables au type de l'afficheur utilisé
    void DelayPORXLCD(void); // pour connaître les valeurs des durées d attentes necessaires
    void DelayXLCD(void);*/
    void main(void)
    {

    ADCON1=0x0f; //...........
    stdout=_H_USER; //..........
    OpenXLCD(FOUR_BIT & LINES_5X7);
    SetPosition(0,0);

    TRISCbits.TRISC3=1; //.............
    TRISCbits.TRISC4=0; //.............

    Delay10KTCYx(50);
    OpenI2C(MASTER, SLEW_OFF);
    SSPADD=0x09;

    EEByteWrite(0xd0, 0x00, 0x00);
    EEByteWrite(0xd0, 0x01, 0x59);
    EEByteWrite(0xd0, 0x02, 0x59);
    EEByteWrite(0xd0, 0x03, 0x23);

    EEByteWrite(0xd0, 0x04, 0x08);
    EEByteWrite(0xd0, 0x05, 0x01);
    EEByteWrite(0xd0, 0x06, 0x09);
    EEByteWrite(0xd0, 0x07, 0x10);
    EEByteWrite(0xd0, 0x00, 0x00);

    while(1)
    {
    IdleI2C();
    sec=EERandomRead(0xd0,0x01); //...........
    IdleI2C();
    min=EERandomRead(0xd0,0x02); //...........
    IdleI2C();
    hrs=EERandomRead(0xd0,0x03); //...........
    IdleI2C();
    wkd=EERandomRead(0xd0,0x04); //............
    IdleI2C();
    day=EERandomRead(0xd0,0x05); //............
    IdleI2C();
    mes=EERandomRead(0xd0,0x06); //............
    IdleI2C();
    yer=EERandomRead(0xd0,0x07); //............
    IdleI2C();

    SetPosition(0,0);
    printf("%d/%d/%d",day,mes,yer); //............
    SetPosition(0,1);
    printf("%d:%d:%d",hrs,min,sec) ; //............
    printf(" ");

    Delay10KTCYx(50);

    }

    }

    void SetPosition(unsigned char x, unsigned char y)
    {
    if (y) SetDDRamAddr(0x40+x);
    else SetDDRamAddr(x);
    }
    /*void efface(void)
    {
    SetPosition(0,0);
    printf(" ");
    SetPosition(0,1);
    printf(" ");
    }*/
    void DelayFor18TCY(void)
    {
    Delay10TCYx(2);
    }
    void DelayPORXLCD(void)
    {
    Delay1KTCYx(15); //Delai de 15 ms
    }
    void DelayXLCD(void)
    {
    Delay1KTCYx(20); //Delai de 20 ms
    }
    en utilisant un pic18f452 et un lcd

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Horloge ds1307
    Par Benjiboubou dans le forum Électronique
    Réponses: 44
    Dernier message: 24/05/2011, 07h51
  2. Programme à convertir de ... à C18, ds1307, 18f6627 or 18f452,
    Par invite489d7312 dans le forum Électronique
    Réponses: 12
    Dernier message: 24/03/2010, 08h10
  3. souci ds1307
    Par invite4cba64e8 dans le forum Électronique
    Réponses: 3
    Dernier message: 22/06/2009, 07h38
  4. ds1307 algorithme
    Par invitec4b571da dans le forum Électronique
    Réponses: 5
    Dernier message: 13/03/2008, 23h42
  5. Ds1307
    Par invite369c4784 dans le forum Électronique
    Réponses: 2
    Dernier message: 11/02/2007, 20h18
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...