Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Problème de démarrage avec un 16f887
tdegremont
Débutant
Débutant
Messages : 30
Enregistré en : novembre 2015

#1 Message par tdegremont » mar. 16 févr. 2016 15:03

Bonjour à tous,
Je ne suis pas un expert dans la programmation de pic, et pour tout dire c'est même mon premier projet "complet", donc soyez indulgent si ma question est bête comme bonjour ;-)
Bon voilà, je suis en train de réaliser une mini station météo pour mon papa. le besoin est simple:
Affichage des températures avec 2 sondes (DS18B20)
Affichage de la vitesse du vent (signal front haut qui m'arrive d'un autre système).

J'ai programmé avec le compilateur mikroC pro, et j'ai utiliser la carte de développement EasypicV7. Jusque là, tout va bien.
Afin d'être plus clair, je joins le schéma ISIS ainsi que le code MikroC.

Donc sur ma carte tout est ok, et le programme fonctionne super bien.
Je me suis donc mis au soudage...et là soucis,on dirait que mon pic ne démarre pas rien ne se passe....
Quelqu'un aurait une piste????
merci d'avance

Code : Tout sélectionner

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_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 TRISB5_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;
// End LCD module connections

void Init_Device();
void vent(int *cond,unsigned *VentValue,char );
void temperature(int *cond,unsigned *temperatureValue,char )   ;
void luminosite(int *cond,unsigned *LumiValue,char );
unsigned Sensor();
void nextMenu();

//  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
//  18S20: 9  (default setting; can be 9,10,11,or 12)
//  18B20: 12
  const unsigned short TEMP_RESOLUTION = 12;
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;

  const unsigned short VREF = 5;
  const unsigned short LCD_FREQUENCE = 100;
  unsigned int BP=0;
  const unsigned short MENU_MAX_ID = 6;

  unsigned short FACTOR_SPEED = 1;
  unsigned TCu_Temp;           //current deg
  unsigned THi_Temp = 0xFC90; //-55 deg
  unsigned TLo_Temp = 0x07D0; //125 deg
  unsigned TCu_Freq;          //Frequence
  unsigned THi_Freq;          //Frequence Max
  unsigned TCu_Lumi = 0x00;   //Luminosite en %
  
void Init_Device
(){
  PORTB = 0;          // All PORTB pins are cleared
  PORTA = 0x00;       // All PORTA pins are cleared
  TRISA = 0b00010100;  // ques des sorties sauf RA4 en input du timer0 et RA2 en analogique
  TRISB = 0b10000000; // All PORTB pins except PORTB.1 are configured as outputs
  ANSEL = 0b00000100; // RA2/AN2 is analog input
  //ADCON0 = 0b00001000; // Analog channel select @ AN2 -
  ANSELH = 0;                 // Configure other AN pins as digital I/O
  C1ON_bit = 0;                                  // Disable comparators
  C2ON_bit = 0;
  INTCON =0b00000100;
  OPTION_REG = 0b10101111; //0b00101000; // TOCS=1 for Counter mode, PSA=1 for 1:1 prescaler
}

unsigned Sensor(){
  unsigned Sensor_Tmp;
        Ow_Reset(&PORTE, 2);                         // Onewire reset signal
        Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTE, 2, 0x44);                   // Issue command CONVERT_T
        Delay_us(120);
        Ow_Reset(&PORTE, 2);
        Ow_Write(&PORTE, 2, 0xCC);                   // Issue command SKIP_ROM
        Ow_Write(&PORTE, 2, 0xBE);                   // Issue command READ_SCRATCHPAD
        Sensor_Tmp =  Ow_Read(&PORTE, 2);
        Sensor_Tmp = (Ow_Read(&PORTE, 2) << 8) + Sensor_Tmp;
        return (Sensor_Tmp);
}

