Réponse acceptée !
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 ...