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 }
-----