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

Programmer le fonctionnement par étapes
EmnaBz
Membre
Membre
Messages : 12
Enregistré en : juin 2021

#1 Message par EmnaBz » sam. 5 juin 2021 12:23 lien vers la Data-Sheet : Cliquez ici

Bonjour tout le monde, j'essaie de faire la programmation (en MikroC)de l'organigramme que vous trouverez en jointure. Le fonctionnement doit se faire dans l'ordre de l'organigramme c'est pour celà que j'ai utilisé la variable "etape".
1) Mais j'ai toujours des problèmes dans la simulation sur proteus au niveau des LEDs LES et LAT (qui se trouvent à droite), ils ne s'allument pas (je pense qu'ils s'allument mais non visibles à l'oeil nu) et moi j'ai besoin que LAT soit allumé tout au long de la simulation tant que MICON=1 et que LES soit toujours allumé tant que le test d'étanchéité est bon (la variable pka soit dans l'intervalle [min;max])
2) autre problème, le programme ne fonctionne pas en temps réel, càd si au cours de la simulation je modifie l'état des entrées MICON, MIDET1, MIDET2 ... ça ne change rien et n'applique pas l'algorithme du programme :?
3) autre chose que je n'ai pas encore programmé, en appuyant sur le bouton "BTN" l'EVCON doit s'arrêter et par la suite tout le programme doit s'arrêter et toutes les variables reviennent à l'état initial: est-ce que nécessite une interruption?

Merci énormément pour votre aide et votre temps, j'espère que c'est assez clair pour que vous comprenez mon travail.
Je vais vous laisser le fichier de simulation sur isis dans un lien puisque ça ne s'attache pas ici: https://www.transfernow.net/dl/2021060523DpJAiR
Vous trouverez une capture de ma simulation en cas d'incapacité de télécharger le fichier.
voici le code:

Code : Tout sélectionner

#define MICON portB.f3
#define MIDET1 portB.f2
#define MIDET2 portB.f1
#define MIDET3 portB.f0
#define MIDET4 portB.f3
#define MIV1 portA.f1
#define MIV2 portA.f2
#define MIV3 portA.f3
#define MIV4 portA.f4
#define DET4 PORTC.f0
#define DET3 portC.f1
#define DET2 portC.f2
#define DET1 portC.f3
#define PRE portC.f4
#define EVCON portG.f4
#define EVDET1 portG.f3
#define EVDET2 portF.f7
#define EVLTD portF.f6
#define D1 portE.f4
#define D2 portE.f5
#define D3 portE.f6
#define D4 portE.f7
#define LES portF.f4
#define LAT portf.F5
#define BTN porta.f5