void temperature(int *cond,unsigned *temperatureValue,char temptxt[]){
    unsigned int temp2write;
    char temp_whole;
     unsigned int temp_fraction;
    char *temp = " 00.0";
    temp2write=*temperatureValue;
    if (temp2write & 0x8000) {
       temp[0] = '-';
       temp2write = ~temp2write + 1;
       }
    temp_whole = temp2write >> RES_SHIFT ;
    if (temp_whole/100)
       temp[0] = temp_whole/100  + 48;
    else
       temp
[0] = ' ';
    temp[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
    temp[2] =  temp_whole%10     + 48;             // Extract ones digit
    temp_fraction  = temp2write << (4-RES_SHIFT);
    temp_fraction &= 0x000F;
    temp_fraction *= 625;
    temp[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
     if(*cond==LCD_FREQUENCE)                              //Appel la fonction LCD tous les 100
     {
             Lcd_Out(1,1, temptxt);
             Lcd_Out(2, 10, temp);
             Lcd_Chr(2,15,178);                             // Print degree rond                                                 // If you see greek alpha letter try typing 178 instead of 223
             Lcd_Chr(2,16,'C');                             // Print degree character, 'C' for Centigrades
             *cond=0;//Remise a 0 de la condition
     }
}

void vent(int *cond,unsigned *VentValue,char temptxt1[]){
    unsigned int temp2write;
    char temp_whole;
     unsigned int temp_fraction;
    char *temp = "000.0";
    temp2write=*VentValue;
    
    if 
(temp2write & 0x8000) {
       temp[0] = '-';
       temp2write = ~temp2write + 1;
       }
    temp_whole = temp2write >> RES_SHIFT ;
    if (temp_whole/100)
       temp[0] = temp_whole/100  + 48;
    else
       temp
[0] = ' ';
    temp[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
    temp[2] =  temp_whole%10     + 48;             // Extract ones digit
    temp_fraction  = temp2write << (4-RES_SHIFT);
    temp_fraction &= 0x000F;
    temp_fraction *= 625;
    temp[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
     if(*cond==LCD_FREQUENCE)                              //Appel la fonction LCD tous les 100
     {
             Lcd_Out(1,1, temptxt1);
             Lcd_Out(2, 10, "  ");
             Lcd_Out(2, 12, temp);
             *cond=0;//Remise a 0 de la condition
             TMR0=0;
     }
}

void luminosite(int *cond,unsigned *LumiValue, char temptxt2[]){
unsigned long temp_Lumi;
unsigned int temp2voltage;
char txtvoltage[7];
     temp_Lumi = *LumiValue ;
     temp2voltage = temp_Lumi; //((temp_Lumi*(VREF*10))/1024)*2;        // *5.0/1024.0
     if(*cond==LCD_FREQUENCE)                              //Appel la fonction LCD tous les 100
     {
          IntToStr(temp2voltage, txtvoltage);
          Lcd_Out(1,1, temptxt2);
          Lcd_Out(2,10,txtvoltage);
          Lcd_Chr(2,16,'%');                             // Print degree character, 'C' for Centigrades
          delay_ms(150);
          *cond=0;//Remise a 0 de la condition
     }
}


void nextMenu(){
  if(PORTB.F7=1)   {
    BP++;
    Lcd_Cmd(_Lcd_CLEAR);
    Delay_ms(250);
  }
  if(BP==MENU_MAX_ID) BP=0;
}

void main() {
char strTemperatureCu[]= "Temperature     ";
char strTemperatureLo[]= "Temperature min ";
char strTemperatureHi[]= "Temperature max ";
char strVitesseVentCu[]= "Vitesse vent kmh";
char strVitesseVentHi[]= "Rafale  vent kmh";
char strLuminositeCu[] = "Reglage anemo.  ";
int cond=0;  //Condition pour l'affichage sur l'�cran LCD

Init_Device();
Lcd_Init();                           //initialisation du LCD
Lcd_Cmd(_Lcd_CURSOR_OFF);                    //Enleve le curseur
Lcd_Cmd(_Lcd_CLEAR);
TMR0=0;
THi_Freq = 0;
while(
1){

        TCu_Lumi = ((ADC_Read(2)*(VREF*10))/1024)*2  ;
        FACTOR_SPEED = TCu_Lumi;

        TCu_Freq = (((TMR0)*FACTOR_SPEED));
        if ((~TMR0IF)&&(THi_Freq<TCu_Freq)&&(BP==3)) THi_Freq=TCu_Freq;
        TCu_Temp = Sensor();
        if((int)TCu_Temp > (int)THi_Temp) THi_Temp = TCu_Temp;
        if((int)TLo_Temp > (int)TCu_Temp) TLo_Temp = TCu_Temp;
        
         cond
=cond+1;//Incr�mente la variable cond
         switch(BP)   {
                      case 0:
                           temperature(&cond,&TCu_Temp,strTemperatureCu);//Appel la fonction temp�rature
                           nextMenu();
                           break;
                      case 1:
                           temperature(&cond,&TLo_Temp,strTemperatureLo);//Appel la fonction temp�rature
                           nextMenu();
                           break;
                      case 2:
                           temperature(&cond,&THi_Temp,strTemperatureHi);//Appel la fonction temp�rature
                           nextMenu();
                           TMR0=0;
                           break;

                      case 3:
                           vent(&cond,&TCu_Freq,strVitesseVentCu);
                           nextMenu();
                           break;
                      case 4:
                           vent(&cond,&THi_Freq,strVitesseVentHi);
                           nextMenu();
                           break;
                      case 5:
                           luminosite(&cond,&TCu_Lumi,strLuminositeCu);
                           nextMenu();
                           break;

                    }
         }
}

station meteo.jpg

IMG_20160216_063603.jpg

Config MikroC.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Problème de démarrage avec un 16f887
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1948
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#2 Message par Gérard » mar. 16 févr. 2016 15:43

Enlève le PIC du support, mesure la tension d'alim aux pattes prévues. Si OK, tu remets le PIC (dans le bon sens, ce n'est pas une critique, juste pour que tu fasses attention),tu mets la sonde de l'oscillo sur RA6, je vois dans ta config que tu as choisis l'oscillateur interne, tu peux donc mesure Fosc/4 sur RA6.
Et tu viens dire ce qu'il en est.
Au fait, la programmation s'est bien passée?

Edit : correction d'une faute.
Modifié en dernier par Gérard le mar. 16 févr. 2016 17:52, modifié 1 fois.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Problème de démarrage avec un 16f887
tdegremont
Débutant
Débutant
Messages : 30
Enregistré en : novembre 2015

#3 Message par tdegremont » mar. 16 févr. 2016 16:11

ok Gérard, je vais faire ça.
Aux dernières mesures j'avais une tension stable de 5.03v aux bornes du pic, car on ne le vois pas sur la photo mais en dessous du pic il y a un condo de 0.1uF

Je versifierai de nouveau, et je sonderais RA6 comme tu me le propose...
on verra...

Quant à la programmation, oui cela s'est bien passé ...avec beaucoup de temps....j'en suis assez fier ;-)

Problème de démarrage avec un 16f887
Jérémy
Administrateur du site
Administrateur du site
Messages : 2758
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » mar. 16 févr. 2016 18:19

Hello ,

Je te propose dans un second temps, de mettre un jour tes programmes . Suivre ce lien : Programme pour environnement pour mikroC

En effet je vois sur tes photos que tes versions sont biens périmées !.

J'ai essayer vite fait en ouvrant mikro prog ( la V2.32), et je n'ai pas du tout le même screen que toi. Surtout sur la partie OSC. ca ne mange pas de pain d'essayer. je n'ai aps encore examiner ton hard.

La pin sur le RESET est bien avec une pull-up ? ( si il y en a une d'ailleurs)

Tiens nous au courant:

Image

Attention!!
PS : tes photos ne sont pas très visible .suivre ce lien pour le bien de mes yeux
Re PS : merci de mettre le lien datasheet de ton PIC, c'est une bonne habitude à prendre : Suivre ce lien
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Problème de démarrage avec un 16f887
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3285
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » mar. 16 févr. 2016 20:29

bonsoir,


tu peux rajouter une les dans la boucle while pour verifier si le programme tourne...

il me semble ne pas avoir vu d'init ADC

Code : Tout sélectionner

ADC_Init();
while(
1){

        
TCu_Lumi = ((ADC_Read(2)*(VREF*10))/1024)*2  ;
        
FACTOR_SPEED TCu_Lumi;
.. 
etc ..
 
Aide toi, le ciel ou FantasPic t'aidera

Problème de démarrage avec un 16f887
tdegremont
Débutant
Débutant
Messages : 30
Enregistré en : novembre 2015

#6 Message par tdegremont » mer. 17 févr. 2016 09:26

Gérard a écrit :Enlève le PIC du support, mesure la tension d'alim aux pattes prévues. Si OK, tu remets le PIC (dans le bon sens, ce n'est pas une critique, juste pour que tu fasses attention),tu mets la sonde de l'oscillo sur RA6, je vois dans ta config que tu as choisis l'oscillateur interne, tu peux donc mesure Fosc/4 sur RA6.
Et tu viens dire ce qu'il en est.
Au fait, la programmation s'est bien passée?

Edit : correction d'une faute.


Bonjour,
Hier soir j'ai effectué quelques mesures, donc:
la tension d'alimentation du PIC est de 4.885v (stable). cette tension est pratiquement la même que sur ma plaque easypic, j'en ai déduis que mon soucis ne venait pas de là.
J'ai ensuite sondé le signal sur la RA6 comme me le proposé Gérard. c'est une très bonne idée car cela a démontré que le programme était bien en cours d'exécution. (cf. photo.).
sonde.jpg


oscillo.jpg


Note: si vous voyez des erreurs dans mes mesures ou dans le code...ne vous privez pas, je ne me vexerai pas ;-)

Bon, il était déjà tard mais j'ai eu comme une révélation ;-), je me suis rappelé que j'avais paramétré le changement de menu (pin40) en pull down sur ma carte de dev easypic et que sur mon montage j'avais cablé en pull-UP.....

donc, un ptit coup de pompe à désouder...et hop....il est tard, mais ça marche hihihihihi

J'ai quand même quelques comportements différents:
1) le petit rond de température est représenté par un autre sigle chinois ;-)...pas étonnant mes écrans LCD viennent de là-bas.
2) le max température affiche 85C!!!!! je suis obligé de faire un reset manuel après le premier démarrage pour que cela fonctionne bien!!!????
3) Je dois peaufiner l'affichage de la vitesse car elle est un peu aléatoire.....


