Tech. industrie

Comment utiliser les minuteries dans les microcontrôleurs dsPic

L’auteur a terminé son projet d’ingénierie de dernière année avec les microcontrôleurs dsPic, acquérant ainsi une connaissance approfondie de ces dispositifs.

Un module de minuterie est un périphérique important à l’intérieur d’un microcontrôleur dsPic et peut être utilisé dans une variété d’applications.

Ce didacticiel utilisera des exemples de code en langage C prêts, codés dans l’IDE MplabX et testés sur un microcontrôleur Microchip dsPic30f4011, pour vous guider tout au long du processus d’initialisation et de configuration des minuteries pour vos applications dsPic.

Un microcontrôleur dsPic30f4011 et son programmateur dans ma configuration expérimentale.

Un microcontrôleur dsPic30f4011 et son programmateur dans ma configuration expérimentale.

Introduction au module de minuterie dans les appareils dsPic30f et dsPic33f

Le module de minuterie des appareils de la série dsPic30f contient un total de cinq minuteries 16 bits, à savoir :

De même, un appareil de la série dspic33f contient jusqu’à neuf temporisateurs 16 bits, à savoir :

Chacun de ces temporisateurs est regroupé en trois types, Type A, Type B et Type C, en fonction de leurs caractéristiques particulières.

Résumé des caractéristiques spéciales des temporisateurs de type – A, B et C.
*En Type – B, la synchronisation est effectuée après la division par le pré-échelle et en Type – C, la synchronisation est effectuée avant la division par le pré-échelle.
**Pour un dspic30f les temporisateurs 2/4 peuvent être p

Type – AType – BType – C

Peut être utilisé à partir d’un oscillateur de 32 kHz à faible puissance.

Peut être concaténé avec une minuterie de type – C pour former une minuterie 32 bits. **

Peut être concaténé avec le temporisateur de type – B pour former un temporisateur 32 bits.**

Peut fonctionner en mode asynchrone avec une source externe.

A la capacité de déclencher la conversion A/D.

La source d’horloge externe peut être synchronisée avec l’horloge interne

La source d’horloge externe est toujours synchronisée avec l’horloge interne.*

La source d’horloge externe est toujours synchronisée avec l’horloge interne.*

A lire aussi :  Navires massifs - InformatiKKa

Modes de fonctionnement de la minuterie dans les appareils dsPic30f et dsPic33f

En plus d’être regroupés en Type A, B ou C, chaque minuterie peut fonctionner dans quatre modes différents :

  1. Mode minuterie
  2. Mode minuterie fermée
  3. Mode compteur synchrone
  4. Mode compteur asynchrone

Résumé des modes de fonctionnement de la minuterie.

Mode minuterieMode minuterie ferméeMode compteur synchroneMode compteur asynchrone

Incréments de un à chaque front montant de l’horloge d’entrée

Incrémente de un à chaque front montant de l’horloge d’entrée tant que le signal de porte externe à la broche TxCK est haut

Incréments de un à chaque front montant de l’horloge d’entrée

Incréments de un à chaque front montant de l’horloge d’entrée

L’horloge interne est utilisée

L’horloge interne est utilisée

L’horloge externe est utilisée sur la broche TxCK

L’horloge externe est utilisée sur la broche TxCK

_

_

L’horloge de l’appareil externe et interne est synchronisée

L’horloge de l’appareil externe et interne n’est pas synchronisée

L’interruption est générée sur le match de période

L’interruption est générée sur le front descendant de la broche TxCK

L’interruption est générée sur le match de période

L’interruption est générée sur le match de période

Exemple de code pour initialiser une minuterie pour dsPic30f et dsPic33f

void init_Timer( void )
{
    T1CONbits.TON = 1;    //Activate the timer module
    T1CONbits.TCKPS = 0;  //Select input clock prescaler as 1:1
    
    T1CONbits.TGATE = 0;  //Disable Gate Time Accumulation Mode
    T1CONbits.TCS = 0;    //Select internal clock as the timer clock source
    T1CONbits.TSYNC = 0;  //External clock source is left unsynchronized
    
    PR1 = 0xFFFF;
}

Procédure générale pour initialiser une minuterie dans les microcontrôleurs dsPic30f et dsPic33f