unsigned finale=4,chance=0,etape=1,pka=2000;
const 
t1=2,t2=2,min=0,max=5000;
void main() {
trisb.f0=1;trisb.f1=1;trisb.f2=1;trisb.f3=1//configuration des pins d'entrées du port B
trisc.f0=0;trisc.f1=0;trisc.f2=0;trisc.f3=0;trisc.f4=0//configuration des pins de sortie du port C
trisA=0xFF//configuration du port A comme entrée
trisE=0x00//configuration du port E comme entrée
trisF=0x00//configuration du port F comme sortie
trisg=0b11100001;  //configuration des pins du port G
 
porta=0x00;portb=0x00;portc=0x00;portd=0x00;porte=0x00;portf=0x00;portg=0x00;

  if(
MICON==1&EVCON==0){
  
PRE=1;LAT=1;EVCON=1;
  }
 
// etape++;

  //1ère étape: det1
  
while(EVCON==etape==chance<=finale){
  
LAT=1;
  if (
MIDET1==1){
  
DET1=1;etape++;chance=0;}
  else {
D1=1;chance++;}
  if (
chance>finale){
  
D1=1;etape++;chance=0;}
  }
  
//2ème étape: det2
  
while(EVCON==etape==chance<=finale){
  
LAT=1;
  if (
MIDET2==1){
  
DET2=1;etape++;chance=0;}
  else {
D2=1;chance++;}
  if (
chance>finale){
  
D2=1;etape++;CHANCE=0;}
  }
   
//3ème étape: det3
  
while(EVCON==etape==chance<=finale){
  
LAT=1;
  if (
MIDET3==1){
  
DET3=1;etape++;chance=0;}
  else {
D3=1;chance++;}
  if (
chance>finale){
  
D3=1;etape++;chance=0;}
  }
  
  
//4ème étape: activation EV d'étanchéité
   
while(EVCON==1  etape==4){
   
LAT=1;
   
EVLTD=1;delay_ms(1000*t1);
   
etape++;
   }
   
//5ème étape:  test d'étanchéité
   
while(EVCON==etape==chance<=finale){
   
LAT=1;
   
EVLTD=1;
   
delay_ms(1000*t2);
   if (
pka>min pka<max){
   
LES=1;DET4=1;etape++;
   }
   else {
D4=1;chance++;}
   if (
chance>finale){
   
D4=1;etape++;CHANCE=0;}
   }
   
//6ème étape: EV étanche OFF et fin du cycle
   
while(EVCON==etape==6){
   
LAT=1;
   
EVLTD=0;
   }

   
//calcul nombre de voies
   //calcul nombre de détections
   //interruption: button release?? 
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Programmer le fonctionnement par étapes
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » sam. 5 juin 2021 17:41 lien vers la Data-Sheet : Cliquez ici

Bonjour

Il manque des résistances sur les interrupteurs et sur des leds, le pic n'est pas alimenté.
Dans le programme, tu ne fais jamais LAT = 0, donc si la led LAT ne s'allume pas c'est que la condition (MICON == 1 && EVCON == 0) n'est jamais vérifiée. C'est dans ce test qu'on allume la led.
Tu ne peux pas faire du pas à pas dans le simulateur ?
Si ce n'est pas possible, il faut tester un programme simple, par exemple

Code : Tout sélectionner

while (1) {
  if (BTN == 1) {
    portc = porte = portf = portg = 0;
  }
  else if (MICON == 1 && EVCON == 0) {
    PRE = 1; LAT = 1; EVCON = 1;
  }
}

Programmer le fonctionnement par étapes
EmnaBz
Membre
Membre
Messages : 12
Enregistré en : juin 2021

#3 Message par EmnaBz » dim. 6 juin 2021 12:22 lien vers la Data-Sheet : Cliquez ici

Bonjour,
merci pour votre réponse Satinas, en fait la LED s'allume dans un cas: lorsque je mets la même condition dans une boucle while (pas avec if) mais là le reste du proggramme ne fonctionne pas, le programme reste bloqué dans la bourcle while (MICON == 1 & EVCON == 0).
En plus dans le programme actuel
if(MICON==1&EVCON==0){
PRE=1;LAT=1;EVCON=1;
}
PRE=1 et EVCON=1 fonctionnent donc le problème c'est avec la LED je pense, çàd la condition est vérifiée, même si j'ai ajouté les résistances c'est la même chose.
Sauf que pour ce même programme lorsque j'ajoute un delay_ms(1000) après chaque fois que je tape LAT=1 , là elle s'allume et ça reste allumée tout au long de la simulation MAIS:
1) elle s'éteint à la fin (c'est normal parceque c'est après le dernier delay mais ce n'est pas ce qu'on veut réellement)
2) le fonctionnement devient beaucoup plus lent et long
:mur: :cry:

Sinon je ne comprends pas ce que vous voulez dire par le pas pas dans le simulateur (sachant que je suis débutante)
Merci énormément pour votre temps

Programmer le fonctionnement par étapes
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » dim. 6 juin 2021 12:39 lien vers la Data-Sheet : Cliquez ici

 ! Message de modération :
Bonjour à tous,

Je déplace le sujet dans la partie C, car il s'agit clairement d'une programmation en C avec MikroC !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Programmer le fonctionnement par étapes
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » dim. 6 juin 2021 12:54 lien vers la Data-Sheet : Cliquez ici

Bonjour, le pas à pas permet de lancer la simulation en exécutant les instructions C une par une, en appuyant une touche du clavier PC.
Tu dis que la led LAT s'éteind, où est la ligne de ton programme qui éteind cette led ? ou alors tu resettes le pic ?
Comment se termine ton programme, il semble qu'il manque la fin , je ne vois pas le } de fin du main.
Est ce que tu sais pourquoi j'ai mis le while (1) { } dans mon programme ?

