Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Température
- // quartz de 4MHz
- #include <p18f452.h>
- #include <p18cxxx.h>
- #include <timers.h>
- #pragma config OSC = HS
- #pragma config WDT = OFF
- #pragma config LVP = OFF
- #define LCD_E PORTBbits.RB3 // LCD E clock
- #define LCD_RW PORTBbits.RB4 // LCD read/write line
- #define LCD_RS PORTBbits.RB5 //LCD register select line
- #define LCD_E_DIR TRISBbits.TRISB3
- #define LCD_RW_DIR TRISBbits.TRISB4
- #define LCD_RS_DIR TRISBbits.TRISB5
- unsigned char temp_wr;
- unsigned char x,y;
- int c=1;
- int w='x';
- char temp[11]="Temp = "; //premiers mots de l'afficheur
- int numero;
- void traiter_it(void);
- #pragma code it=0x08
- void saut_sur_spit(void)
- { _asm
- goto traiter_it
- _endasm
- }
- #pragma code
- void Delay(long counter)
- {
- while (counter>0)
- {
- counter--;
- }
- }
- // fonctions de base I2C
- int i2c_write(unsigned char data)
- {
- SSPBUF=data; // data dans buffer
- while(SSPSTATbits.R_W); // attente de la fin de transmission
- //Option : delay(100)
- return (!SSPCON2bits.ACKSTAT); // acquittement de l'esclave => !ACKSTAT = 1 quand reçu, 0 quand pas d'acquittement reçu de l'esclave
- }
- unsigned char i2c_read(unsigned char x)
- {
- SSPCON2bits.RCEN=1; // on active récéption
- while (SSPCON2bits.RCEN); // on attend la fin de la récéption
- SSPCON2bits.ACKDT=x; // on asigne la valeur x au bit d'aqcuittement du maitre en mode reception 0= encore , 1= stop
- SSPCON2bits.ACKEN=1; // on active le bit de sequence d'acquittement du maitre en mode reception, ce qui provoque l'envoi du bit ACKDT
- while (SSPCON2bits.ACKEN); // on attend la fin de la sequence d'acquittement
- return SSPBUF; // retourne la valeur reçue
- }
- void i2c_start()
- {
- SSPCON2bits.SEN=1; // bit activation start
- while(SSPCON2bits.SEN); //attente de la fin de la sequence start -> repasse à 0 et sortie de la fonction
- }
- void i2c_restart()
- {
- SSPCON2bits.RSEN=1; // bit activation restart
- while(SSPCON2bits.RSEN); //attente de la fin de la sequence restart -> repasse à 0 et sortie de la fonction
- }
- void i2c_stop()
- {
- SSPCON2bits.PEN=1; // bit activation stop
- while(SSPCON2bits.PEN); //attente de la fin de la sequence stop -> repasse à 0 et sortie de la fonction
- }
- void I2C(unsigned char *donnee_haut,unsigned char *donnee_bas)
- {
- // lecture de la température sur deux octets
- i2c_start();
- if( i2c_write(0x90) ) //if ack
- {
- i2c_write(0xAA); //On souhaite lire la valeur
- }
- i2c_restart();
- if( i2c_write(0x91)) // if ack + attente de l'ack réponse
- {
- *donnee_haut = i2c_read(0); //ValeurH = read
- *donnee_bas = i2c_read(1); //ValeurL = read, on attend plus rien après
- }
- i2c_stop();
- Nop();
- Nop();
- }
- void convert_temp(char x,unsigned char y)
- {
- char dizaine,unite;
- dizaine=x/10; // ex : 25deg / 10 = 2
- unite=x-dizaine*10; // ex : 25 - 10*2 = 5
- d_write(0x30+dizaine); // ex : on ecrit les dizaine "2" en ascii
- d_write(0x30+unite); //pareil pour les unités
- d_write((unsigned char)'.');
- // on a un résultat sur 9bits le premier bit du gauche est celui qui correspond
- // 0.5 deg donc n doit le tester avec la valeur 0x80 ou 128(dec)
- if (y==0x80) w='5'; else w='0';
- d_write((unsigned char)w);
- d_write((unsigned char)' ');
- d_write((unsigned char)'C');
- }
- void afficher_mot_lcd(char mot[])
- {
- int i;
- for (i=0;i<=6;i++)
- {
- d_write(mot[i]);
- }
- }
- void envoi_lcd(unsigned char temp)
- {
- int i;
- for (i=0;i<8;i++)
- {
- if (temp&0x80)
- d_write(0x31);
- else
- d_write(0x30);
- temp=temp<<1;
- }
- }
- #pragma interrupt traiter_it
- void traiter_it(void)
- {
- if (INTCONbits.TMR0IF)
- {
- INTCONbits.TMR0IF=0;
- TMR0H=0x85; // valeur de la durée
- TMR0L=0xED; // valeur de la durée
- // affichage de la température
- i_write(0x80); // curseur en début de première ligne
- afficher_mot_lcd(temp);// affichage du premier mot
- I2C(&x,&y); // lecture de la température
- convert_temp(x,y); // affichage de la température en BCD
- Nop();// pour le bon fonctionnement de l'ensemble
- }
- }
- void main(void)
- {
- TRISB=0; // port B en sortie
- lcdinit(); // initialisation de l'afficheur
- Delay(100); // attente pour le bon fonctionnement de l'afficheur
- ADCON1=7;// PortA en numérique
- SSPSTATbits.CKE=1; // activation du bus
- // initialisation du timer pour 1 conversion toutes les ? ms
- T0CON=0x83; // prescaler de ?
- TMR0H=0x85; // valeur de la durée
- TMR0L=0xED; // valeur de la durée
- // autorisation des interruptions
- INTCONbits.TMR0IE=1;
- INTCONbits.GIE=1;
- //......Paramétrage du bus I2C)
- //......config de SSPCON1 (paramétrage statique des communications)
- SSPCON1=0x28;
- // .....choix du taux de transfert
- SSPADD=0x09; //90kHz
- //......config de SSPSTAT (paramètres généraux des états)
- SSPSTATbits.SMP=1;
- /*CONFIGURATION du composant
- */
- i2c_start();
- if( i2c_write(0x90) ) //if ack
- {
- i2c_write(0xAC); //On veut accéder à la configuration
- i2c_write(0x00); //On configure en mode continu
- }
- i2c_restart();
- if( i2c_write(0x90) ) // if ack
- {
- i2c_write(0x51); //On lance la conversion (continue)
- }
- i2c_stop();
- while (1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement