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 le langage C !

Modérateur : Jérémy

Usage du compteur 24bits SMT1 sur 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1703
Âge : 69
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » dim. 10 mai 2020 18:08 lien vers la Data-Sheet : Cliquez ici

bonsoir,

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
...
Aides toi, le ciel ou Fantastpic t'aideras

Usage du compteur 24bits SMT1 sur 18F27K42
Jérémy
Administrateur du site
Administrateur du site
Messages : 2414
Âge : 41
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » lun. 11 mai 2020 07:33 lien vers la Data-Sheet : Cliquez ici

Bonjour PAul et bonjour à tous ,

Encore un post très instructif..... A suivre !

Merci !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Usage du compteur 24bits SMT1 sur 18F27K42
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1651
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » mar. 12 mai 2020 01:40 lien vers la Data-Sheet : Cliquez ici

Bonsoir paulfjujo, Jérémy, et tout le forum,

:bravo: ==> et Merci ! pour ce post, mais il faudra que s'attende, car j'ai pas de quoi programmer ce pic là :cry: et vu le prix du Pickit4 je vais attendre que le prix chute.

Par contre ce Pic est très intéressante au niveau Sdram et mémoire programme, et même Eeprom, je vais surement en faire mon pic préféré par la suite. :wink:

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


Retourner vers « Langage C »

Qui est en ligne

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