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

Mon apprentissage du pic
PRNN-lab
Amateur
Amateur
Messages : 118
Enregistré en : août 2019

#1 Message par PRNN-lab » sam. 14 sept. 2019 11:25

Bonjour le forum
Je me suis absenté pour continuer mon apprentissage du C for MikroC et je reviens avec un problème sur le pic.
J'ai essayer de réaliser le code d'un appareil qu'on utilise au laboratoire de chimie pour agiter des solutions
L'appareil est simple au debut on nous demande d'entrer 5 temps en seconde
0<T1<15
0<T2<5
0<T3<5
0<T4<10
0<T5<15
Ici je souhaitais faire pour une première fois de l’ingénieurie inverse
A mes yeux voici comment le dispositif fonctionne. Il est constituer de plusieurs agitateur qui agite dans plusieurs sens différent.
Après avoir valider les temps le premier agitateur s'enclenche durant un temps T1 puis s'eteind et le deuxième s’enclenche pendant un temps T2
ensuite s’arrête. Le 3eme agitateur lui s’enclenche durant un temps T3 puis s'eteind pour 1s ensuite reprend avec le 4eme agitateur. Lorsque T4 s’écoule le 3eme agitateur reste allumer encore pendant 1e seconde puis s’arrête et le 5eme agitateur s'enclanche pour T5 .
Maintenant ça y est je connais utiliser la table ASCII :+1:


Maintenant voici ce que mon code fait :cry:
la simulation c'est fait en temps réel avec des led, un quartz de 8Mhz, un lcd1602 et un pic18f4550 et pic18f45k22 j'ai egalement un 18f4620 mais je l'ai pas utiliser
J'ai taper mon code pour le pic18f4550 ensuite j'ai juste changer le pic dans mikro C pour le 45k22 et le resultat etait pire. Je ne sais pas s'il fallait le modifier puisqu'ils ont les même dispositions de roche.


Voici les fait J'ai taper le code entierement comme je l'ai decrit et je l'ai simuler au fur et a mesure au départ j'ai fais le code pour 4 temps, mon code était long et a un moment l'ecran n'affichait plus rien ensuite j'ai reduit le nombre d'appellation de l’encrant et aussi ce que j'ai pus réduire dans des fonctions et la le bingo tout a fonctionné :eek:
Pour les delay variable j'ai utiliser le chronomètre de mon téléphone et après plusieurs test j'ai obtenue un résultat proche de 1s par incrémentation avec cette ligne

Code : Tout sélectionner

