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 ---
- 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 ---
Modérateur : mazertoc
18f26k22 et les interruptions TMR0 et TMR1
-
francois77
Passioné- Messages : 307
- Enregistré en : avril 2022
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
A+
Francois
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
A+
Francois
18f26k22 et les interruptions TMR0 et TMR1
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.
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é- Messages : 307
- Enregistré en : avril 2022
18f26k22 et les interruptions TMR0 et TMR1
Bonjour francois77, satinas, et tout le forum,
En premier lieu pour un comptage sur RC0 avec front montant, initiation
Utilisation
Comptage de temps avec le timer3 (compteur 16 bits), initiation
Utilisation
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é
A+
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é
A+
18f26k22 et les interruptions TMR0 et TMR1
-
francois77
Passioné- Messages : 307
- Enregistré en : avril 2022
18f26k22 et les interruptions TMR0 et TMR1
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.
Après on parlera interruption
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
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+
((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.
18f26k22 et les interruptions TMR0 et TMR1
-
francois77
Passioné- Messages : 307
- Enregistré en : avril 2022
Bonjour,
les interruptions c'est comme les écrans, il faut le premier pixel
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
a+
Francois
les interruptions c'est comme les écrans, il faut le premier pixel
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
a+
Francois
18f26k22 et les interruptions TMR0 et TMR1
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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.
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.
18f26k22 et les interruptions TMR0 et TMR1
Bonjour francois77, paulfjujo, et tout le forum,
paulfjujo à bien détaillé ce que j'aurais du expliqué
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)
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é....
C'est le cerveau qui dit au jambe de fonctionner, donc il travaille aussi
A+
paulfjujo à bien détaillé ce que j'aurais du expliqué
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)
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
C'est le cerveau qui dit au jambe de fonctionner, donc il travaille aussi
A+
Modifié en dernier par Temps-x le dim. 12 mars 2023 11:14, modifié 1 fois.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 19 invités