La procédure générale suivante peut être suivie lors de l’initialisation d’un temporisateur pour n’importe quelle application :

  1. Décidez quelle minuterie utiliser.
  2. Décidez si un temporisateur 16 bits est requis ou un temporisateur 32 bits est requis.
  3. Décidez du mode de fonctionnement de la minuterie.
  4. Réglez l’horloge pré-détartreur.
  5. Décidez si une interruption de minuterie ou tout autre déclencheur d’événement spécial est requis.

1) Quelle minuterie utiliser

Chacun des temporisateurs peut être activé par le bit TON dans le registre TxCON, où ‘x’ est le nombre de temporisateurs qui doivent être activés.

Faites défiler pour continuer

Dans notre exemple de code, nous avons activé le temporisateur 1 en définissant le bit TON du registre T1CON sur 1.

2) Minuterie 16 bits ou minuterie 32 bits ?

Les temporisateurs de type B et de type C peuvent être combinés pour fonctionner comme un seul temporisateur 32 bits. Lorsqu’elles sont combinées, la configuration de la minuterie de type B prévaudra sur la minuterie de type C.

  • Dans un appareil dsPic30f, les temporisateurs 2 et 3 peuvent être concaténés dans un temporisateur 32 bits.
  • Les appareils dsPic33f ont plus d’une paire de temporisateurs 32 bits où les temporisateurs 2/3, 4/5, 6/7 et 8/9 peuvent également former des paires de temporisateurs 32 bits.
A lire aussi :  Minage urbain : qu'est-ce que c'est ?

À cette fin, le bit T32 dans le registre TxCON d’un temporisateur de type B doit être mis à 1.

*x doit être une minuterie de type B uniquement.

TxCON.T32*Configuration du temporisateur

1

Concaténé avec son autre paire de temporisateurs.

0

Fonctionnera comme une minuterie 16 bits indépendante.

3) Mode ou fonctionnement de la minuterie

Le mode de fonctionnement de la minuterie peut être sélectionné selon le tableau suivant.

Sélection du mode ou du fonctionnement de la minuterie.
* Le bit TSYNC est disponible uniquement dans une minuterie de type A, les types B/C sont synchronisés par défaut.

Nom du bitBit ValueMode Selected

TxCON.TCS

0

Mode minuterie

TxCON.TGATE, TxCON.TCS

dix

Mode minuterie fermée

TxCON.TCS, TxCON.TSYNC*

1, 1

Mode compteur synchrone

TxCON.TSYNC

0

Mode compteur asynchrone

4) Prescaler d’horloge

Un pré-échelonneur d’horloge peut être utilisé pour augmenter ou diminuer la fréquence à laquelle la source d’horloge incrémente la valeur de base de temps.

Il peut être sélectionné à l’aide du tableau suivant.

*x est le nombre de temporisateurs.

TxCON.TCKPS*Valeur du prédiviseur

3

1 : 256

2

1 : 64

1

1 : 8

0

1 : 1

5) Initialiser l’interruption de la minuterie

Chaque temporisateur peut être programmé pour déclencher une interruption.

  1. Comparez la correspondance entre la valeur du registre de compteur de temporisateur (TMRx) et le registre de période (PRx).
  2. Détection d’un front descendant en mode Gated Time Accumulation.

Cette interruption peut être initialisée dans les microcontrôleurs dsPic à l’aide des registres et bits suivants.

Résumé des bits utilisés pour initialiser l’interruption du temporisateur.

Bit NameRegister et Bit IdentificationValue

Bit de contrôle d’activation d’interruption

CEI0/1.TxIE

1 = Activer 0 = Désactiver

Bit d’état du drapeau d’interruption

IFS0/1.TxIF

Ce bit doit être réinitialisé dans le logiciel après chaque déclenchement d’interruption

Bit de contrôle de priorité d’interruption

IPC0/1/5.TxIP

6 – 0 selon la priorité

Cet exemple de code peut être utilisé pour initialiser une routine de service d’interruption pour la minuterie 1. (Choisissez la fonction d’initialisation de la minuterie ci-dessus et appelez les fonctions dans main() selon le cas.)

Pour une procédure détaillée sur les interruptions, suivez

