PIC //=> impulsions [Résolu]

Signaler
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
-
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
-
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.

merci.
A voir également:

5 réponses

Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

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 ;) )

Gentoo... que du bonheur ...
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
2
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.

merci.
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
2
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".

merci.
Messages postés
5360
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
25 janvier 2021
106
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
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
2
merci.
j'ai finalement compris! :p

merci.