Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

18f26k22 et les interruptions TMR0 et TMR1
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#1 Message par francois77 » ven. 10 mars 2023 11:51

Bonjour à tous

Je galère sur les interruptions du 18f26k22

Je cherche à faire fonctionner le TIMER0 sur un comptage d’environ 10 ms

Je cherche en parallèle à faire du comptage sur TMR1 sur un front montant et récupérer les valeurs lorsque TMR0 est finie

De l’aide serait le bienvenu car je plane oops

A+
Francois

18f26k22 et les interruptions TMR0 et TMR1
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » ven. 10 mars 2023 13:46

Bonjour François,
Le cours de Bigonoff sur les 16F87X présente en détail tout cela. Le contenu des registres de configuration des timers/compteurs 0 et 1 a un peu changé mais le principe reste le même.
Tu peux commencer par surveiller le bit TMR0IF, quand il passe à 1 lire le comptage, et remettre à zéro ce bit. Ensuite faire la même chose avec une routine d'interruption.

18f26k22 et les interruptions TMR0 et TMR1
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#3 Message par francois77 » ven. 10 mars 2023 14:15

Bonjour Satinas,

j'ai pourtant pris les cours de bigonnoff, mais je rame.

Je regarderais ce soir, place à l'électronique a lampe, si je ne m'envole pas :langue:

A+

18f26k22 et les interruptions TMR0 et TMR1
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » ven. 10 mars 2023 15:01

Bonjour francois77, satinas, et tout le forum,

En premier lieu pour un comptage sur RC0 avec front montant, initiation

Code : Tout sélectionner

;******************************* configuration du registre T1CON *******************************
    
      movlw B
'10000100'                   ; mode asynchrone, division par 0
      movwf T1CON                         
; comptage sur l'entrée RC0



Utilisation

Code : Tout sélectionner


      clrf TMR1H                          
; initialiser le compteur d'impulsion high et low
      clrf TMR1L                          ; 

      bsf T1CON,TMR1ON                    ; lancer le timer1 pour comptage sur RC0   

at_freq
      btfss TMR1L,0                       ; 1 impulsion pour déclenchement de la mesure 
      bra at_freq    
                                          ; <== comptage d'
impulsion
                                          
      bcf T1CON
,TMR1ON                    ; arrêt du timer1  

      movff TMR1H
,Nombre_impulsion_high   ; récupère le nombre d'impulsion high et low
      movff TMR1L,Nombre_impulsion_low    ; 
      


Comptage de temps avec le timer3 (compteur 16 bits), initiation

Code : Tout sélectionner

;******************************* configuration du registre T3CON *******************************
    
      movlw B
'00000000'                   ; B7 = 0, B6 = 0,  temps compté avec les instructions (fosc/4)
      movwf T3CON                         ; B7 = 0, B6 = 1,  temps compter avec l'horloge du microcontrôleur (fosc)



Utilisation

Code : Tout sélectionner


      clrf TMR3H                          
; initialiser le compteur de temps
      clrf TMR3L                          
; 

 
      bsf T3CON
,TMR3ON                    ; lancer le timer3 pour comptage du temps

                                          
; <== comptage de temps

      bcf T3CON
,TMR3ON                    ; arrêt du timer3  

      movff TMR3H
,temps_high              ; récupère le temps high et low
      movff TMR3L
,temps_low               ;
      


Pour le comptage de temps de 10 ms il faudra activer les diviseurs voir page 166 du datasheet du Pic18F26K22

J 'ai mi rapidement c'est quelque ligne, car je suis pressé :-D


==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

18f26k22 et les interruptions TMR0 et TMR1
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#5 Message par francois77 » sam. 11 mars 2023 16:13

Bonjour,

Ca me prend trop la tête les interruptions !

Si vous avez des exemples simples, je prends

A+
Francois

18f26k22 et les interruptions TMR0 et TMR1
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#6 Message par satinas » sam. 11 mars 2023 16:32

Bonjour,
Si tu veux comprendre progressivement, d'abord fais clignoter une led à la seconde en utilisant le timer0 et sans interruption. A chaque overflow du timer0 TMR0IF passe à 1, on incrémente un compteur cpt, arrivé à 100 la led clignote.

Code : Tout sélectionner

configurer timer0 pour overflow toutes les 10ms
cpt = 0
démarrer timer0
bcl:
  on attend avec btfss que TMR0IF passe à 1
  TMR0IF = 0
  incrémentation cpt
  si cpt = 100 -> inverser état led et cpt = 0
  retour à bcl