remarque: paulfjujo concernant ADC_Init, je l'avais mis au départ, mais avec ou sans, cela fonctionnait quand même, je me suis donc dis, autant enlever les choses pas obligatoire ;-)

merci à tous pour votre aide
A bientot
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Problème de démarrage avec un 16f887
tdegremont
Débutant
Débutant
Messages : 30
Enregistré en : novembre 2015

#7 Message par tdegremont » mer. 17 févr. 2016 09:55

En fait, je ne comprends pas la lecture du signal sur la patte RA6, si une âme charitable peux m'expliquer cette mesure?

Dans ma compréhension des choses...mais je dois être totalement à l'ouest, donc n'hésitez pas à me corriger:
Déjà l'amplitude du signal, moi je lis 1.5 volts ?????? je me trompe???? si non, pourquoi je n'ai pas 4.88v???
la période du signal:
Je suis sur 1/5us donc je lis 2.2 carreaux pour un cycle donc 0.2us*2.2=0.44us
Fosc/4 donc ma frequence = 0.44us*4 = 1.76us
1.76us * 568181.82 = 1 Seconde
donc pour moi, il y aura environ 568182 cycle d'horloge en 1 seconde.

Qu'en pensez vous?

Problème de démarrage avec un 16f887
Jérémy
Administrateur du site
Administrateur du site
Messages : 2758
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » mer. 17 févr. 2016 10:23