Programmer le fonctionnement par étapes
EmnaBz
Membre
Membre
Messages : 12
Enregistré en : juin 2021

#6 Message par EmnaBz » dim. 6 juin 2021 17:44 lien vers la Data-Sheet : Cliquez ici

Re
Merci Mr Jérémy pour votre intervention.
Merci également Satinas pour votre réponse et votre intérêt !
Je connais pas la fonctionnalité pas à pas je vais chercher si elle existe dans le simulateur proteus.
Normalement la LED LAT s'éteint tant que pas d'instruction LAT=1 est présente.
Oui c'est vrai un } manquant à la fin du programme que j'ai copié pour vous mais il est présent dans mon programme dans la simulation (d'ailleurs si c'était pas présent le programme ne compilera même pas).
Je pense que le while(1){ } c'est pour assurer que le programme ne s'arrête jamais, une boucle infinie. C'est ça le but, non?

Programmer le fonctionnement par étapes
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#7 Message par satinas » dim. 6 juin 2021 18:08 lien vers la Data-Sheet : Cliquez ici

Oui, c'est cela, et ce while(1){ } manque dans ton programme, car une fois passée l'étape 6, le pic va sortir du programme, et faire n'importe quoi. La boucle infinie le force à rester dans le programme.

portf est le registre d'entrée/sortie associé au port F. Ce registre a 2 fonctions. On le lit pour savoir l'état des pins du port. On l'écrit si le port est configuré en sortie.
#define LAT portf.F5
LAT désigne le bit 5 du registre portf.
lorsque tu fais LAT = 1, tu allumes la led (pin F5) et la led RESTERA ALLUMEE tant que tu ne fais pas : soit LAT=0 (F5 passe à 0V), soit PORTF=0 (tout le port F passe à 0V)

#define MIDET4 portB.f3
Là y a erreur, c'est B4 :)

Tu devrais essayer de tester mon programme, il permet d'allumer ou éteindre la led, en jouant sur les inter BTN et MICON

Programmer le fonctionnement par étapes
EmnaBz
Membre
Membre
Messages : 12
Enregistré en : juin 2021

#8 Message par EmnaBz » dim. 6 juin 2021 21:03 lien vers la Data-Sheet : Cliquez ici

