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.
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.
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 :
- Mode minuterie
- Mode minuterie fermée
- Mode compteur synchrone
- Mode compteur asynchrone
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 :
- Décidez quelle minuterie utiliser.
- Décidez si un temporisateur 16 bits est requis ou un temporisateur 32 bits est requis.
- Décidez du mode de fonctionnement de la minuterie.
- Réglez l’horloge pré-détartreur.
- 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.
À cette fin, le bit T32 dans le registre TxCON d’un temporisateur de type B doit être mis à 1.
3) Mode ou fonctionnement de la minuterie
Le mode de fonctionnement de la minuterie peut être sélectionné selon le tableau suivant.
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.
5) Initialiser l’interruption de la minuterie
Chaque temporisateur peut être programmé pour déclencher une interruption.
- Comparez la correspondance entre la valeur du registre de compteur de temporisateur (TMRx) et le registre de période (PRx).
- 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.
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]
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 ) { } }
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.