'JP Duval le 05/10/2004 ' interruption timer0 et counter0 sur le M8 'Timer0 est un des 3 timer du M8, c'est un timer sur 8 bits 'utilisable en Timer pour déclencher un événement aprés x périodes 'ou utilisable en compteur d'événements Counter 'on va utiliser l'assembleur sans le savoir Tcnt0, Ovf0... 'avec le timer0 il n'y a jamais appel aux broches. 'mais on se sert de la broche portD.4 pour le compteur "T0" ' ______ push-button or relay ' portd.4-o---------^ ^--------gnd ' | ' vcc------|^^^^-------------------gnd pull-up 10K '------[les variables]------------------------------- Dim J As Word , K As Word ' -------[ config ]----------------------------------- ' les config doivent être écrites sans retour à la ligne. Config Lcdmode = Port ' config 4 bit Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 Config Lcd = 16 * 2 ' -------[1° exemple Timer sur Subroutine]-------------------------------------- 'mettre en REM pour le 2 et 3° exemple Config Timer0 = Timer , Prescale = 1024 'le diviseur est au maxi 1,8,64,256 Stop Timer0 'on bloque le timer car il démarre immédiatement . Cls J = 0 Do Start Timer0 'démarrage du timer Locate 1 , 1 : Lcd " timer0:" ; Tcnt0 'nombre de rotation If Tifr.1 = 0 Then 'flag de l'overflow Gosub Suite End If Loop End 'end program Suite: Stop Timer0 J = J + 1 Set Tifr.1 'remise à 0 de l'overflow Locate 2 , 1 : Lcd "overflow:" ; J Waitms 100 Return ' -------[2° exemple Timer sur interruption]-------------------------------------- 'mettre en REM pour le 1° et 3° exemple '( Cls Config Timer0 = Timer , Prescale = 1024 'le diviseur est au maxi 1,8,64,256 Enable Interrupts 'autorise les interruptions J = 0 Do Enable Timer0 'autorise timer0 J = J + 1 Locate 1 , 1 : Lcd "timer0 inter." ; J 'nombre de rotation Waitms 100 On Timer0 Suite1 ' ou : on ovf0 suite Loop End 'end program Suite1: Disable Timer0 'sinon le prog est bloqué, on ne peut rien faire dans le gosub K = K + 1 Locate 2 , 1 : Lcd "overflow:" ; K Waitms 100 Return ') ' -------[troisième exemple compteur]-------------------------------------- 'mettre en REM pour le 1° et 2° exemple '( Cls Config Timer0 = Counter , Edge = Rising Tcnt0 = 0 Do Enable Counter0 'autorise timer0 Enable Interrupts Locate 1 , 1 : Lcd "register:" ; Tcnt0 'nombre de rotation If Tcnt0 <> 0 Then Gosub Suite2 ' ou : on ovf0 suite Loop End 'end program Suite2: Disable Counter0 'sinon le prog est bloqué, on ne peut rien faire dans le gosub K = K + 1 Locate 2 , 1 : Lcd "counter:" ; K Tcnt0 = 0 'pour la condition TCNT0<>0 Waitms 100 Return '-------[ remarque sur le timer0]------------------------ 'le comptage est trés sensible aux parasites, penser à filtrer et à mettre des 'temps d'attente 'je n'ai pas essayé l'option clear timer décrite dans l'aide, 'mes test ont été concluants sans cela. ')