Re
Merci Satinas pour vos clarifications c'est utile.
J'ai effacé l'initialisation à 0 du portF pour éviter que LAT (et LES) s'éteignent.
J'ai essayé votre programme mais ça ne fonctionne pas dans les deux conditions de BTN (si j'inverse les conditions (BTN==0 devient BTN==1 et inversement) le programme fonctionne dans les deux conditions de BTN :?
Sinon j'ai testé mon programme sans la condition sur BTN après vos rectifications et ça s'améliore sauf que je rencontre toujours ce problème: lorsque les 2 LEDs LAT et LES sont à 1 dans la même instruction une seule LED s'allume dans la simulation, c'est celle écrite au deuxième lieu (çàd les LEDs ne s'allument pas simultanément) :?
voilà le programme que je teste :

Code : Tout sélectionner

#define MICON portB.f3
#define MIDET1 portB.f2
#define MIDET2 portB.f1
#define MIDET3 portB.f0
#define MIDET4 portB.f4
#define MIV1 portA.f1
#define MIV2 portA.f2
#define MIV3 portA.f3
#define MIV4 portA.f4
#define DET4 PORTC.f0
#define DET3 portC.f1
#define DET2 portC.f2
#define DET1 portC.f3
#define PRE portC.f4
#define EVCON portG.f4
#define EVDET1 portG.f3
#define EVDET2 portF.f7
#define EVLTD portF.f6
#define D1 portE.f4
#define D2 portE.f5
#define D3 portE.f6
#define D4 portE.f7
#define LES portF.f4
#define LAT portf.F5
#define BTN porta.f5
 unsigned etape=0;
void main() {
trisb.f0=1;trisb.f1=1;trisb.f2=1;trisb.f3=1;trisb.f4=1; //configuration des pins d'entrées du port B
trisc.f0=0;trisc.f1=0;trisc.f2=0;trisc.f3=0;trisc.f4=0; //configuration des pins de sortie du port C
trisA=0xFF; //configuration du port A comme entrée
trisE=0x00; //configuration du port E comme entrée
trisF=0x00; //configuration du port F comme sortie
trisg=0b11100001;  //configuration des pins du port G
porta=0x00;portg.f0=0;portf.f1=0;portf.f2=0;
while(
1){
//condition de départ
if(MICON==& etape==0){
PRE=1;EVCON=1;LES=1;LAT=1;etape++;
}
}
}

LES ne s'allume pas :!!:
si j'inverse LES et LAT, c'est LAT qui ne s'allume pas :roll:

Programmer le fonctionnement par étapes
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#9 Message par satinas » dim. 6 juin 2021 21:25 lien vers la Data-Sheet : Cliquez ici

Je ne t'ai pas dit de modifier le début du programme, ça c'était bon.
porta=0x00;portb=0x00;portc=0x00;portd=0x00;porte=0x00;portf=0x00;portg=0x00;
à part que c'est plus lisible comme ça;
porta = portb = portc = portd = porte = portf = portg = 0x00;

Tu dis "le programme fonctionne" cela ne veut pas dire grand chose, mon programme permet d'allumer ou éteindre, et il doit marcher. Tu peux toujours essayer de me ramener au tien, mais je suis encore plus têtu que toi :)
Si BTN est appuyé (BTN = 1) la led est éteinte car il fait portf = 0
si BTN est relâché (BTN = 0), et si MICON est appuyé (MICON = 1), la led s'allume car il fait LAT = 1
Si cela ne marche pas pas la peine d'aller plus loin. Si cela marche, j'aurais la garantie que le simulateur fonctionne, et que tu as compris comment marchent les ports du pic.

Programmer le fonctionnement par étapes
EmnaBz
Membre
Membre
Messages : 12
Enregistré en : juin 2021

#10 Message par EmnaBz » lun. 7 juin 2021 11:20 lien vers la Data-Sheet : Cliquez ici

Bonjour
Oui en fait c'est votre programme que j'ai essayé ça se comporte comme je vous l'ai mentionné dans le message précédent, vous trouverez le résultat dans les deux images en jointure avec exactement le code suivant (le vôtre):

Code : Tout sélectionner

#define MICON portB.f3
#define MICON portB.f3
#define MIDET1 portB.f2
#define MIDET2 portB.f1
#define MIDET3 portB.f0
#define MIDET4 portB.f4
#define MIV1 portA.f1
#define MIV2 portA.f2
#define MIV3 portA.f3
#define MIV4 portA.f4
#define DET4 PORTC.f0
#define DET3 portC.f1
#define DET2 portC.f2
#define DET1 portC.f3
#define PRE portC.f4
#define EVCON portG.f4
#define EVDET1 portG.f3
#define EVDET2 portF.f7
#define EVLTD portF.f6
#define D1 portE.f4
#define D2 portE.f5
#define D3 portE.f6
#define D4 portE.f7
#define LES portF.f4
#define LAT portf.F5
#define BTN porta.f5
 unsigned etape=0;
void main() {
trisb.f0=1;trisb.f1=1;trisb.f2=1;trisb.f3=1;trisb.f4=1; //configuration des pins d'entrées du port B
trisc.f0=0;trisc.f1=0;trisc.f2=0;trisc.f3=0;trisc.f4=0; //configuration des pins de sortie du port C
trisA=0xFF; //configuration du port A comme entrée
trisE=0x00; //configuration du port E comme entrée
trisF=0x00; //configuration du port F comme sortie
trisg=0b11100001;  //configuration des pins du port G
porta = portb = portc = portd = porte = portf = portg = 0x00; //initialisation des ports

while (1) {
  if (BTN == 1) {
    portc = porte = portf = portg = 0;
  }
  else if (MICON == 1 & EVCON == 0) {
    PRE = 1; LAT = 1; EVCON = 1;
  }
}

Sinon c'était clair votre algorithme et votre clarification pour le fonctionnement des ports du pic, j'ai assimilé et c'est très logique d'ailleurs je vous remercie, mais le résultat n'est pas favorable..
Sinon je ne trouve toujours pas d'où vient le problème des deux LEDs LES et LAT qui ne s'allument pas simultanément dans mon programme
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage C »

Qui est en ligne

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