Advertisement
Guest User

dddddddd

a guest
Mar 3rd, 2015
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.99 KB | None | 0 0
  1.  
  2.  
  3. // Température
  4. // quartz de 4MHz
  5.  
  6. #include <p18f452.h>
  7. #include <p18cxxx.h>
  8. #include <timers.h>
  9. #pragma config OSC = HS
  10. #pragma config WDT = OFF
  11. #pragma config LVP = OFF
  12.  
  13. #define LCD_E PORTBbits.RB3 // LCD E clock
  14. #define LCD_RW PORTBbits.RB4 // LCD read/write line
  15. #define LCD_RS PORTBbits.RB5 //LCD register select line
  16.  
  17. #define LCD_E_DIR TRISBbits.TRISB3
  18. #define LCD_RW_DIR TRISBbits.TRISB4
  19. #define LCD_RS_DIR TRISBbits.TRISB5
  20.  
  21.  
  22. unsigned char temp_wr;
  23. unsigned char x,y;
  24. int c=1;
  25. int w='x';
  26. char temp[11]="Temp = "; //premiers mots de l'afficheur
  27. int numero;
  28.  
  29. void traiter_it(void);
  30. #pragma code it=0x08
  31. void saut_sur_spit(void)
  32. { _asm
  33. goto traiter_it
  34. _endasm
  35. }
  36. #pragma code
  37.  
  38. void Delay(long counter)
  39. {
  40. while (counter>0)
  41. {
  42. counter--;
  43. }
  44. }
  45.  
  46. // fonctions de base I2C
  47. int i2c_write(unsigned char data)
  48. {
  49. SSPBUF=data; // data dans buffer
  50. while(SSPSTATbits.R_W); // attente de la fin de transmission
  51. //Option : delay(100)
  52.  
  53. return (!SSPCON2bits.ACKSTAT); // acquittement de l'esclave => !ACKSTAT = 1 quand reçu, 0 quand pas d'acquittement reçu de l'esclave
  54. }
  55.  
  56. unsigned char i2c_read(unsigned char x)
  57. {
  58. SSPCON2bits.RCEN=1; // on active récéption
  59. while (SSPCON2bits.RCEN); // on attend la fin de la récéption
  60. SSPCON2bits.ACKDT=x; // on asigne la valeur x au bit d'aqcuittement du maitre en mode reception 0= encore , 1= stop
  61. SSPCON2bits.ACKEN=1; // on active le bit de sequence d'acquittement du maitre en mode reception, ce qui provoque l'envoi du bit ACKDT
  62. while (SSPCON2bits.ACKEN); // on attend la fin de la sequence d'acquittement
  63. return SSPBUF; // retourne la valeur reçue
  64. }
  65.  
  66.  
  67. void i2c_start()
  68. {
  69. SSPCON2bits.SEN=1; // bit activation start
  70. while(SSPCON2bits.SEN); //attente de la fin de la sequence start -> repasse à 0 et sortie de la fonction
  71. }
  72.  
  73. void i2c_restart()
  74. {
  75. SSPCON2bits.RSEN=1; // bit activation restart
  76. while(SSPCON2bits.RSEN); //attente de la fin de la sequence restart -> repasse à 0 et sortie de la fonction
  77. }
  78.  
  79. void i2c_stop()
  80. {
  81. SSPCON2bits.PEN=1; // bit activation stop
  82. while(SSPCON2bits.PEN); //attente de la fin de la sequence stop -> repasse à 0 et sortie de la fonction
  83. }
  84.  
  85. void I2C(unsigned char *donnee_haut,unsigned char *donnee_bas)
  86. {
  87.  
  88. // lecture de la température sur deux octets
  89.  
  90. i2c_start();
  91. if( i2c_write(0x90) ) //if ack
  92. {
  93. i2c_write(0xAA); //On souhaite lire la valeur
  94. }
  95.  
  96. i2c_restart();
  97.  
  98. if( i2c_write(0x91)) // if ack + attente de l'ack réponse
  99. {
  100. *donnee_haut = i2c_read(0); //ValeurH = read
  101. *donnee_bas = i2c_read(1); //ValeurL = read, on attend plus rien après
  102. }
  103.  
  104. i2c_stop();
  105.  
  106. Nop();
  107. Nop();
  108. }
  109.  
  110. void convert_temp(char x,unsigned char y)
  111. {
  112. char dizaine,unite;
  113.  
  114. dizaine=x/10; // ex : 25deg / 10 = 2
  115. unite=x-dizaine*10; // ex : 25 - 10*2 = 5
  116. d_write(0x30+dizaine); // ex : on ecrit les dizaine "2" en ascii
  117. d_write(0x30+unite); //pareil pour les unités
  118. d_write((unsigned char)'.');
  119.  
  120. // on a un résultat sur 9bits le premier bit du gauche est celui qui correspond
  121. // 0.5 deg donc n doit le tester avec la valeur 0x80 ou 128(dec)
  122. if (y==0x80) w='5'; else w='0';
  123.  
  124. d_write((unsigned char)w);
  125. d_write((unsigned char)' ');
  126. d_write((unsigned char)'C');
  127. }
  128.  
  129. void afficher_mot_lcd(char mot[])
  130. {
  131. int i;
  132. for (i=0;i<=6;i++)
  133. {
  134. d_write(mot[i]);
  135. }
  136. }
  137.  
  138. void envoi_lcd(unsigned char temp)
  139. {
  140. int i;
  141. for (i=0;i<8;i++)
  142. {
  143. if (temp&0x80)
  144. d_write(0x31);
  145. else
  146. d_write(0x30);
  147. temp=temp<<1;
  148. }
  149. }
  150.  
  151.  
  152. #pragma interrupt traiter_it
  153. void traiter_it(void)
  154. {
  155. if (INTCONbits.TMR0IF)
  156. {
  157. INTCONbits.TMR0IF=0;
  158. TMR0H=0x85; // valeur de la durée
  159. TMR0L=0xED; // valeur de la durée
  160.  
  161. // affichage de la température
  162. i_write(0x80); // curseur en début de première ligne
  163. afficher_mot_lcd(temp);// affichage du premier mot
  164. I2C(&x,&y); // lecture de la température
  165. convert_temp(x,y); // affichage de la température en BCD
  166. Nop();// pour le bon fonctionnement de l'ensemble
  167. }
  168. }
  169.  
  170.  
  171.  
  172. void main(void)
  173. {
  174. TRISB=0; // port B en sortie
  175. lcdinit(); // initialisation de l'afficheur
  176. Delay(100); // attente pour le bon fonctionnement de l'afficheur
  177. ADCON1=7;// PortA en numérique
  178. SSPSTATbits.CKE=1; // activation du bus
  179.  
  180. // initialisation du timer pour 1 conversion toutes les ? ms
  181. T0CON=0x83; // prescaler de ?
  182. TMR0H=0x85; // valeur de la durée
  183. TMR0L=0xED; // valeur de la durée
  184. // autorisation des interruptions
  185. INTCONbits.TMR0IE=1;
  186. INTCONbits.GIE=1;
  187.  
  188.  
  189. //......Paramétrage du bus I2C)
  190. //......config de SSPCON1 (paramétrage statique des communications)
  191. SSPCON1=0x28;
  192. // .....choix du taux de transfert
  193. SSPADD=0x09; //90kHz
  194. //......config de SSPSTAT (paramètres généraux des états)
  195. SSPSTATbits.SMP=1;
  196.  
  197.  
  198.  
  199. /*CONFIGURATION du composant
  200. */
  201. i2c_start();
  202. if( i2c_write(0x90) ) //if ack
  203. {
  204. i2c_write(0xAC); //On veut accéder à la configuration
  205. i2c_write(0x00); //On configure en mode continu
  206. }
  207.  
  208. i2c_restart();
  209.  
  210. if( i2c_write(0x90) ) // if ack
  211. {
  212. i2c_write(0x51); //On lance la conversion (continue)
  213. }
  214.  
  215. i2c_stop();
  216.  
  217. while (1);
  218.  
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement