|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Étudiant Inscription : août 2012 Messages : 5 ![]() |
Bonjour,
Avant tout, desolee pour les accents manquants, je suis sur qwerty. J'espere que ca ne rendra pas la lecture trop penible. Mon projet est un chien de garde a implementer en assembleur. Le microcontroleur est un PIC12F508, horloge 4MHz (cycles de 1us). 1 seul timer (TMR0). Pas de registre dedie aux interruptions. Le seul projet que j'aie fait sur PIC utilisait un 18f que je programmais en C. J'ai donc quelques questions relatives au code en assembleur. J'utilise MPLAB v8.86. Voila l'idee: Un dispositif maitre envoie un creneau "classique" (rapport cyclique 1/2) de periode 1 min pour signaler qu'il est en bonne sante. Le chien de garde doit detecter un arret du creneau (qui peut rester a l'etat haut ou bas), generer sur la ligne d'alimentation une coupure d'environ 150 ms puis la remettre a 1 et attendre 5 min avant une nouvelle interrogation (pour laisser le temps au dispositif maitre de rebooter). (Pour info, mais ce n'est pas l'objet du post car ca ne pose pas de souci, un flag doit egalement etre mis a 1 avant de demarrer la procedure de coupure d'alim. Ce flag doit etre remis a zero durant les 5 min suite a un changement de bit sur un port d'entree mais une interrogation toutes les minutes est suffisante, cette partie ne me pose pas de difficulte). Pour le polling sur le creneau du dispositif maitre, j'ai pense a lire la valeur a un instant t, attendre 31 sec, lire a nouveau la valeur et faire un XOR (ou exclusif) entre les 2. Si le XOR vaut 1, tout va bien et je reboucle pour interroger a nouveau. Si le XOR vaut zero, cela signifie que le creneau est arrete, et dans ce cas je lance la procedure de reboot. J'utilise le zero flag du registre STATUS pour le test. 1) Mon code (je n'ai pas encore ecrit les tempos) compile. D'apres la methode evoquee ci-dessus, ya-t-il un risque de mauvais fonctionnement in situ? 2) De nombreuses tempos sont necessaires dans le programme, la plupart sont multiples d'1 sec, je compte donc ecrire une tempo 1 sec en utilisant le timer0 et faire des call dans le programme principal. Dois-je ecrire le sous programme "Tempo 1s" apres le END ? Sinon, comment proceder? 3) Si quelqu'un possede deja un code pour une tempo 1 sec avec des cycles de 1us, je suis preneuse Merci d'avance pour vos conseils (toute suggestion est la bienvenue) et eventuelles explications! |
|
|
00
|
|
|
#2 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 612 ![]() |
Hello,
Citation:
Ce qu'il faut, c'est faire une boucle qui lit l'entrée en permanence et qui n'en sort que lorsque l'entrée varie ou que la fin du laps de temps est atteinte. Citation:
|
||
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Étudiant Inscription : août 2012 Messages : 5 ![]() |
Merci pour ta reponse,
J'ai implemente les boucles et teste, elles fonctionnent. Je crois que vois ce que tu veux dire pour le polling. Je souhaite justement rester dans la boucle d'interrogation lorsque l'emetteur envoie un creneau de periode une minute, car c'est la situation normale. L'emetteur dans l'application finale est precis et envoie des 1 et 0 nets. J'ai reduit le temps d'interrogation a 30 sec. Penses-tu qu'il y aura tout de meme un probleme? Voila le bout de code correspondant: Code :
Le message qui apparait a la connexion du picKit est le suivant : Code :
"The target has invalid calibration data (6)"
|
||
|
|
00
|
|
|
#4 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 612 ![]() |
Pour le problème de calibration, il faudrait que je cherche un peu.
Pour les temporisations et le polling, ne te focalises pas sur « CALL TEMPO_500mS ». Essaie plutôt d'écrire ta propre routine de temporisation, à l'intérieur de laquelle tu surveilleras la ligne. Ça te permettra de scruter un changement tous les quatre ou cinq millisecondes pendant la durée de ton choix. Tout changement d'état à l'intérieur de ce laps de temps sera considéré comme de l'activité de la part de la machine surveillée et réinitialisera la boucle. Si, au contraire, tu atteins la fin de la boucle, c'est qu'il ne s'est rien passé durant ce laps et qu'il faut donc relancer la machine. Il est important de procéder ainsi car il faut absolument mesurer le temps écoulé depuis la dernière activité connue de ta machine. Si tu te contentes de faire des contrôles à heure fixe en te basant sur le principe que la machine surveillée change d'état à la même fréquence, alors tes deux systèmes vont commencer à se désynchroniser doucement avec le temps, spécialement si la machine surveillée connaît des retards occasionnels. Au bout d'un moment, les contrôles vont coïncider exactement avec les changements d'états, ce qui donnera un comportement indéterminé, et si la machine a un tout petit de retard, ce sera suffisant pour que tu lises deux fois la même valeur et que tu la fasses rebooter de manière injustifiée. |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Étudiant Inscription : août 2012 Messages : 5 ![]() |
Ok, merci, c'est beaucoup plus clair.
J'ai maintenant integre l'interrogation dans la boucle, et je reinitialise a chaque pulsation detectee. Pour la calibration, j'ai re verifie tous les parametres de config (reset vector, osc,...), j'ai bien mis la directive CODE 0x00, etc. Sans succes. Cela peut venir du circuit (j'utilise une demo board "artisanale", qui n'a pas de fonction "master clear" integree pour faire un reset avec les parametres factory) |
|
|
00
|
|
|
#6 | ||
|
Invité de passage
![]() Étudiant Inscription : août 2012 Messages : 5 ![]() |
J'ai change le PIC et je n'ai plus de probleme de calibration.
Compilation ok mais le programme ne fonctionne pas, par contre. Voila le code complet, au cas ou quelqu'un a le temps d'y jeter un oeil... Merci d'avance. KICK DOG = signal creneau en provenance de la machine, periode 1 min. Code :
|
||
|
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Étudiant Inscription : août 2012 Messages : 5 ![]() |
Re,
Aaah, ca y est, ca fonctionne ! Les principaux problemes que j'ai rencontres : - GP2=timer a la mise sous tension. Etrange configuration par defaut!! Il faut le savoir et reconfigurer ce port en entree/sortie, via le bit 5 du registre OPTION (qui ne figure pas dans le register file map de la datasheet, il fallait chercher dans le detail des registres speciaux). - oubli de return dans les subroutines et oubli de "goto start" avant. - operations 8 bits pour finalement tester un resultat sur un seul bit... Et donc confusion en raison des bits indetermines. Resolu avec un "et" entre le mot et un "1" bien place, voir MAIN_LOOP, delay4. Voila le code, on ne sait jamais, si ca peut aider quelqu'un un jour... Code :
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com