Après on parlera interruption

18f26k22 et les interruptions TMR0 et TMR1
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#7 Message par Temps-x » sam. 11 mars 2023 17:24

Bonsoir,

((25535* 62.5ns)x1000) = (2500µs *4) = 10000 (10ms),

movlw 0xBF
movwf TMR0L ; initialiser le compteur de temps low

movlw 0x63
movwf TMR0H ; initialiser le compteur de temps high

Faut mettre le prédiviseur à 4 ce qui nous fait pour l'initiation de T0CON = B'00000001', puis on configure INTCON = B'00100000' pour avoir une interruption sur débordement du timer0, avec une priorité de bas niveau ( ORG H'18' ) du registre INTCON2 = B'00000000"

Puis on active les interruptions avec le registre INTCON

bsf INTCON,GIE

Si tu veux un exemple simple, il faut que je puisse savoir exactement ce que tu veux faire....

Ce que j'ai compris, tu veux faire un temps de 10 ms avec le timer0, puis tu veux compter un nombre d'impulsion sur TMR1 sur un front montant

La seule patte prévu pour le comptage d'impulsion c'est RC0 pour le timer1

==> A+
Modifié en dernier par Temps-x le dim. 12 mars 2023 10:12, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

18f26k22 et les interruptions TMR0 et TMR1
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#8 Message par francois77 » dim. 12 mars 2023 07:50

Bonjour,

les interruptions c'est comme les écrans, il faut le premier pixel :langue:

Point d'avancement :

Pour le Timer 0 c'est presque bon , mon programme tourne et j'ai capté les subtilités du 18f

Il me reste a comprendre l'équation de calcul

((25535* 62.5ns)x1000) = (2500µs *4) = 10000 (10ms)

j'arrive a faire tourner mes interruptions a 996ms , mais je dois comprendre ce calcul

Retour cet après midi, si le temps reste en l'état. je vais faire tourner mes jambes au lieu de mon cerveau :sifflotte:

a+
Francois

18f26k22 et les interruptions TMR0 et TMR1
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » dim. 12 mars 2023 09:17

bonjour Francois

il manque ce petit detail :
ne pas oublier que les timer16 bits , armement du flag au debordement > 65535
le nombre de counts est donc le complement de la valeur TMRH-L


init Timer1 TMRH-TMRL à 0x63BF soit 25535
comptage : 65535-25535= 40 000 counts
prediviseur timer1 = 4 => cycle de 62,5 x4 =250 nS => 0,25µS
=> 40 000 counts * 0.25µS => 10 000 µS => 10mS

pour les timer 8 bits TMR2-4-6
c'est bien la valeur de PR2+1 qui determine le nombre de counts.
Aide toi, le ciel ou FantasPic t'aidera

18f26k22 et les interruptions TMR0 et TMR1
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#10 Message par Temps-x » dim. 12 mars 2023 10:54

Bonjour francois77, paulfjujo, et tout le forum,

:+1: paulfjujo à bien détaillé ce que j'aurais du expliqué :oops:

Voici toutes les subtilités de ce calcul

Notre microcontrôleur tourne à 64 Mhz, ce qui fait qu’une instruction dure 4/64Mhz = 0,0625 µs converti en nanoseconde 0,0625 µs*1000 = 62.5 ns

Notre timer0 peut être configuré en compteur 8 bits ou 16 bits pour notre cas, on le configure pour un compteur 16 bits, ce qui veut dire que ce compteur peut compter jusqu'à 65535 (0xFFFF) (1111111111111111) :-D

Comme on sait que se compteur et configurer pour compter chaque instruction (62.5 ns) il reste plus cas faire le calcul.

Bon faut pas tombé dans le pièce, quand on initialise le timer0 à 25535 c'est qu'il reste 65535 - 25535 = 40000 instructions qui je vous le rappelle tourne à 62.5 ns, ce qui fait un temps total avant interruption 40000 x 62.5 ns = 2500000 ns

Après, il suffit de mettre un diviseur par 4, et le tour de passe passe et joué....

francois77 a écrit :Source du message je vais faire tourner mes jambes au lieu de mon cerveau :sifflotte:


C'est le cerveau qui dit au jambe de fonctionner, donc il travaille aussi :langue:

==> A+
Modifié en dernier par Temps-x le dim. 12 mars 2023 11:14, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 40 invités