for (i=0;i<h;i++)
                {delay_ms(4); 

Si quelqu'un peut m'explique comment cette ligne peut donner 1s :? .... Mais sa marche je ne sais pas comment mais ça marche


Ensuite est venu l'heur d'ajouter le 5eme temps que j'avais oublier :cry: :cry: :cry: et la plus rien l'ecran n'affiche pas rien ne fonctionne et je ne sais pas quoi maitre d'autre dans une fonction
J'ai essayer de mettre un goto variable dans une fonction :sifflotte: :sifflotte: . est ce possible ou suis je juste désespéré? Vas savoir
Ensuite j'ai flacher le pic18f45k22 et la tout etait bisard meme les temps n'etait plus respecte et j'ai tout laisse

voici mon code

Code : Tout sélectionner

//Module de connection du LCD
sbit LCD_RS at LATB5_bit;
sbit LCD_EN at LATB6_bit;
sbit LCD_D4 at LATB1_bit;
sbit LCD_D5 at LATB2_bit;
sbit LCD_D6 at LATB3_bit;
sbit LCD_D7 at LATB4_bit;

sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB6_bit;
sbit LCD_D4_Direction at TRISB1_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB4_bit;
//Fin de la declaration de ce module

void in2string (int i)
{
unsigned short Txt[14];
unsigned short inTemp;
intToStr ( i,Txt); // Convertir en String
inTemp=Ltrim(Txt);
Lcd_Out_CP(inTemp); // Display Ref Temp
}
void aff ()
{
Lcd_Out(2,1, "Press 3 to Cont.");
}
void ch (int j,int k,char Tx[])
{
  Lcd_Out(j,k,tx);
}
void lc (int x,int y,int z)
{
   ch (1,1,"Entrer ");
  //Lcd_Out(1,1,"Entrer");
  in2string (y);
  ch (1,9,"< T");
  //Lcd_Out(1,9,"< T");
  in2string (x);
   ch (1,14,"<");
  //Lcd_Out(1,14,"<");
  in2string (z);
}


void main() {

int a,b,c,d,i,m;
int e,f,g,h,n;

PORTD=0;         // Configuration du PORTD comme digital
TRISD0_bit = 1;                                // set RD0 pin as input
TRISD1_bit = 1;
TRISD2_bit = 1;
TRISD3_bit = 1;
TRISC=0x00;
PORTC=0x00;

Lcd_Init();      // Initialiser l'ecran LCD
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Cmd(_LCD_CLEAR); // Effacer le contenu de l'ecran
   Lcd_Cmd(_LCD_CURSOR_OFF); // Mettre le cursseur OFF
   Lcd_Out(1,4, "CEREDETEC");
   Lcd_Out(2,2, "CONSTRUCTEUR");
   delay_ms(2000);
/*Lcd_Cmd(_LCD_CLEAR);
  Lcd_Out(1,4, "Bertrand");
  Lcd_Out(2,2, "Zeudong");
   delay_ms(2000);*/

// On commence a lire la reference de temps1 entree au clavier

//******************************1er temps**************
   START:
   Lcd_Cmd(_LCD_CLEAR);       // efface le contenue de l'ecran
   lc (1,0,15);
   //Lcd_Out(1,1,"Entrer 0< T1 <15");
   a=0;
   Lcd_Out(2,1,"T1 : ");

do {
Lcd_Out(2,1,"T1 : ");
in2string (a);
if (Button(&PORTD, 0, 1, 0)) {               // button d'increment tation de la valeur  (button1)
      delay_ms(120);
      a++ ;
    }
if (a>15){
a=0;
goto START;
}
if (Button(&PORTD, 1, 1, 0)) {               // button de decrementation de la valeur  (button2)
      delay_ms(120);
      a-- ;
    }
if (a<0){
a=0;
goto START;
}
if (Button(&PORTD, 2, 1, 0)) {               // button de validation (bbutton 3)
      delay_ms(120);
      break ;
    }

     } while(1);
     
Lcd_Cmd
(_LCD_CLEAR);
Lcd_Out (1,1, "T1: ");
in2string (a);
 aff ();
//Lcd_Out(2,1, "Press 3 to Cont.");
do {
if (Button(&PORTD, 3, 1, 0)) {               // button de retour en arriere (button4)
      delay_ms(120);
       goto START;
    }
if (Button(&PORTD, 2, 1, 0)) {               // button3
      delay_ms(120);
       break;
    }

    } while (1);
    
   
//**************************2eme temps************************
     START1:
   Lcd_Cmd(_LCD_CLEAR);       // efface le contenue de l'ecran
     lc (2,0,5);
   //Lcd_Out(1,1,"Entrer 0< T2 <05");
   b=0;
 Lcd_Out(2,1,"T2 : ");

do {
Lcd_Out(2,1,"T2 : ");
in2string (b);
if (Button(&PORTD, 0, 1, 0)) {               // button1
      delay_ms(120);
      b++ ;
    }
if (b>5){
b=0;
goto START1;
}
if (Button(&PORTD, 1, 1, 0)) {               // button2
      delay_ms(120);
      b-- ;
    }
if (b<0){
b=0;
goto START1;
}
if (Button(&PORTD, 2, 1, 0)) {               // button3
      delay_ms(120);
      break ;
    }

     } while(1);
     
     Lcd_Cmd
(_LCD_CLEAR);
Lcd_Out (1,1, "T2: ");
in2string (b);
aff ();
//Lcd_Out(2,1, "Press 3 to Cont.");
do {
if (Button(&PORTD, 3, 1, 0)) {               // button4
      delay_ms(120);
       goto START1;
    }
if (Button(&PORTD, 2, 1, 0)) {               // button3
      delay_ms(120);
       break;
    }

    } while (1);
    
    
//*****************3eme temps********************
    
   START2
:
   Lcd_Cmd(_LCD_CLEAR);       // efface le contenue de l'ecran
   lc(3,0,5);
  // Lcd_Out(1,1,"Entrer 0< T3 <05");
   c=0;
   Lcd_Out(2,1,"T3 : ");

do {
Lcd_Out(2,1,"T3 : ");
in2string (c);
if (Button(&PORTD, 0, 1, 0)) {               // button1
      delay_ms(120);
      c++ ;
    }
if (c>5){
c=0;
goto START2;
}
if (Button(&PORTD, 1, 1, 0)) {               // button2
      delay_ms(120);
      c-- ;
    }
if (c<0){
c=0;
goto START2;
}
if (Button(&PORTD, 2, 1, 0)) {               // button3
      delay_ms(120);
      break ;
    }

     } while(1);

     Lcd_Cmd(_LCD_CLEAR);
Lcd_Out (1,1, "T3: ");
in2string (c);
aff ();
//Lcd_Out(2,1, "Press 3 to Cont.");
do {
if (Button(&PORTD, 3, 1, 0)) {               // button4
      delay_ms(120);
       goto START2;
    }
if (Button(&PORTD, 2, 1, 0)) {               // button3
      delay_ms(120);
       break;
    }

    } while (1);
    
    
//************************4eme temps*****************
    
 START3
:
   Lcd_Cmd(_LCD_CLEAR);       // efface le contenue de l'ecran
    lc (4,0,10);
  // Lcd_Out(1,1,"Entrer 0< T4 <10");
   d=0;
   Lcd_Out(2,1,"T4 : ");

do {
Lcd_Out(2,1,"T4 : ");
in2string (d);
if (Button(&PORTD, 0, 1, 0)) {               // button1
      delay_ms(120);
      d++ ;
    }
if (e>10){
d=0;
goto START3;
}
if (Button(&PORTD, 1, 1, 0)) {               // button2
      delay_ms(120);
      d-- ;
    }
if (d<0){
d=0;
goto START3;
}
if (Button(&PORTD, 2, 1, 0)) {               // button3
      delay_ms(120);
      break ;
    }

     } while(1);

Lcd_Cmd(_LCD_CLEAR);
Lcd_Out (1,1, "T4: ");
in2string (d);
aff ();
//Lcd_Out(2,1, "Press 3 to Cont.");
do {
if (Button(&PORTD, 3, 1, 0)) {               // button4
      delay_ms(120);
       goto START3;
    }
if (Button(&PORTD, 2, 1, 0)) {               // button3
      delay_ms(120);
       break;
    }

    } while (1);
    

//***********************5eme temps*******************

/*START4:
   Lcd_Cmd(_LCD_CLEAR);       // efface le contenue de l'ecran
    lc (5,0,15);
  // Lcd_Out(1,1,"Entrer 0< T5 <15");
   m=0;
   ch (2,1,"T5 : ");
   //Lcd_Out(2,1,"T5 : ");

do {
ch (2,1,"T5 : ");
//Lcd_Out(2,1,"T5 : ");
in2string (m);
if (Button(&PORTD, 0, 1, 0)) {               // Detect logical one
      delay_ms(120);
      m++ ;
    }
if (m>15){
m=0;
goto START4;
}
if (Button(&PORTD, 1, 1, 0)) {               // Detect logical one
      delay_ms(120);
      m-- ;
    }
if (m<0){
m=0;
goto START4;
}
if (Button(&PORTD, 2, 1, 0)) {               // Detect logical one
      delay_ms(120);
      break ;
    }

     } while(1);

Lcd_Cmd(_LCD_CLEAR);
ch (1,1, "T5: ");
//Lcd_Out (1,1, "T5: ");
in2string (m);
 aff ();
//Lcd_Out(2,1, "Press 3 to Cont.");
do {
if (Button(&PORTD, 3, 1, 0)) {               // Detect logical one
      delay_ms(120);
       goto START4;
    }
if (Button(&PORTD, 2, 1, 0)) {               // Detect logical one
      delay_ms(120);
       break;
    }

    } while (1);*/
    
    



Lcd_Cmd
(_LCD_CLEAR);

ch (1,1,"T1:");
//Lcd_Out(1,1, "T1: ");
in2string (a);

ch (1,7,"T2:");
//Lcd_Out(1,8, "T2: ");
in2string (b);

ch (2,1,"T3:");
//Lcd_Out(2,1, "T3: ");
in2string (c);

ch (2,7,"T4:");
//Lcd_Out(2,8, "T4: ");
in2string (d);

ch (2,12,"T5:");
//in2string (m);

do {
if (Button(&PORTD, 2, 1, 0)) {               // Detect logical one
      delay_ms(120);
       break;
    }

    } while (1);

READY:
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Out(1,1, "Ready");
aff ();

do {
if (Button(&PORTD, 2, 1, 0)) {               // Detect logical one
      delay_ms(120);
       break;
    }
if (Button(&PORTD, 3, 1, 0)) {               // Detect logical one
      delay_ms(120);
       goto START;
    }

    } while (1);
    
Lcd_Cmd
(_LCD_CLEAR);
 Lcd_Out(1,1, "EN COUR");
   e=a*100;
   f=b*100;
   g=c*100;
   h=d*100;
  // n=m*100;
   PORTC=0x01;
   for (i=0;i<e;i++)
  { delay_ms(4);  }
   PORTC=0x02;
   for (i=0;i<f;i++)
   {delay_ms(4);}
   PORTC=0x04;
   for (i=0;i<g;i++)
   {delay_ms(4);}
    PORTC=0x00;
   delay_ms(100);
   PORTC=0x44;
   for (i=0;i<h;i++)
   {delay_ms(4); }
   /*PORTC=0x02;
   delay_ms(100);*/
    /*PORTC=0x80;
    for (i=0;i<2;i++)
   {delay_ms(4); }*/
   PORTC=0x00;
   goto READY;




j'ai mis le 5eme temps qui ne fonctionne pas en commantaire

Et je ne connais toujours pas comment faire un bon chois de pic :sad:
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Ce qui doit marcher jamais ne doit être pressé...... :idea:

Mon apprentissage du pic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » sam. 14 sept. 2019 12:15

bonjour,


Je ne vais pas passer mon temps à tester ton programme, mais
quelques remarques:


Code : Tout sélectionner

for (i=0;i<h;i++)
                {delay_ms(4); 


on va supposer que h vaut 250 !
c'est toi qui ecrit le programme, à toi de savoir ce que represente h
-----------------


Code : Tout sélectionner


void lc 
(int x,int y,int z)
{
   ch (1,1,"Entrer ");
  //Lcd_Out(1,1,"Entrer");
  in2string (y);
  ch (1,9,"< T");
  //Lcd_Out(1,9,"< T");
  in2string (x);
   ch (1,14,"<");
  //Lcd_Out(1,14,"<");
  in2string (z);


:!!: evite d'empiler des appels de sous programme
sous peine de debordement de la pile d'appel et crash du programme
utilisation de plus d'espace Flash rom et perte d'efficacité.
de plus ça perd beaucoup en lisibilité et standardisation d'ecriture

:eek: GOTO
On n'evite d'utiliser les Goto xx en C , c'est plutot le domaine du basic !
utilise de preference un switch() ..case
ou "une machine d'etat "

:!!: Attention, avec un LCD de 16 caracteres on prevoit un tableau Txt de 17 cars minimum
au cas ou on y logerait un string de 16 cars + terminator
sinon risque de debordement et crash intempestif du programme
Aide toi, le ciel ou FantasPic t'aidera

Mon apprentissage du pic
PRNN-lab
Amateur
Amateur
Messages : 118
Enregistré en : août 2019

#3 Message par PRNN-lab » sam. 14 sept. 2019 13:09

on va supposer que h vaut 250 !
c'est toi qui ecrit le programme, à toi de savoir ce que represente h


ici h est un nombre compris entre 1 et 15 correspondant au 5eme temps

Code : Tout sélectionner

evite d'empiler des appels de sous programme
sous peine de debordement de la pile d'
appel et crash du programme
utilisation de plus d
'espace Flash rom et perte d'efficacité.
de plus ça perd beaucoup en lisibilité et standardisation d’écriture

D'accord c'est ça le mots mon programme a crasher
il en est de même lorsque j'utilise a la suite le sous programme LCD_OUT. Je voulais limiter l'appellation du LCD_OUT car cela crashait mon programme mais je
l'ai fait crasher de la même façon avec les appellations d’après votre explication. Svp quel serais donc la façons la plus commode d’écrire sur ce LCD tout en limitant les appellations de sous programme a la suite?

On n'evite d'utiliser les Goto xx en C , c'est plutot le domaine du basic !
utilise de preference un switch() ..case
ou "une machine d'etat "

D'accord mais pour ce qui est d'un retour en arrière? avec le switch je serai obliger de recopier exactement ce que je veux en dessous du case incluent le cas ou ce que je veux a déjà été cris plus haut. A mois qu'il n'y est une autre solution?

Attention, avec un LCD de 16 caracteres on prevoit un tableau Txt de 17 cars minimum
au cas ou on y logerait un string de 16 cars + terminator
sinon risque de debordement et crash intempestif du programme


D'accord merci je viens de passer ma variable a txt a 17
Ce qui doit marcher jamais ne doit être pressé...... :idea:

Mon apprentissage du pic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » sam. 14 sept. 2019 18:28

:furieux:
Ton programme "pique les yeux"
cette expression n'est pas de moi, mais convient parfaitement ici!
car :
* tu utilises à foison des GOTO dans des boucle while(1)...
* Les identations ne sont pas du tout respectées : lisibilité du programme horrible
MikroC affiche des lignes vericales entre les parentheses ouvrante et fermante
qui aide beaucoup à la lisibilité du programme


* utilise LATC au lieu de PORTC pour les sorties
* pour creer tes 5 tempo, il faut 1 seul sous programme avec passage de parametres
utilise une table avec index pour stocher les valeurs de tempo
tu as 5 pas de programme , fait des recherches sur "machine d'etat"
programme evoluant en fonction de l'avancement ( Là on est plus pres de la programmation d'un automate programmable!)
ou avec le switch() case, aiguillage vers le tronc commun de traitement des boutons et
rangement des valeurs de tempo crées

===========================
si h=d*100 ;
et que tu veux une tempo T5 de 0 à 15sec
avec "d" defini par Tempo T4

Question :

Code : Tout sélectionner

 if (e>10)d=0

que vient faire "e" ici ?
ou est-il defini ?
ne serait ce pas plutot si d>10 d=0 ?

en effet tu ne pourrat jamais avoir 1 sec avec delay 4mS et une valeur h=d*100
d=2 => h= 200x4=800mS
d=3 => h=300x4=1200mS

* definir la resolution desirée pour chacune des 5 tempos..
* variables a,..n unsigned integer => 0 à 65535 possible
donc travailler avec une dynamique de valeur plus large
tu veux des secondes .OK, mais travaille plutot avec des milisecondes
au lieu de valeur*100
0 à 15 sec => 0 à 15000 ms d'ou le delay minimum =1mS

ou si tu veux rester en 1/100em de seconde
il faut que les unités et les tests soient coherents.

il est possible de faire un bouton à incrementation variable
plus longtemps on appui, plus ça augmente rapidement
on le lache la vitesse de progression repasse au minimum
pour finir le reglage avec de faible increments
:sifflotte: .. mais c'est une autre histoire
Aide toi, le ciel ou FantasPic t'aidera

Mon apprentissage du pic
PRNN-lab
Amateur
Amateur
Messages : 118
Enregistré en : août 2019

#5 Message par PRNN-lab » sam. 14 sept. 2019 19:33

Merci des conseils
je m'y met et je vous reviens
Ce qui doit marcher jamais ne doit être pressé...... :idea:

Mon apprentissage du pic
PRNN-lab
Amateur
Amateur
Messages : 118
Enregistré en : août 2019

#6 Message par PRNN-lab » dim. 15 sept. 2019 12:59

Bonjour a tous....
J'ai pas encore pus integrer le switch dans mon code mais cela est en cour
J'ai pus faire tous mes tempos dans une seul procedure et le code fonctionne comme je le voulais

Code : Tout sélectionner

//Module de connection du LCD
sbit LCD_RS at LATB5_bit;
sbit LCD_EN at LATB6_bit;
sbit LCD_D4 at LATB1_bit;
sbit LCD_D5 at LATB2_bit;
sbit LCD_D6 at LATB3_bit;
sbit LCD_D7 at LATB4_bit;

sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB6_bit;
sbit LCD_D4_Direction at TRISB1_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB4_bit;
//Fin de la declaration de ce module

void in2string (int i)
{
unsigned short Txt[17];
unsigned short inTemp;
intToStr i,Txt); // Convertir en String
inTemp=Ltrim(Txt);
Lcd_Out_CP(inTemp); // Display Ref Temp
}
void aff ()
{
Lcd_Out(2,1"Press 3 to Cont.");
}
void ch (int j,int k,char Tx[17])
{
  
Lcd_Out(j,k,Tx);
}
void lc (int x,int y,int z)
{
   
ch (1,1,"Entrer ");
  
//Lcd_Out(1,1,"Entrer");
  
in2string (y);
  
ch (1,9,"< T");
  
//Lcd_Out(1,9,"< T");
  
in2string (x);
   
ch (1,14,"<");
  
//Lcd_Out(1,14,"<");
  
in2string (z);
}

int tempo (int a,int b,char TTx[]){
int c;
  
START:
   
Lcd_Cmd(_LCD_CLEAR);       // efface le contenue de l'ecran
   
lc (a,0,b);
   
//Lcd_Out(1,1,"Entrer 0< T1 <15");
   
c=0;
   
Lcd_Out(2,1,TTx);

do {
Lcd_Out(2,1,TTx);
in2string (c);
if (
Button(&PORTD010)) {               // button d'increment tation de la valeur  (button1)
      
delay_ms(120);
      
c++ ;
    }
if (
c>b){
c=0;
goto 
START;
}
if (
Button(&PORTD110)) {               // button de decrementation de la valeur  (button2)
      
delay_ms(120);
      
c-- ;
    }
if (
c<0){
c=0;
goto 
START;
}
if (
Button(&PORTD210)) {               // button de validation (bbutton 3)
      
delay_ms(120);
      break ;
    }

     } while(
1);

Lcd_Cmd(_LCD_CLEAR);
Lcd_Out (1,1TTx);
in2string (c);
 
aff ();
//Lcd_Out(2,1, "Press 3 to Cont.");
do {
if (
Button(&PORTD310)) {               // button de retour en arriere (button4)
      
delay_ms(120);
       goto 
START;
    }
if (
Button(&PORTD210)) {               // button3
      
delay_ms(120);
       break;
    }

    } while (
1);
   return (
c);
}


void main() {

int a,b,c,d,i,m;
int e,f,g,h,n;

PORTD=0;         // Configuration du PORTD comme digital
TRISD0_bit 1;                                // set RD0 pin as input
TRISD1_bit 1;
TRISD2_bit 1;
TRISD3_bit 1;
TRISC=0x00;
LATC=0x00;

Lcd_Init();      // Initialiser l'ecran LCD
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Cmd(_LCD_CLEAR); // Effacer le contenu de l'ecran
   
Lcd_Cmd(_LCD_CURSOR_OFF); // Mettre le cursseur OFF
   
Lcd_Out(1,4"CEREDETEC");
   
Lcd_Out(2,2"CONSTRUCTEUR");
   
delay_ms(2000);
/*Lcd_Cmd(_LCD_CLEAR);
  Lcd_Out(1,4, "Bertrand");
  Lcd_Out(2,2, "Zeudong");
   delay_ms(2000);*/

// On commence a lire la reference de temps1 entree au clavier

START1:

//******************************1er temps**************

  
a=tempo(1,15,"T1 : ");
  
//******************************2eme temps*********************
  
b=tempo(1,5,"T2 : ");
  
//******************************3eme temps*********************
  
c=tempo(1,5,"T3 : ");
  
//******************************4eme temps*********************
  
d=tempo(1,10,"T4 : ");
  
//******************************5eme temps*********************
  
e=tempo(1,15,"T5 : ");

// affiche les tempos

READY:
Lcd_Cmd(_LCD_CLEAR);

ch (1,1,"T1:");
//Lcd_Out(1,1, "T1: ");
in2string (a);

ch (1,7,"T2:");
//Lcd_Out(1,8, "T2: ");
in2string (b);

ch (2,1,"T3:");
//Lcd_Out(2,1, "T3: ");
in2string (c);

ch (2,7,"T4:");
//Lcd_Out(2,8, "T4: ");
in2string (d);

ch (2,12,"T5:");
in2string (e);

do {
if (
Button(&PORTD210)) {               // Detect logical one
      
delay_ms(120);
       break;
    }
if (
Button(&PORTD310)) {               // Detect logical one
      
delay_ms(120);
       goto 
START1;
    }

    } while (
1);
    

// Declanchement du processus

Lcd_Cmd(_LCD_CLEAR);
 
Lcd_Out(1,1"EN COUR");
   
m=a*100;
   
f=b*100;
   
g=c*100;
   
h=d*100;
   
n=e*100;
   
LATC=0x01;
   for (
i=0;i<m;i++)
  { 
delay_ms(10);  }
   
LATC=0x02;
   for (
i=0;i<f;i++)
   {
delay_ms(10);}
   
LATC=0x04;
   for (
i=0;i<g;i++)
   {
delay_ms(10);}
    
LATC=0x00;
   
delay_ms(1000);
   
LATC=0x44;
   for (
i=0;i<h;i++)
   {
delay_ms(10); }
   
PORTC=0x04;
   
delay_ms(1000);
    
PORTC=0x80;
    for (
i=0;i<n;i++)
   {
delay_ms(10); }
   
LATC=0x00;
   goto 
READY;



en mesurant le temps a chaque fois avec le chronomètre de mon téléphone les temps ne sont pas respecte
le delay de 1000ms seconde est sensiblement supérieur a 2s

après plusieurs test voici la boucle se rapprochant le plus de mon résultat

Code : Tout sélectionner

  
  m
=a*100;
   
f=b*100;
   
g=c*100;
   
h=d*100;
   
n=e*100;
   
LATC=0x01;
   for (
i=0;i<m;i++)
  { 
delay_ms(4);  }
   
LATC=0x02;
  for (
i=0;i<f;i++)
   {
delay_ms(4);
   
LATC=0x04;
   for (
i=0;i<g;i++)
   {
delay_ms(4);}
    
LATC=0x00;
   
delay_ms(500);
   
LATC=0x44;
   for (
i=0;i<h;i++)
   {
delay_ms(4); }
   
PORTC=0x04;
   
delay_ms(500);
    
PORTC=0x80;
    for (
i=0;i<n;i++)
   {
delay_ms(4); }
   
LATC=0x00


par exemple lorsque b=2 --> f=2*100 et code

Code : Tout sélectionner

for (i=0;i<f;i++)
   {
delay_ms(4); 

me donne un delay de 2s

de même que le delay_ms(500) est plus proche de 1s que le delay_ms(1000) a moins que mon chronomètre ne soit défectueux
Ce qui doit marcher jamais ne doit être pressé...... :idea:

Mon apprentissage du pic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » dim. 15 sept. 2019 19:21

bonjour,

tu es dans le monde reel ou Proteus ?


Oscillateur Interne ou Quartz ?


post ta config bits
ou le fichier *cfgsh correspondant à ton PIC
ou le fichier *.cfg se retrouvat apres compilation dans ton directory de travail

si Fosc interne, ton init de FOSC ?

exemple pour 16MHz

Code : Tout sélectionner



   OSCTUNE
=0;
  // OSCCON = 0b01110010  ; //0x72 ;     //Oscillateur à 16Mhz
  // OSCCON = 0b01100010  ; //0x62 ;     //Oscillateur à 8Mhz
   // OSCCON = 0b01100000  ; //0x60 ;     //Oscillateur à 8Mhz si usage PLL
  // OSCCON = 0b01110000  ; //0x70 ;     //Oscillateur à 16Mhz si usage PLL
   OSCCON = 0b01110010  ; //0x72 ;     //Oscillateur à 16Mhz SANS PLL
   OSCTUNE.PLLEN=0    ;   // 1= avec PLL => 64Mhz    0 =sans PLL => 16Mhz
   OSCCON2=0;
   while (OSCCON.HFIOFS==0); // wait stable oscillator

 



un oubli ?

Code : Tout sélectionner


  PORTC
=0x04;
   delay_ms(500);
    PORTC=0x80;




fait un test:
allume une led
delay_ms(5000);
eteint la led
et fait un chrono ...
si tu n'as pas 5 secondes => probleme de config bit ou FOSC
Aide toi, le ciel ou FantasPic t'aidera

Mon apprentissage du pic
PRNN-lab
Amateur
Amateur
Messages : 118
Enregistré en : août 2019

#8 Message par PRNN-lab » dim. 15 sept. 2019 20:14

monde reel quartz de 8mhz ok je test le code de 5 seconde je vous reviens

voici mon fichier cfg

Code : Tout sélectionner


<?xml version="1.0"?>
<MCU_DEVICE_FLAGS>
  <DEVICE>
    <DEVICE_NAME>P18F4550</DEVICE_NAME>
    <VALUE>
      <COUNT>12</COUNT>
      <VALUE0>
        <VAL>$300000:$0000</VAL>
      </VALUE0>
      <VALUE1>
        <VAL>$300001:$000C</VAL>
      </VALUE1>
      <VALUE2>
        <VAL>$300002:$001F</VAL>
      </VALUE2>
      <VALUE3>
        <VAL>$300003:$001E</VAL>
      </VALUE3>
      <VALUE4>
        <VAL>$300005:$0083</VAL>
      </VALUE4>
      <VALUE5>
        <VAL>$300006:$0081</VAL>
      </VALUE5>
      <VALUE6>
        <VAL>$300008:$000F</VAL>
      </VALUE6>
      <VALUE7>
        <VAL>$300009:$00C0</VAL>
      </VALUE7>
      <VALUE8>
        <VAL>$30000A:$000F</VAL>
      </VALUE8>
      <VALUE9>
        <VAL>$30000B:$00E0</VAL>
      </VALUE9>
      <VALUE10>
        <VAL>$30000C:$000F</VAL>
      </VALUE10>
      <VALUE11>
        <VAL>$30000D:$0040</VAL>
      </VALUE11>
    </VALUE>
  </DEVICE>
</MCU_DEVICE_FLAGS>

Ce qui doit marcher jamais ne doit être pressé...... :idea:

Mon apprentissage du pic
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#9 Message par Claudius » mar. 17 sept. 2019 19:30

Bonjour le forum,
PRNN-lab a écrit le 14 sept. 2019

Bonjour le forum
Je me suis absenté pour continuer mon apprentissage du C for MikroC...

Pour ce qui est du Langage C et notamment l'utilisation du switch/case proposé par paulfjujo, je te conseille de passer par OnlineGDB

En effet, cela permet rapidement de tester un bout de code purement C et hors contextes MikroC et PIC naturellement en s'appuyant sur la méthode printf() pour bien comprendre ce qui est écrit, interprété et exécuté ;-)

Mon apprentissage du pic
PRNN-lab
Amateur
Amateur
Messages : 118
Enregistré en : août 2019

#10 Message par PRNN-lab » jeu. 19 sept. 2019 00:24

D'accord merci j'essaie
Ce qui doit marcher jamais ne doit être pressé...... :idea:


Retourner vers « Langage C »

Qui est en ligne

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