je me lance dans l'etude des fonctions spécifiques de ce MCU 18F27K42
un lien utile
l' avantage d'un compteur Hardware 24 bits , est la grande dynamique de mesure.
Le 1er test, le plus simple est l'usage en timer
le compteur peut recevoir FOSC ou FOSC/4 en entrée
un bit Marche / Arret .. et ça suffit pour faire des chronometrages au cycle pret
tests avec FOSC Interne de 16MHzx PLL ..soit 64MHz
j'utilise un pointeur byte pour ranger la mesure 24 bits ( en 3 registres 8 bits) dans un entier long non signé de 32 bits.
Code : Tout sélectionner
unsigned long SMT1_Measure;
unsigned char *ST; // pointeur sur unsigned char (ou Byte)
ST=&SMT1_Measure; // pointeur Byte sur debut entier long 32 bits
SMT1_Measure=0; // la valeur resultat de mesure
Timer0 est initialisé pour definir une duree de 1 sec ..
traitement via interruption TMR0IF et TMR0IE, pour armer un flag
Avec FOSC=64MHz , la resolution de comptage est de 62,5nSec !
programme de test :
init module SMT1
Code : Tout sélectionner
//USAGE du compteur SMT1 18F27K42
// registre SMT1CON0
SMT1CON0.WPOL=0; // Window Polarity
SMT1CON0.SPOL=0; // Signal Polarity
SMT1CON0.CPOL=0; // Clock Polarity
SMT1CON0.SMT1PS1=0; // PS<1:0>: SMT Prescale Select bits = 1/1
SMT1CON0.SMT1PS0=0; // 11=1/8 10=1/4 01=1/2 00=1/1
SMT1CON0.SMT1EN =1; // SMT enabled
SMT1CON0.SMT1STP=0; // 0 =reset 1=STOP;
SMT1CON1.SMT1GO=0; // 1= suit l'entrée 0=stop suivi
SMT1CON1.SMT1REPEAT=0; // 0= Single Acquisition 1=repeat mode
// REGISTER 25-4: SMT1CLK: SMT CLOCK SELECTION REGISTER 16MHz
// 000=FOSC/4 001=FOSC 010=HINTOSC 16MHz
SMT1CLK.CSEL2= 0;
SMT1CLK.CSEL1= 1;
SMT1CLK.CSEL0= 0;
// 25.7.1 PW (Pulse Width) AND PR (Periode Read) ACQUISITIONI NTERRUPTS
PIR1.SMT1PRAIF=0;
PIE1.SMT1PRAIE=0;
// 25.7.2 PERIOD MATCHI NTERRUPT
PIR1.SMT1IF=0;
PIE1.SMT1IE=0;
// MODE de fonctionnement TIMER
// modes page 396 Windowed measure
// 0000=Timer 0100=windowed measure 1000=counter
SMT1CON1.B3=0;
SMT1CON1.B2=0;
SMT1CON1.B1=0;
SMT1CON1.B0=0;
1 cycle= 4/64= 0.0625 µS
(SMT1CLK:CSELx= 001 ou 010 )
Mesure= 16 000 264 AVEC AVEC FOSC ou HINTOSC=64MHz
Code : Tout sélectionner
SMT1CON1.SMT1GO=1;
Init_Timer0();
LED_Rouge=ON;
LED_Verte= SMT1STAT.B0 ;
while( Drapeaux.Tmr0_Elapsed==0); // delay
SMT1CON1.SMT1GO=0;
LED_Verte= SMT1STAT.B0 ; //
LED_Rouge=OFF;
// impression du resultat sur Terminal YAT
*(ST)= SMT1TMRL;
*(ST+1)= SMT1TMRH;
*(ST+2)= SMT1TMRU;
*(ST+3)=0 ;
LongWordToStr(SMT1_Measure,CRam1);
Print(CRam1); CRLF1();
en decalant le MARCHE/ARRET compteur , au plus pres du delay de 1sec
Mesure = 16 000 108 AVEC FOSC ou HINTOSC=64MHz
Code : Tout sélectionner
Init_Timer0();
LED_Rouge=ON;
LED_Verte= SMT1STAT.B0 ;
SMT1CON1.SMT1GO=1;
while( Drapeaux.Tmr0_Elapsed==0); // delay 1sec
SMT1CON1.SMT1GO=0;
on remarque qu'il n'y a pas 16 000 000 pile poil,
car il faut y rajouter les cycles necessaires au traitement de l'interruption
et la restitution du contexte .
en rajoutant 2 NOP en asm
Mesure = 16 000 116 AVEC FOSC ou HINTOSC=64MHz
la difference de 2 NOP = 2 cycles .... 116-108=8 8/4=>2 cycles
résolution 4 points par cycle.
Code : Tout sélectionner
Init_Timer0();
LED_Rouge=ON;
LED_Verte= SMT1STAT.B0 ;
SMT1CON1.SMT1GO=1;
while( Drapeaux.Tmr0_Elapsed==0); // delay 1sec
_asm nop;
-asm nop;
SMT1CON1.SMT1GO=0;
Avec seulement les 2 NOP
Mesure = 12 AVEC FOSC ou HINTOSC=64MHz
la difference de 2 NOP = 2 cycles .... 12/4=>3 cycles
*résolution 4 points par cycle.
Code : Tout sélectionner
SMT1CON1.SMT1GO=1;
_asm nop; // <--1
-asm nop; // <--2
SMT1CON1.SMT1GO=0; // <--3
un bon outil facile à utiliser
A suivre ..les autres modes d'utilisation sur SMT
periodmetre
frequencemetre
...