Bonjour à tous !
Je viens à vous car me voilà dans une situation bien embarrassante. Nous avons décidé cette année de traiter le sujet du passage à niveau automatisé (TPE). Nous avons réussi à faire fonctionner toute la partie électronique, le circuit imprimé fonctionne à merveille, mais un problème subsiste
Nous avons donc du utiliser un microcontroleur PIC16F628, nous l'avons correctement programmé, aucune erreur n'a été recensée lors de la compilation, et de plus, chose tout à fait surprenante, notre programme fonctionne parfaitement sur la plaque de test fournie au préalable par notre professeur.
Cependant, lorsque que l'on insère le pic sur notre propre circuit imprimé, le comportement de notre système est très douteux...
A l'origine, lors de la détection du train par le premier capteur, la barrière doit descendre et la signalisation sonore et visuelle doit se mettre en route. Un fin de course (microrupteur) indique alors au pic que la barrière est arrivée à la position désirée et coupe le moteur. Enfin, lorsque le train est détecté par le second capteur, celui-ci donne l'ordre à la barrière de remonter, jusqu'à la verticale (indiqué par le second fin de course).
Malheureusement, il y a beaucoup de problèmes et le comportement de la barrière est vraiment innatendu. La barrière monte, puis se remet à descendre en cours de route, etc..., et nous pensons que cela ne peut que provenir de la programmation.
Voici le code source de notre programme, auriez-vous une idée pour savoir d'où provient le problème?
Nous pensons que l'erreur provient de la boucle infinie de la fonction motorisationBarrière car nous avons l'impression qu'elle ne s'éxecute qu'une seule fois, et non pas indéfiniment.Code:'début du programme' program tpe 'déclaration des entrées' symbol ILS1 = PortA.3 symbol ILS2 = PortA.0 symbol microRupteur1 = PortA.2 symbol microRupteur2 = PortA.1 'déclaration des sorties' symbol buzzerEtLed = PortB.7 symbol sensDuMoteurPN = PortB.4 symbol fonctionnementDuMoteur = PortB.1 'variable booléenne pour savoir si un train est passé' dim detectionDuTrain as byte 'variable qui sert dans la boucle de la signalisation du train' dim booleenPourBuzzerEtLed as byte 'variable qui sert dans la boucle for pour les delay_ms du buzzer et de la led' dim i as byte 'fonction qui traite la motorisation de la barrière lors du passage d'un train' sub procedure motorisationBarriere 'motorisation de la barrière' while true fonctionnementDuMoteur = 1 i = 0 buzzerEtLed = 1 if(microRupteur1 = 1) or (microRupteur2 = 1) then goto sortieDeBoucle end if wend 'étiquette qui permet la sortie de la boucle grâce au goto (qui est plus haut dans le for)' sortieDeBoucle: 'desactivation du moteur' fonctionnementDuMoteur = 0 buzzerEtLed = 0 end sub 'fonction principale du programme' main: 'sert a l'initialisation du PIC CMCON = 07 OPTION_REG = $80 'definition du port A en entrée et du port B en sortie' trisa = $FF trisb = 0 'initialisation de tout le port A et B a 0' porta = 0 portb = 0 'initialisation des variables a 0' detectionDuTrain = 0 booleenPourBuzzerEtLed = 0 i = 0 'boucle principale du programme (elle boucle a l'infinie)' while true 'recherche si un train est detecté' if(ILS1 = 1) or (ILS2 = 1) and (detectionDuTrain = 0) then detectionDuTrain = 1 sensDuMoteurPN = 1 'si on a detecté un train on actionne la barriere grâce a l'appel de la fonction "motorisationBarriere"' motorisationBarriere 'permet la desactivation du buzzer et de la led que quand le train est soit deja passé ou soit quand il n'est pas encore passé' if(booleenPourBuzzerEtLed = 0) then booleenPourBuzzerEtLed = 1 buzzerEtLed = 1 else if(booleenPourBuzzerEtLed = 1) then booleenPourBuzzerEtLed = 0 buzzerEtLed = 0 end if end if else if(ILS1 = 1) or (ILS2 = 1) and (detectionDuTrain = 1) then detectionDuTrain = 0 sensDuMoteurPN = 0 'si on a detecté un train on actionne la barriere grâce a l'appel de la fonction "motorisationBarriere"' motorisationBarriere 'permet la desactivation du buzzer et de la led que quand le train est soit deja passé ou soit quand il n'est pas encore passé' if(booleenPourBuzzerEtLed = 0) then booleenPourBuzzerEtLed = 1 buzzerEtLed = 1 else if(booleenPourBuzzerEtLed = 1) then booleenPourBuzzerEtLed = 0 buzzerEtLed = 0 end if end if end if end if wend end. 'fin du programme'
J'espère que vous allez pouvoir nous aider
Je vous remercie d'avance,
Viko54
-----