Exemple de code pour initialiser l’interruption dans les contrôleurs dsPic30f et dsPic33f

void Interrupt_Init( void )
{
    IEC0bits.T1IE = 1;
    IPC0bits.T1IP = 6;
}
 
void __attribute__((interrupt, auto_psv)) _T1Interrupt( void )               
{
    //Your code here
    IFS0bits.T1IF = 0;
}

Exemple de code complet pour initialiser et tester une minuterie et une interruption de minuterie pour dsPic30f et dsPic33f

[Tested by author on: 22/09/2018]

A lire aussi :  Les différents types de fil de cuivre et leurs utilisations

Le code suivant peut être utilisé pour initialiser et tester la minuterie 1 dans le « mode minuterie » de fonctionnement. Il est fait en incorporant les deux extraits de code donnés ci-dessus.

Ce code générera une interruption chaque fois qu’une correspondance de comparaison se produit entre la valeur du registre PR1 et les registres TMR1.

  • L’interruption a été programmée pour faire clignoter une led pendant 10 millisecondes.
  • Valeur du registre PR1 : 0x8FF4 a été défini de sorte qu’une correspondance de comparaison se produise toutes les 20 millisecondes.

Ainsi, la led doit être allumée pendant 10 millisecondes (tant que le compteur de programme reste en fonction d’interruption) et éteinte pendant 10 millisecondes supplémentaires lorsque le compteur de programme quitte l’interruption. Le temps d’arrêt est contrôlé par la minuterie 1.

#define FCY 1842500
 
#include 
#include 
#include 
#include 
 
_FOSC(CSW_FSCM_OFF & FRC);  // Fosc = 7.37 MHz, internal fast RC oscillator

void init_Timer( void )
{
    T1CONbits.TON = 1;    //Activate the timer module
    T1CONbits.TCKPS = 0;  //Select input clock prescaler as 1:1
    
    T1CONbits.TGATE = 0;  //Disable Gate Time Accumulation Mode
    T1CONbits.TCS = 0;    //Select internal clock as the timer clock source
    T1CONbits.TSYNC = 0;  //External clock source is left unsynchronized
    
    PR1 = 0x8FF4;
}

void Interrupt_Init( void )
{
    IEC0bits.T1IE = 1;
    IPC0bits.T1IP = 6;
}
 
void __attribute__((interrupt, auto_psv)) _T1Interrupt( void )               
{
    _LATD0 = 1;
    __delay_ms(10);
    _LATD0 = 0;
    IFS0bits.T1IF = 0;
}
      
void main( void ) 
{
    init_Timer();
    Interrupt_Init();
    
    while( 1 )
    {     
    } 
}
Trace de l'analyseur logique montrant que l'interruption est déclenchée toutes les 20 ms et impulsions de 10 ms par la fonction d'interruption sur RD0.

Trace de l’analyseur logique montrant que l’interruption est déclenchée toutes les 20 ms et impulsions de 10 ms par la fonction d’interruption sur RD0.

Cet article est exact et fidèle au meilleur de la connaissance de l’auteur. Le contenu est uniquement à des fins d’information ou de divertissement et ne remplace pas un conseil personnel ou un conseil professionnel en matière commerciale, financière, juridique ou technique.

© 2018 StormsHalted

StormsHalted (auteur) de Pullman, Washington, États-Unis le 26 janvier 2019 :

J’ai intentionnellement omis ce morceau par souci de simplicité dans l’article principal. Voici comment procéder :

La fréquence de l’oscillateur de mon côté est configurée à 7,37 MHz et Fcy est défini comme 4/7,37 MHz = 1842500.

Cela signifie que la minuterie incrémentera de 1 toutes les 1/1842500 = 0,5427 microsecondes. (lorsqu’il reçoit le déclenchement de la source d’horloge interne.)

Pour compter jusqu’à 20 millisecondes, la minuterie doit compter 20 000 us / 0,5427 us = 36 852 incréments.

36.852 est égal à 0x8FF4 en hexadécimal.

Assurez-vous de suivre la conversion des millisecondes en microsecondes.

Ali Fares le 24 janvier 2019 :

Pouvez-vous m’expliquer comment avez-vous trouvé PR1 = 0X8FF4 ?

Merci.

Bouton retour en haut de la page