didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 2017
-
16 juin 2007 à 19:20
didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 2017
-
19 juin 2007 à 15:55
Bonjour à tous.
je suis en train de faire quelques testes avec les PICs (notemment le PIC16F628). j'ai cherché sur internet sans rien trouver de simple et claire. l'objet de ma recherche était "comment envoyer une impulsion de tant de ms sur tel broche de mon pic".
j'espère que vous pourez m'aider.
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 avril 2011 17 juin 2007 à 13:21
Salut,
Les pics sont des microcontrôleurs trés précis en terme de timing, car c'est un processeur RISC avec une architecture de Harvard. Cette particularité fait qu'à chaque cycle d'horloge, le PIC execute 1 instruction (pas d'instruction à taille variable et pas de cache). Cet avantage peut-être utilisé pour faire une boucle comme temps de pause avec une précision égale à la fréquence du PIC.
Généralement, sur un PIC on utilise 2 boucles imbriquées ; la boucle interieure compte en micro-seconde par exemple, puis la boucle exterieure le paramètre qui dit combien de micro-secondes on souhaite.
delais_n_us:
movf n_us,W ; charge la variable n_us dans W
movwf cptr1 ; W -> cptr1
d1 movlw 200 ; charge cptr_us avec le nombre de boucle pour faire
movwf cptr_us ; 1us (à calibrer ...)
d2 decfsz cptr_us ; décrémente cptr_us
goto d2 ; retourne à d2 si cptr_us est non null
decfsz cptr1 ; décrémente le nombre de us à attendre
goto d1 ; retourne à d1 si il reste des us à attendre
retlw 00
Il te reste à calibrer "cptr_us" pour qu'il corresponde de manière le plus proche possible de 1us. Pour réaliser cela, tu mets 100 à n_us, et tu appelles 100000 fois cette fonction de manière à simuler une pause de 10s que tu peux chronometrer ... à partir de là, tu ne touches QUE la valeur de la boucle interieur à calibrer (celle qui est à 200 en guise d'exemple) pour t'approcher au mieux des 10s ...
Une fois cette calibration de faite, tu as une fonction de pause précise ;)
Souviens-toi que tu peux affiner le "timing" en rajoutant des instructions NOP juste avant la boucle (avant le label "d2") par-exemple, ou dans la boucle ( entre le label "d2" et "decfsz" ).
(TOUTES les instructions prennent le même temps, y compris les NOP ;) )
didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 20172 17 juin 2007 à 11:15
Bonjour.
je viens de me rendre compte (un peu tard) qu'il n'y avait pas de fonctions prédéfinies pour envoyer une impulsion. j'ai donc pensé à faire ca:
movlw ;on enregistre la valeur que l'on va envoyer
movwf ;on envoi la valeur
call pause_X ;on fait une pause de X ms (miliseconde)
A présent, ma question devient "comment controler le temps de pause ?". En fait ici, je désirerais controler des servos-moteur; donc les impulsions ne seront jamais les mêmes en fonction de la position du bras du servo-moteur.
didoux95
Messages postés845Date d'inscriptionmardi 25 avril 2006StatutMembreDernière intervention 1 août 20172 17 juin 2007 à 15:51
Bonjour.
Faut-il adapter le code à la fréquence de travaille du PIC (pour moi, c'est quatre Méga Hertz) ? car en fonction de cette fréquence, j'ai cru comprendre que le temps mit pour exécuter une instruction est plus ou moins long (nan ?!). De plus, il me semble que certaine instructions comme les goto (...) prennent deux cycles d'horloge (cela veut-il dire qu'elles mettent deux fois plus de temps ?). Donc je dois t'avouer que j'ai un peut du mal suivre; je comprend la méthode que tu me propose mais je vois pas bien comment calibrer la variable cptr_us et "affiner le timing".
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 18 juin 2007 à 11:31
Salut,
heuuuuu didoux95, _dune2_ est assez explicite dans son poste.... de plus il détail très bien ta problématique et répond même à ta nouvelle question....
sinon oui le cycle d'horloge est proportionnel à la fréquence du micro contrôleur (cf datasheet du PIC16F628 ICI)
enfin bon je dis ça mais je dis rien moi.
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
OoWORAoO
Vous n’avez pas trouvé la réponse que vous recherchez ?