Microcontroleur pic 16f877

Résolu
aurelienkam Messages postés 6 Date d'inscription dimanche 20 septembre 2009 Statut Membre Dernière intervention 3 avril 2011 - 24 mars 2011 à 10:20
aurelienkam Messages postés 6 Date d'inscription dimanche 20 septembre 2009 Statut Membre Dernière intervention 3 avril 2011 - 31 mars 2011 à 15:08
bonjour à tous je suis nouveau dans le site et je m'appelle aurelien Kameni. j'étudie cette année en licence le microcontrolleur PIC 16F877.
j'ai un Travail Pratique dans lequel j'ai beaucoup de d'incomprehensions et de difficultés à le resoudre.
en effet, c'est de concevoir sur ISIS et de programmer en C pour PIC 16F877 un systeme de detection de deux seuils de temperature equipé du detecteur de temperature DS18S20.
la sortie du detecteur de temperature doit-etre raccordée sur RA5. la temperature ambiante doit-etre affichée en continue sur un ecran LCD 2x16 raccordé sur les bits RB0 à RB3.
une LED placé sur RB5 s'allume si la temperature est >= 35°c puis s'etteint si elle descend en dessous de 20°c.
merci d'avance
A voir également:

3 réponses

DEHHAK Messages postés 2 Date d'inscription vendredi 25 février 2011 Statut Membre Dernière intervention 24 mars 2011
24 mars 2011 à 11:38
salam
pour la programmation du PIC
-faire le schema avec ISIS
-faire le programme de gestion avec uC
-dans isis cliquer sur le pic pour faire le lien vers votre code.exe generer par le logiciel uC
3
aurelienkam Messages postés 6 Date d'inscription dimanche 20 septembre 2009 Statut Membre Dernière intervention 3 avril 2011 1
Modifié le 2 mars 2021 à 19:00
bonjour et merci
j'ai reécrit le code et je n'obtiens pas d'erreur. le problème qui se pose est au niveau de la simution dans ISIS.j'ai à l'affichage degre 32766.74 et j'ai les erreurs suivants
- simulation is not running in real time to excessive
-CFGWORD2 not implemented
-[DS18S20] RAM COMMAND UNSUPPORTED

voici le nouveau code:

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB6_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB6_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

//////////////////////////////////////////////////
//Read temperature
//////////////////////////////////////////////////
void Read_Temperature(void)
{
 float valeurtemp[2];
char get[10];//variable dans laquelle on va charger la memoire scratchpad
char temp_lsb,temp_msb;
char k;
float temp;
   ow_reset(&portA,5);
   ow_write(&portA,5,0XCC);
   ow_write(&portA,5,0X44);
   delay_ms(120);
   ow_reset(&portA,5);
   ow_write(&portA,5,0XCC);
   ow_write(&portA,5,0XBE);
   delay_ms(120);

  for (k=0;k<9;k++)
   {get[k]=ow_read(&portA,5);}// lecture de la mémoire scratchpad
temp_msb = get[1]; // octet de signe
temp_lsb = get[0]; // donnée température avec avec demi degré si nécessaire
   //temp=ow_read(&portA,5);
if (temp_msb <= 0x28)
  {temp_lsb = (temp_lsb/2.0);} //récupération valeur entière
  temp_msb = temp_msb & 0x28; //récupération du signe
  portb=1;
   delay_ms(300);
if (temp_msb >= 0x37)
 {temp_lsb = (~temp_lsb)+1; // calcul complément à deux pour valeur négatives
  temp_lsb = (temp_lsb/2.0);}// récupération partie entière
  temp=temp_lsb-0.25+((get[7]-get[6])/get[7]);//application de la formule
  portb=0;
   delay_ms(300);
if (temp_msb >= 0x37) {temp=((-1)*temp);} // on ajoute le signe

 lcd_out(2,1,"DEGRE");
            lcd_chr(2,14,223);
            //lcd_Chr(2,15,67);
            floatToStr(temp,valeurtemp);
            lcd_out(2,7,valeurtemp);
           //return temp;
}

void main()
{
     //ADCON0=0b00000000;
     ADCON1=0b10000000;
     trisa=0b11011111;
     trisb=0b11011111; // bit RB5 en sortie
     PORTA=0;
     PORTB=0;

     Lcd_Init();
     Lcd_cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);

     while(1)
     {
      //if(!ow_reset())
        Read_Temperature();
     }
}
1
aurelienkam Messages postés 6 Date d'inscription dimanche 20 septembre 2009 Statut Membre Dernière intervention 3 avril 2011 1
Modifié le 2 mars 2021 à 18:59
salut.j'ai écrit un programme dans MikroC selon le problème que j'ai posé dernièrement et je rencontre beaucoup de difficulté lors de la compilation.
j'ai aussi des problèmes pour câbler dans ISIS.
SVP je voudrais un soutien par rapport a cela.
voici mon programme et mon câblage :

/* 
 Titre : detection de deux seuils de temperature
 Fichier : temperature.c
 Auteur : Aurelien Kameni
 But : détecter deux seuils de temperature grâce à un capteur DS18S20 et l'afficher sur un écran LCD 2x16.
 Date de création : 26 Mars 2011
 dernière modification : 28 Mars 2011
 Configuration :
   - µc :                     PIC 16F877A
   - Carte de developpement : EasyPIC6
   - Quartz :                 8 MHz (HS)
   - Modules externes :       Capteur DS18S20
                              LCD 2x16
   -Software :                MikroC v4.15.0.0
 */
 
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

const unsigned short TEMP_RESOLUTION = 9;

char *text = "000.0000";


// Set TEMP_RESOLUTION to the corresponding resolution of your DS18x20 sensor:
unsigned temp,ct,dt,u; //ct pour centaine, dt pour dizaine et u pour unité
unsigned short j;


void main()
{
ADCON1 = 0x82; // Configure RA5 pin as digital I/O
trisb = 0xdf;
portb = 0;
// Initialize LCD on PORTB and prepare for output
  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);

while(1) // boucle principale
{
//acquisition de la température sur RA5 (temp)
    Ow_Reset(&PORTA, 5);                         // Onewire reset signal
    Ow_Write(&PORTA, 5, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 5, 0x44);                   // Issue command CONVERT_T
    Delay_us(120);

    Ow_Reset(&PORTA, 5);
    Delay_us(120);
    Ow_Write(&PORTA, 5, 0xCC);                   // Issue command SKIP_ROM
    Ow_Write(&PORTA, 5, 0xBE);                   // Issue command READ_SCRATCHPAD

    temp =  Ow_Read(&PORTA, 5);
    temp = (Ow_Read(&PORTA, 5) << 8) + temp;

    Ow_Reset(&PORTA, 5);
    Delay_us(120);
    Display_Temperature(temp);
    Delay_ms(500);
 // Affichage
    Lcd_Out(1, 1, "Temperature :");
   temp=temp/2; //début du calcul et de l'affichage de la température
    ct=temp/100 ;
    Lcd_Chr_Cp(ct+0x30);
    dt=(temp-100*ct)/10;
    Lcd_Chr_Cp(dt+0x30);
    u=temp-(ct*100+dt*10);
     Lcd_Chr_Cp(u+0x30);
     
  /*Lcd_Out(1, 1, "Cons:   ");
  Lcd_Chr(2,13,223);
  Lcd_Chr(2,14,'C');  */

  if(temp>=30)
   {
    portb=1;
    delay_ms(500);
    portb=0;
    delay_ms(500);
   }
   else
   if(temp<=20)
    {
      portb=0;
      delay_ms(500);
    }
}
}
0
Rejoignez-nous