PIC //=> impulsions

Résolu
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 16 juin 2007 à 19:20
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Derniè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.

merci.

5 réponses

_dune2_ Messages postés 141 Date d'inscription mercredi 19 juillet 2006 Statut Membre Dernière intervention 20 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 ;) )

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

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

merci.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
19 juin 2007 à 15:55
merci.
j'ai finalement compris! :p

merci.
0
Rejoignez-nous