Hello ,

Ne prends pour argent comptant mes paroles , je ne suis pas sur de moi !;

déjà pour la tension moi je vois sur le Channel 1 2V/div . carreaux de haut donc 6V !

Il me semble que sur RA6 tu vois l'horloge généré par ton PIC . D’après ton image oscillo et ton programme( pas de préscaler) moi je dirais . que tu as 2 carreaux pour une période : donc 10µs .

Comme F= 1/T . on aurait donc : F=1/10µs= 1 000 000 . Soit 1 Mhz . Fosc= F x 4 = soit 4 Mhz

Ca me parait bizarre !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Problème de démarrage avec un 16f887
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1948
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#9 Message par Gérard » mer. 17 févr. 2016 10:37

Sur RA6, on voit 1/4 de la fréquence d'horloge. On voit une période de 10µs, soit 100kHz donc ton PIC tourne a 400kHz.
Coté amplitude, je vois aussi 6V, problème de calibration verticale?

Jérémy, l'inverse de 10E-6 = 100 000 et pas 1 000 000.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Problème de démarrage avec un 16f887
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3285
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » mer. 17 févr. 2016 11:58

Gérard a écrit :Sur RA6, on voit 1/4 de la fréquence d'horloge. On voit une période de 10µs, soit 100kHz donc ton PIC tourne a 400kHz.
Coté amplitude, je vois aussi 6V, problème de calibration verticale?


Moi, je vois plutot le commutateur base de temps sur 0,5µS en tenant compte de la percepective de la photo
la graduation valeur 10µS est bien plus haut sur le commutateur
ce qui serait coherent avec 2x0,5=1 µS => 1Mhz pour FOSC/4 sur RA6 , donc FOSC=4Mhz

6V d'amplitude , je plussoies aussi pour un PB de calibration .

:idea: attendons le verdict de tdegremont.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités