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 l'Assembleur !

Modérateur : mazertoc

Fréquencemètre divers technique
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#11 Message par Temps-x » mer. 10 nov. 2021 01:03

Bonsoir paulfjujo, et tout le forum,

:bravo: Je viens de faire un essai sur RC0, et ça fonctionne..... 8-) apparemment pour le Pic18F27K42 seule le PORTB et PORTC son concerné, d'après le tableau de la page 279 comme tu l'indiques (voir aussi la page 278)

C'est super pratique la redirection :-D dans le tableau de la page 279 et page 280 on voit d'autre protocole quand peut rediriger avec le registre qui correspond à son mode en face de la ligne et son attribut par défaut... et ce n'est pas fini oops car un peu plus bas il y en a encore d'autre .... :lol:

Pour un fréquencemètre, il faut mieux avoir une base de temps de 500 ms, puis multiplier par 2, ça augmente ça capacité à 33554430 Hz (33,554430 Mhz) mais réduit un peu sa précision.

Merci ! pour les infos, ça m'est très précieux pour avancer.

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

Fréquencemètre divers technique
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#12 Message par paulfjujo » mer. 10 nov. 2021 20:24

bonsoir,


:!!: ERRARE ...
pour avoir de la precision avec le 1Hz RTC comme base de temps (PIC en mode FOSC interne 64Mhz)
j'ai utilisé le mode 10 : FIGURE 25-22: WINDOWED COUNTER MODE SINGLE ACQUISITION TIMING DIAGRAM
On mesure le nb de pulse du signal pendant 1 sec => donc direct Frequence en HZ

ERRARE : mesure du duty-cycle !

Mis en evidence , aujourdh'ui , avec une autre source de test ( m a boite gene à quartz etant limitée à 25KHz!)
Oscillateur EPSON 25MHz suivit d'un compteur 74LS93 => delivrant 12,5 Mhz , 6,25 , 3,125 et 1,5625 Mhz
avec analyser logique en parrallele sur le signal sortie generateur
pour mesurer le duty cycle du signal ...

"Bon dieu ,mais c'est bien sûr !" comme disait l'inspecteur Bourrel ...

La mesure Duty etait toujours à 50% pour un reel de 33%
car on mesure le Duty cycle de la RTC 1HZ et non pas celui du signal..
par contre on a une bonne precision de mesure de frequence :

10/11/2021
test ave oscillateur EPSON 2-E197G 25MHz dip8 4 pins at TAmb=19°C
1=O.E. 4=Gnd 5 = Output 8=+Vcc suivi d'un DM74LS93

Q3= sortie 1/16 => 1,5625 MHz theorique
SQA measure= 1.56MHz
SQAduty cycle vu par SQA= H=260ns, L=380ns soit 40.6%
Mesure SMT1 Freqencemetre :1562496 delta maxi -4Hz
Problemo duty cycle!

.$* Freq= 1562496, Hz , Duty= 50.00%
.$* Freq= 1562496, Hz , Duty= 50.00%
.$* Freq= 1562495, Hz , Duty= 50.00%
.$* Freq= 1562497, Hz , Duty= 50.00%
.$* Freq= 1562499, Hz , Duty= 50.00%
.$* Freq= 1562498, Hz , Duty= 50.00%
.$* Freq= 1562499, Hz , Duty= 50.00%
.$* Freq= 1562496, Hz , Duty= 50.00%


Q2= sortie 1/8 => 3,125 MHz theorique
SQA Mesure = 3,13 MHz
Mesure SMT1 Freqencemetre : 3124995 Hz delta maxi=-11Hz


.$* Freq= 3124996, Hz , Duty= 50.00%
$.* Freq= 3124989, Hz , Duty= 50.00%
$.* Freq= 3124995, Hz , Duty= 50.00%
$.* Freq= 3124989, Hz , Duty= 50.00%
$.* Freq= 3124995, Hz , Duty= 50.00%
$.* Freq= 3124996, Hz , Duty= 50.00%
$.* Freq= 3124990, Hz , Duty= 50.00%
$.* Freq= 3124995, Hz , Duty= 50.00%

Q1= sortie 1/4 =>6,250 MHz theorique
SQA Mesure = 6,25MHz
SQA Dutycycle H=40 L=120 =>25% et non 50%
Mesure SMT1 Freqencemetre : 6250000 Hz delta maxi=-27 +73 =100Hz
mais Problemo SQA Dutycycle !!

.$* Freq= 6250000, Hz , Duty= 50.00%
.$* Freq= 6250000, Hz , Duty= 50.00%
.$* Freq= 6249975, Hz , Duty= 50.00%
.$* Freq= 6249963, Hz , Duty= 50.00%
.$* Freq= 6249987, Hz , Duty= 50.00%
.$* Freq= 6249999, Hz , Duty= 50.00%
.$* Freq= 6249986, Hz , Duty= 50.00%
.$* Freq= 6249999, Hz , Duty= 50.00%
.$* Freq= 6249987, Hz , Duty= 50.00%
.$* Freq= 6250073, Hz , Duty= 50.00%
.$* Freq= 6249987, Hz , Duty= 50.00%
.$* Freq= 6249998, Hz , Duty= 50.00%


Q0= sortie 1/2 =>12,50 MHz theorique
SQA Mesure = 12,5MHz
SQA Dutycycle H=40 L=40 =>50%
Mesure SMT1 Freqencemetre : 12500000 Hz delta maxi=-47 +1 =48Hz

$.* Freq= 12499978, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499976, Hz , Duty= 50.00%
$.* Freq= 12499953, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12500001, Hz , Duty= 50.00%
$.* Freq= 12499953, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499953, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12500001, Hz , Duty= 50.00%



:!!: Oublier le Duty_cycle avec le Mode 10
Modif soft répercutée sur ma page web ...



pour une vrai mesure du duty cycle
il faut utiliser les mode 2 ou 3


SMT1_High_and_Low_Measure_Mode_Single_Acq_Timing.jpg




Mode 3 fig 25-9 pour mesurer les 2 periodes: Etat Haut et Etat bas du signal à mesurer
25.6.4 HIGH AND LOW MEASURE MODE
Ce n'est plus un Frequencemetre direct mais un PERIODE METRE !!!
plutot adapté aux basses frequences ...ou il sera tres precis

L'entree du timer SMT1 est ici 40MHz .. chaque tick fait 25nS



MCU : 18F27K42
Power supply: 3.6 à 5V
Directory : C:\_MikroC\_MesProjets_MikroC\_18F27K42_Test_SMT1_24bits_counter
Projet : Base_18F27K42_Test_SMT1_High_Low_Periode_Freq_Meter_2021_11.mcppi
Source : Base_18F27K42_Test_SMT1_High_Low_Periode_Freq_Meter_Q10Mhzx4__2021-1109.c
CONFIG : P18F27K42_Fosc_Q10MhzxPLL_40MHz_with_Vectored_IT.cfgsch
FOSC : Q10MHz x 4 =40Mhz
IVT Interrupt mode !
HARDWARE :
SMT1SIG= RC1= signal à mesurer
Clock initiale in Khz = 40000
Test SMT compteur 24 bits (résumé des registres en page 364)
Test SMT1 en mode 3 :
Mode 3 = Hig and Low Measurement TMR reset à chaque front montant
Init Interrupt UART RX
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 802, Bas = 799 soit 40025 nS , Freq=24984.4 Hz , Duty= 50.09%
* Haut = 802, Bas = 799 soit 40025 nS , Freq=24984.4 Hz , Duty= 50.09%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32002 soit 1600150 nS , Freq=624.9 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 64007, Bas = 64004 soit 3200275 nS , Freq=312.5 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128009 soit 6400525 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128009 soit 6400525 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128010 soit 6400550 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128009 soit 6400525 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048170 soit 102408568 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048171 soit 102408600 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048170 soit 102408568 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048170 soit 102408568 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 4096345, Bas = 4096341 soit 204817136 nS , Freq=4.9 Hz , Duty= 50.00%
* Haut = 4096345, Bas = 4096341 soit 204817136 nS , Freq=4.9 Hz , Duty= 50.00%
* Haut = 4096345, Bas = 4096341 soit 204817136 nS , Freq=4.9 Hz , Duty= 50.00%



test avec generateur EPSON25MHz sortie Q3 = 1,5625 MHz


* Haut = 11, Bas = 15 soit 650 nS , Freq=1538461.2 Hz , Duty= 42.31%
* Haut = 11, Bas = 15 soit 650 nS , Freq=1538461.2 Hz , Duty= 42.31%
* Haut = 12, Bas = 14 soit 650 nS , Freq=1538461.2 Hz , Duty= 46.15%
* Haut = 11, Bas = 14 soit 625 nS , Freq=1599999.9 Hz , Duty= 44.00%
* Haut = 12, Bas = 14 soit 650 nS , Freq=1538461.2 Hz , Duty= 46.15%



:!!: ne convient plus au delà de quelques MHZ
pas assez de resolution !!
meme avec FOSC 64MHz (Q=16MHzx4) on ne montera guere plus haut

il faut donc reserver le mode frequencemetre mode=10 pour cela...
si on a un quartz, on peut evidement generer une pulse de 1sec via un timer du PIC ,
à la place du 1Hz RTC ..
mais celle ci restera quand meme toujours plus precise (car tres faible derive avec temperature)


la difference entre les 2 modes se voit au niveau de la capacité maxi de comptage :


en mode 3
, le duty_cycle devient
Haut / (Haut + bas)
idea ! On utilise 2 x la capacité du TMR 24 bits .. pour chaque etat ( haut ou bas)
soit maxima 48 bits pour une periode avec un duty de 50%

Test en mode 2

mode tres similaire ,mais avec acquisition du front haut et de la periode complete
d'ou le duty-cycle = Haut / Periode
on utilise une seule fois le maxi du TMR 24bits pour 1 periode

Reste à Utiliser les 2 modes 10 et 3 dans le meme programme !


Détection OVER RUN du Timer SMT1
Via interruption SMT1
registre SMT1CON0
si STP bit à 1 => Generation d'une interrupt Overflow si SMT1TMR = STM1PR ,
sinon si STP=0 interrupt sur Overflow 24 bits

Code : Tout sélectionner


void Interrupt_SMT1_Over
() iv IVT_SMT1 ics ICS_AUTO 
{   U1TXB='#';   // traçeur d'interrupt
   Flag_SMT1_OVER=1;
   SMT1IF_bit=0;
}

l'interrupt pour capter les 2 registres 32 bits durée  Haut et duree  Bas
void Interrupt_STM1_PRA() iv IVT_SMT1PRA ics ICS_AUTO
  {
  U1TXB='
*'   ;  // traçeur d'interrupt
  PIR1
.SMT1PRAIF=0; // PIR1.B7
  *(ST1R)= SMT1CPRL;
   *(ST1R+1)= SMT1CPRH;
   *(ST1R+2)= SMT1CPRU;
   *(ST1R+3)=0  ;
    *(ST1W)= SMT1CPWL;
   *(ST1W+1)= SMT1CPWH;
   *(ST1W+2)= SMT1CPWU;
   *(ST1W+3)=0  ;
   SMT1CON1.SMT1GO=0;  //          ARRET
   SMT1EN_bit=0; // disable
  }

 


dans le main

Code : Tout sélectionner

  SMT1EN_bit=1;
   SMT1CON1.SMT1GO=1;
   LED_Rouge=OFF;
   Delay_ms(1000);
  if( (Flag_SMT1_OVER==0)&& (SMT1_Bas>0) )
   {
   LongWordToStr(SMT1_Haut,CRam1);
   CPrint(" Haut = ");Print(CRam1);  UART1_Write(',');
   LongWordToStr(SMT1_Bas,CRam1);
   CPrint(" Bas = ");Print(CRam1);  CPrint("  soit  ");
   TT=  SMT1_Bas + SMT1_Haut;
   Periode =(float)TT*25;  // 40Mhz => tick=25nS
   LongWordToStr(Periode,CRam1);
   Print(CRam1); CPrint(" nS ,");
   CPrint(" Freq=" );
   Frequence=1000000000 / Periode;
   Float2Ascii (Frequence,CRam1,1); Print(CRam1); CPrint(" Hz");
   CPrint(" , Duty= ");
   Duty=  ((float) SMT1_Haut*100.0)/TT;
   Float2Ascii (Duty,CRam1,2);
   Print(CRam1); UART1_Write('%');
 }  else
 {
    CPrint(" Over or not ready.");
    }
    CRLF1();
   


teste avec envoi de frequence tres basses , via la commande mono-coup (BP poussoir) de ma boite gene à quartz
detection de OVER count SMT1 TMR ?

Code : Tout sélectionner


 Over or not ready
.
 Over or not ready.
 Over or not ready.
 Over or not ready.
*
 Haut =   10427876, Bas =    7923722  soit   458789920 nS , Freq=2.2 Hz , Duty= 56.82%
 Over or not ready.
*
 Over or not ready.
*
 Over or not ready.
*
 Over or not ready.
*
 Over or not ready.
**
 Haut =   12887541, Bas =   12095386  soit   624573120 nS , Freq=1.6 Hz , Duty= 51.59%
*
 Haut =   11351615, Bas =   11468224  soit   570495936 nS , Freq=1.8 Hz , Duty= 49.74%
*
 Haut =   10817946, Bas =    9954795  soit   519318496 nS , Freq=1.9 Hz , Duty= 52.08%

 


:!!: je n'ai pas réussi à capter un debordement SMT1 TMR via l'interrupt
vu que le caractere # de pistage interrupt , n'apparait pas !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Fréquencemètre divers technique
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#13 Message par paulfjujo » dim. 14 nov. 2021 20:25

paulfjujo a écrit :bonsoir,


:!!: ERRARE ...
pour avoir de la precision avec le 1Hz RTC comme base de temps (PIC en mode FOSC interne 64Mhz)
j'ai utilisé le mode 10 : FIGURE 25-22: WINDOWED COUNTER MODE SINGLE ACQUISITION TIMING DIAGRAM
On mesure le nb de pulse du signal pendant 1 sec => donc direct Frequence en HZ

ERRARE : mesure du duty-cycle !

Mis en evidence , aujourdh'ui , avec une autre source de test ( m a boite gene à quartz etant limitée à 25KHz!)
Oscillateur EPSON 25MHz suivit d'un compteur 74LS93 => delivrant 12,5 Mhz , 6,25 , 3,125 et 1,5625 Mhz
avec analyser logique en parrallele sur le signal sortie generateur
pour mesurer le duty cycle du signal ...

"Bon dieu ,mais c'est bien sûr !" comme disait l'inspecteur Bourrel ...

La mesure Duty etait toujours à 50% pour un reel de 33%
car on mesure le Duty cycle de la RTC 1HZ et non pas celui du signal..
par contre on a une bonne precision de mesure de frequence :

10/11/2021
test ave oscillateur EPSON 2-E197G 25MHz dip8 4 pins at TAmb=19°C
1=O.E. 4=Gnd 5 = Output 8=+Vcc suivi d'un DM74LS93

Q3= sortie 1/16 => 1,5625 MHz theorique
SQA measure= 1.56MHz
SQAduty cycle vu par SQA= H=260ns, L=380ns soit 40.6%
Mesure SMT1 Freqencemetre :1562496 delta maxi -4Hz
Problemo duty cycle!

.$* Freq= 1562496, Hz , Duty= 50.00%
.$* Freq= 1562496, Hz , Duty= 50.00%
.$* Freq= 1562495, Hz , Duty= 50.00%
.$* Freq= 1562497, Hz , Duty= 50.00%
.$* Freq= 1562499, Hz , Duty= 50.00%
.$* Freq= 1562498, Hz , Duty= 50.00%
.$* Freq= 1562499, Hz , Duty= 50.00%
.$* Freq= 1562496, Hz , Duty= 50.00%


Q2= sortie 1/8 => 3,125 MHz theorique
SQA Mesure = 3,13 MHz
Mesure SMT1 Freqencemetre : 3124995 Hz delta maxi=-11Hz


.$* Freq= 3124996, Hz , Duty= 50.00%
$.* Freq= 3124989, Hz , Duty= 50.00%
$.* Freq= 3124995, Hz , Duty= 50.00%
$.* Freq= 3124989, Hz , Duty= 50.00%
$.* Freq= 3124995, Hz , Duty= 50.00%
$.* Freq= 3124996, Hz , Duty= 50.00%
$.* Freq= 3124990, Hz , Duty= 50.00%
$.* Freq= 3124995, Hz , Duty= 50.00%

Q1= sortie 1/4 =>6,250 MHz theorique
SQA Mesure = 6,25MHz
SQA Dutycycle H=40 L=120 =>25% et non 50%
Mesure SMT1 Freqencemetre : 6250000 Hz delta maxi=-27 +73 =100Hz
mais Problemo SQA Dutycycle !!

.$* Freq= 6250000, Hz , Duty= 50.00%
.$* Freq= 6250000, Hz , Duty= 50.00%
.$* Freq= 6249975, Hz , Duty= 50.00%
.$* Freq= 6249963, Hz , Duty= 50.00%
.$* Freq= 6249987, Hz , Duty= 50.00%
.$* Freq= 6249999, Hz , Duty= 50.00%
.$* Freq= 6249986, Hz , Duty= 50.00%
.$* Freq= 6249999, Hz , Duty= 50.00%
.$* Freq= 6249987, Hz , Duty= 50.00%
.$* Freq= 6250073, Hz , Duty= 50.00%
.$* Freq= 6249987, Hz , Duty= 50.00%
.$* Freq= 6249998, Hz , Duty= 50.00%


Q0= sortie 1/2 =>12,50 MHz theorique
SQA Mesure = 12,5MHz
SQA Dutycycle H=40 L=40 =>50%
Mesure SMT1 Freqencemetre : 12500000 Hz delta maxi=-47 +1 =48Hz

$.* Freq= 12499978, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499976, Hz , Duty= 50.00%
$.* Freq= 12499953, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12500001, Hz , Duty= 50.00%
$.* Freq= 12499953, Hz , Duty= 50.00%
$.* Freq= 12499954, Hz , Duty= 50.00%
$.* Freq= 12499953, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12499977, Hz , Duty= 50.00%
$.* Freq= 12500001, Hz , Duty= 50.00%



:!!: Oublier le Duty_cycle avec le Mode 10
Modif soft répercutée sur ma page web ...



pour une vrai mesure du duty cycle
il faut utiliser les mode 2 ou 3


SMT1_High_and_Low_Measure_Mode_Single_Acq_Timing.jpg



Mode 3 fig 25-9 pour mesurer les 2 periodes: Etat Haut et Etat bas du signal à mesurer
25.6.4 HIGH AND LOW MEASURE MODE
Ce n'est plus un Frequencemetre direct mais un PERIODE METRE !!!
plutot adapté aux basses frequences ...ou il sera tres precis

L'entree du timer SMT1 est ici 40MHz .. chaque tick fait 25nS



MCU : 18F27K42
Power supply: 3.6 à 5V
Directory : C:\_MikroC\_MesProjets_MikroC\_18F27K42_Test_SMT1_24bits_counter
Projet : Base_18F27K42_Test_SMT1_High_Low_Periode_Freq_Meter_2021_11.mcppi
Source : Base_18F27K42_Test_SMT1_High_Low_Periode_Freq_Meter_Q10Mhzx4__2021-1109.c
CONFIG : P18F27K42_Fosc_Q10MhzxPLL_40MHz_with_Vectored_IT.cfgsch
FOSC : Q10MHz x 4 =40Mhz
IVT Interrupt mode !
HARDWARE :
SMT1SIG= RC1= signal à mesurer
Clock initiale in Khz = 40000
Test SMT compteur 24 bits (résumé des registres en page 364)
Test SMT1 en mode 3 :
Mode 3 = Hig and Low Measurement TMR reset à chaque front montant
Init Interrupt UART RX
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 802, Bas = 799 soit 40025 nS , Freq=24984.4 Hz , Duty= 50.09%
* Haut = 802, Bas = 799 soit 40025 nS , Freq=24984.4 Hz , Duty= 50.09%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 801, Bas = 799 soit 40000 nS , Freq=25000.0 Hz , Duty= 50.06%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32002 soit 1600150 nS , Freq=624.9 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 32004, Bas = 32001 soit 1600125 nS , Freq=625.0 Hz , Duty= 50.00%
* Haut = 64007, Bas = 64004 soit 3200275 nS , Freq=312.5 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128009 soit 6400525 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128009 soit 6400525 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128010 soit 6400550 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 128012, Bas = 128009 soit 6400525 nS , Freq=156.2 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 256023, Bas = 256020 soit 12801075 nS , Freq=78.1 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048170 soit 102408568 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048171 soit 102408600 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048170 soit 102408568 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 2048173, Bas = 2048170 soit 102408568 nS , Freq=9.8 Hz , Duty= 50.00%
* Haut = 4096345, Bas = 4096341 soit 204817136 nS , Freq=4.9 Hz , Duty= 50.00%
* Haut = 4096345, Bas = 4096341 soit 204817136 nS , Freq=4.9 Hz , Duty= 50.00%
* Haut = 4096345, Bas = 4096341 soit 204817136 nS , Freq=4.9 Hz , Duty= 50.00%



test avec generateur EPSON25MHz sortie Q3 = 1,5625 MHz


* Haut = 11, Bas = 15 soit 650 nS , Freq=1538461.2 Hz , Duty= 42.31%
* Haut = 11, Bas = 15 soit 650 nS , Freq=1538461.2 Hz , Duty= 42.31%
* Haut = 12, Bas = 14 soit 650 nS , Freq=1538461.2 Hz , Duty= 46.15%
* Haut = 11, Bas = 14 soit 625 nS , Freq=1599999.9 Hz , Duty= 44.00%
* Haut = 12, Bas = 14 soit 650 nS , Freq=1538461.2 Hz , Duty= 46.15%



:!!: ne convient plus au delà de quelques MHZ
pas assez de resolution !!
meme avec FOSC 64MHz (Q=16MHzx4) on ne montera guere plus haut

il faut donc reserver le mode frequencemetre mode=10 pour cela...
si on a un quartz, on peut evidement generer une pulse de 1sec via un timer du PIC ,
à la place du 1Hz RTC ..
mais celle ci restera quand meme toujours plus precise (car tres faible derive avec temperature)


la difference entre les 2 modes se voit au niveau de la capacité maxi de comptage :


en mode 3
, le duty_cycle devient
Haut / (Haut + bas)
idea ! On utilise 2 x la capacité du TMR 24 bits .. pour chaque etat ( haut ou bas)
soit maxima 48 bits pour une periode avec un duty de 50%

Test en mode 2

mode tres similaire ,mais avec acquisition du front haut et de la periode complete
d'ou le duty-cycle = Haut / Periode
on utilise une seule fois le maxi du TMR 24bits pour 1 periode

Reste à Utiliser les 2 modes 10 et 3 dans le meme programme !


Détection OVER RUN du Timer SMT1
Via interruption SMT1
registre SMT1CON0
si STP bit à 1 => Generation d'une interrupt Overflow si SMT1TMR = STM1PR ,
sinon si STP=0 interrupt sur Overflow 24 bits

Code : Tout sélectionner


void Interrupt_SMT1_Over
() iv IVT_SMT1 ics ICS_AUTO 
{   U1TXB='#';   // traçeur d'interrupt
   Flag_SMT1_OVER=1;
   SMT1IF_bit=0;
}

l'interrupt pour capter les 2 registres 32 bits durée  Haut et duree  Bas
void Interrupt_STM1_PRA() iv IVT_SMT1PRA ics ICS_AUTO
  {
  U1TXB='
*'   ;  // traçeur d'interrupt
  PIR1
.SMT1PRAIF=0; // PIR1.B7
  *(ST1R)= SMT1CPRL;
   *(ST1R+1)= SMT1CPRH;
   *(ST1R+2)= SMT1CPRU;
   *(ST1R+3)=0  ;
    *(ST1W)= SMT1CPWL;
   *(ST1W+1)= SMT1CPWH;
   *(ST1W+2)= SMT1CPWU;
   *(ST1W+3)=0  ;
   SMT1CON1.SMT1GO=0;  //          ARRET
   SMT1EN_bit=0; // disable
  }

 


dans le main

Code : Tout sélectionner

  SMT1EN_bit=1;
   SMT1CON1.SMT1GO=1;
   LED_Rouge=OFF;
   Delay_ms(1000);
  if( (Flag_SMT1_OVER==0)&& (SMT1_Bas>0) )
   {
   LongWordToStr(SMT1_Haut,CRam1);
   CPrint(" Haut = ");Print(CRam1);  UART1_Write(',');
   LongWordToStr(SMT1_Bas,CRam1);
   CPrint(" Bas = ");Print(CRam1);  CPrint("  soit  ");
   TT=  SMT1_Bas + SMT1_Haut;
   Periode =(float)TT*25;  // 40Mhz => tick=25nS
   LongWordToStr(Periode,CRam1);
   Print(CRam1); CPrint(" nS ,");
   CPrint(" Freq=" );
   Frequence=1000000000 / Periode;
   Float2Ascii (Frequence,CRam1,1); Print(CRam1); CPrint(" Hz");
   CPrint(" , Duty= ");
   Duty=  ((float) SMT1_Haut*100.0)/TT;
   Float2Ascii (Duty,CRam1,2);
   Print(CRam1); UART1_Write('%');
 }  else
 {
    CPrint(" Over or not ready.");
    }
    CRLF1();
   


teste avec envoi de frequence tres basses , via la commande mono-coup (BP poussoir) de ma boite gene à quartz
detection de OVER count SMT1 TMR ?

Code : Tout sélectionner


 Over or not ready
.
 Over or not ready.
 Over or not ready.
 Over or not ready.
*
 Haut =   10427876, Bas =    7923722  soit   458789920 nS , Freq=2.2 Hz , Duty= 56.82%
 Over or not ready.
*
 Over or not ready.
*
 Over or not ready.
*
 Over or not ready.
*
 Over or not ready.
**
 Haut =   12887541, Bas =   12095386  soit   624573120 nS , Freq=1.6 Hz , Duty= 51.59%
*
 Haut =   11351615, Bas =   11468224  soit   570495936 nS , Freq=1.8 Hz , Duty= 49.74%
*
 Haut =   10817946, Bas =    9954795  soit   519318496 nS , Freq=1.9 Hz , Duty= 52.08%

 


:!!: je n'ai pas réussi à capter un debordement SMT1 TMR via l'interrupt
vu que le caractere # de pistage interrupt , n'apparait pas !







*****************************************************************************************************
14-11-2021
FREQUENCE METRE mode 10


Usage de TMR0 pour generer le signal WINDOW 1Hz
le Timer0 est calé à 500mS et sort l'info x 2 sur RC5 ..liaiseon entre sortie 1Hz carré RC5 vers RC0 entree signal window
Le SMT1 est en mode 10
Le PIC est utilisé avec FOSC Q=10MHs x PLL => 40Mhz
test 12,5MHz ..OK

.... avec Remise en cause sur l'usage du Postscaler en mode Timer !

a noter:
que le "Timer calculateur de MikroE" ne se preoccupe pas du tout du registre T0CON1 !
et pourtant peut delivrer le timming de 500mS ???
non utilisé ici ..



Timer0_diagram.jpg



test avec 3,125MHz
Freq= 3125009

à 12,5MHz:
Freq= 12500031

Code : Tout sélectionner


void Init_Timer0_500msec
()
{

// REGISTER 22-1: T0CON0: TIMER0 CONTROL REGISTER 0
T0CON0=0;
T0CON0.B7=0; //T0EN_bit=1; // // Enable module and operating
T0CON0.B4=1; //MD16=1;
// OUTPS<3:0>: TMR0 Output Postscaler (Divider) Select bits 0000= 1/1
// 1 -> 1:2
T0CON0.B3=0;
T0CON0.B2=0;
T0CON0.B1=0;
T0CON0.B0=0;
// REGISTER 22-2: T0CON1: TIMER0 CONTROL REGISTER 1
// bit 7-5 CS<2:0>:Timer0 Clock Source Select bits = 011 HFINTOSC 010=FOSC/4
//010=FOSC/4
T0CON1.B7=0; //T0CON1.CS2
T0CON1.B6=1; //T0CON1.CS1
T0CON1.B5=0; //T0CON1.CS0
// bit 4 ASYNC: TMR0 Input Asynchronization Enable bit
// T0CON1.ASYNC=0;//The input to the TMR0 counter is not synchronized to FOSC/4
T0CON1.B4=1;// ASYNC bit  The input to the TMR0 counter is synchronized to FOSC/4
// bit 3-0 CKPS<3:0>: Prescaler Rate Select bit     // CKPS3:0 1000=> 1/256
// 7-> 1:128
T0CON1.B3=;
T0CON1.B2=;
T0CON1.B1=;
T0CON1.B0=;
Drapeaux.Tmr0_Elapsed=;
Count0=0;
TMR0H = 0x67;
TMR0L = 0x6A;
TMR0IF_bit=0;
T0EN_bit=1;
TMR0IE_bit = 1 ; // TMR0 Ensable Interrupt.
GIE_bit=1;
}

 void Interrupt_TMR0() iv IVT_TMR0 ics ICS_AUTO 
 
{
        Delay_us(36); // ajustement final 
       TMR0H = 0x67;
       TMR0L = 0x6A;
       TMR0IF_bit= 0;
       SQA=0;
 }

l'affectation des pins MCU 

 Unlock_IOLOCK();
  RA5PPS=0;
  RC6PPS = 0x13;   //RC6->UART1:TX1;
  U1RXPPS = 0x17;   //RC7->UART1:RX1;
   RC5PPS= 0;
  //TABLE 17-1: PPS INPUT REGISTER DETAILS
  SMT1WINPPS=0x10;  // RC0    PORTC =0x010      Pin 0= 0x000
  SMT1SIGPPS=0x11;  //RC1    PORTC =0x010     Pin 1= 0x001
   // sortie TMR0 sur RC5
   //  0b10 0101 TMR0 — B C        10 0101=  25
   RC5PPS= 0x25;
  Lock_IOLOCK();



* le Prescaler TMR0 permet de choisir des sous multiples de 1 sec !
0.5sec
0.25sec

un quartz 16MHz serait preferable ..qu'un 10Mhz ... pour les divisions binaires rondes.
Aide toi, le ciel ou FantasPic t'aidera

Fréquencemètre divers technique
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#14 Message par Temps-x » dim. 14 nov. 2021 23:48

Bonsoir paulfjujo, et tout le forum,

Je reviens de vacance, :eek: et je viens de voir tout ce que tu as fait, j'ai du retard à rattraper.
paulfjujo a écrit :Source du message a noter:
que le "Timer calculateur de MikroE" ne se preoccupe pas du tout du registre T0CON1 !
et pourtant peut delivrer le timming de 500mS ???
non utilisé ici ..


Quelle dommage avec toute la série de diviseurs qu'il y a, je vais voir ça en ASM, là!! je serais pas bloqué par MikroE :langue:

:sifflotte: Timer0_diagram.jpg

paulfjujo a écrit :Source du message je n'ai pas réussi à capter un debordement SMT1 TMR via l'interrupt
vu que le caractere # de pistage interrupt , n'apparait pas !

:cry: c'est rappé pour ce que je veux faire.

J'ai fait un essai en remettant carry à zéro avant prise de mesure, mais rien n'apparait après mesure (quand le compteur déborde) carry reste à zéro

C'est vraiment embêtant de ne plus avoir un éditeur comme MPLAB8.92 ou l'on pouvait voir si un registre changé en ASM.

paulfjujo a écrit :Source du message un quartz 16MHz serait preferable ..qu'un 10Mhz ... pour les divisions binaires rondes.


:+1: exacte


Merci ! pour toute les recherches que tu fais, oops bon je vais devoir traduire tout ça en ASM,

Plus les microcontrôleurs 8 bits avance, plus il se rapproche des microcontrôleurs 32 bits dans leurs fonctions et complexité.

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

Fréquencemètre divers technique
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#15 Message par paulfjujo » lun. 15 nov. 2021 11:29

bonjour,


Temps-x a écrit :Quelle dommage avec toute la série de diviseurs qu'il y a, je vais voir ça en ASM, là!! je serais pas bloqué par MikroE


au final, je n'utilise pas le Timer Calculator de MikroE, puisque je redefinis tous less Registre TMR0
:sifflotte: donc == ASM !


paulfjujo a écrit :Source du message je n'ai pas réussi à capter un debordement SMT1 TMR via l'interrupt
vu que le caractere # de pistage interrupt , n'apparait pas !

:cry: c'est rappé pour ce que je veux faire.

idea ! MAIS si ! , j'ai trouvé !
En fait il faut utiliser un autre registre 24 bits SMT1PR ( à ne pas confondre avec SMT1CPR !)
qui n'est pas visible sur le Diagram Windowed mode !

en relisant ceci :
Similar to other timers, the SMT triggers an interrupt
when SMT1TMR rolls over to ‘0’. This happens when
SMT1TMR = SMT1PR, regardless of mode
bit 5 STP: SMT Counter Halt Enable bit
When SMT1TMR = SMT1PR:
1 = Counter remains SMT1PR; period match interrupt occurs when clocked
0 = Counter resets to 24’h000000; period match interrupt occurs when clocked


L'interruput SMT1 apparait si la mesure atteint le seuil definit par SMT1PR
voir le tableau de test ci dessous ...

au final , traitement des 2 interrupts suivantes :
// 25.7.2 PERIOD MATCHI INTERRUPT avec SMT1PR
PIR1.SMT1IF=0;
PIE1.SMT1IE=1;

// 25.7.1 PW (Pulse Width) AND PR (Periode Read) ACQUISITIONI NTERRUPTS
Periode sur 1sec ..donc en HZ direct.
PIR1.SMT1PRAIF=0; // PIR1.B7
PIE1.SMT1PRAIE=1; // PIE1.B7
SMT1PRAIP_bit=1; // IPR1.B7

* le traitement de PIR1.SMT1PWAIF est inutile .

si on met la limite tres pres de la mesure: ( injection de 1,25Mhz)
avec Registre
(10:47:38.448) avec SMT1PR Registre : 0xBEBC20 soit 12 500 000
à +- 1Hz on accroche ou pas l'overflow
(10:48:12.503) ..............&*.
(10:48:13.926) Overflow SMT1
(10:48:14.502) ..............*. OK
(10:48:15.940) Freq= 12499996
(10:48:16.502) ..............&*. overflow
(10:48:17.933) Overflow SMT1
(10:48:18.503) ..............*. OK
(10:48:19.921) Freq= 12499997

au final :
limite choisie : 16 000 000 soit 0xF42401 ( 16MHz) avec Tmr0=500mS *2
(on pourra monter à 32MHz maxi avec TMR0=250mS !
avec SMT1PR Registre pour maxi 16MHz : 0xF42401
F=12,5MHz
(10:59:55.084) Freq= 12500006
(10:59:55.681) ..............*.
(10:59:57.108) Freq= 12500005
(10:59:57.680) ..............*.
(10:59:59.105) Freq= 12500121
(10:59:59.682) ..............*.

pour aller à 32MHz maxima -> modif du prescaler Tmr0
64 au lieu de 128 => 250msx2=500mS duree de mesure
et mesure FREQ à multiplier par 2 ..
le drapeau Drapeaux.SMT1_Over pourrait enclencher ce changement de gamme automatiquement.

Nota :
Avec FOSC = Quartz x PLL
si on veut économiser les 2 pins RC5 sortie 1hz TMR0 ..et .. RC0 entree Window SMT1
on pourrait utiliser :
1 (ou 2) timer 8 bits (seul ou chainés) ex: TMR6 timer sortie postscaled
----> via REGISTER 25-5: SMT1WIN: SMT1 WINDOW INPUT SELECT REGISTER
dommage il n'y a pas TMR0 ...ou autre timer 16 bits ..
car ON NE PEUT PAS faire 1sec avec un Timer8 bits avec 1 seule Interrupt ! il faut rajouter un compteur ..
à voir avec un chainage de 2 compteur 8 bits .. ou via CLC partie logique du MCU !

* Conserver l'entree hardware SIG permet l'usage du MCU SANS quartz ,
mais exige un signal 1Hz externe (ex RTC 1Hz )
si l'application en a besoin (date et heure) , c'est une option gratuite.
Aide toi, le ciel ou FantasPic t'aidera

Fréquencemètre divers technique
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#16 Message par Temps-x » mar. 16 nov. 2021 00:46

paulfjujo a écrit :Source du message :sifflotte: donc == ASM !


Puis quoi encore, c'est un scandale, la vitesse, et l'optimisation n'y est pas :langue:

paulfjujo a écrit :Source du message idea ! MAIS si ! , j'ai trouvé !
En fait il faut utiliser un autre registre 24 bits SMT1PR ( à ne pas confondre avec SMT1CPR !)
qui n'est pas visible sur le Diagram Windowed mode !


Page 364, traduit avec Google traduction

Le cœur du module est le compteur 24 bits, SMT1TMR associé à une acquisition de données complexe l'extrémité avant.

Selon le mode de fonctionnement sélectionné, le SMT peut effectuer une variété de mesures résumées dans le tableau 25-1. 25.1.1 SOURCES D'HORLOGE

Les sources d'horloge disponibles pour le SMT incluent :

• FOSC
• FOSC/4
• HFINTOSC 16 MHz
• LFINTOSC
• MFINTOSC 31,25 kHz


La source d'horloge SMT est sélectionnée en configurant le CSEL[2:0] bits dans le registre SMT1CLK.

L'horloge la source peut également être pré-échelonnée à l'aide des bits PS[1:0] de le registre SMT1CON0.
La source d'horloge pré-échelonnée est utilisé pour cadencer à la fois le compteur et toute synchronisation logique utilisée par le module.

25.1.2 INTERRUPTION DE MATCH DE PÉRIODE

Semblable à d'autres temporisateurs, le SMT déclenche une interruption lorsque SMT1TMR passe à « 0 ».
Cela se produit lorsque SMT1TMR = SMT1PR, quel que soit le mode.

Par conséquent, dans tout mode qui repose sur un signal externe ou une fenêtre pour réinitialiser la minuterie, le bon fonctionnement nécessite que
SMT1PR être réglé sur une période supérieure à celle du signal ou fenêtre attendu.


:roll: Bon, faut que j'arrive à digérais tout ça, il faut que je fasse un essai en version ASM, que je mettrais ici.


paulfjujo a écrit :Source du message dommage il n'y a pas TMR0 ...ou autre timer 16 bits


Normalement le compteur TMR0 peut être paramétré en compteur 16 bits, d'après ce que j'ai compris.

20.8 Register Definitions: Timer0 Control (page 302)

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

Fréquencemètre divers technique
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#17 Message par paulfjujo » mar. 16 nov. 2021 10:05

bonjour,

Temps-x a écrit :.....
Normalement le compteur TMR0 peut être paramétré en compteur 16 bits, d'après ce que j'ai compris.
20.8 Register Definitions: Timer0 Control (page 302)
==> A+


oui, c'est bien en mode 16 bits que je l'ai utilisé !

Pour remplacer la solution Sortie Timer0 1Hz sur Pin RC5 ----> vers pin RC0 Windows SMT1
et économiser 2 pins (RC5 et RC0)

utiliser un timer8bits et la sortie TMR_Over de celui ci
ex: utilisation du Timer4 8 bits ...
TMR4_Overflow comme entrée WiN SMT1 (en interne MCU)

problemo avec 8 bits + Prescaler 128 et postscaler 16 .. on ne peut qu'obtenir 52mS
avec FOSC/4 et Q=10MHz (cycle 0,1µS!)
on ne peut pas utiliser MFINTOSC 500Khz , car depend de l'oscillateur interne et NON PAS de FOSC avec QUARTZ .

La soluce et CLKR register :

Code : Tout sélectionner


   CPrint
("   CLKR init  \r\n ");
   //  REGISTER 8-2: CLKRCLK: CLOCK REFERENCE CLOCK SELECTION MUX
     CLKRCLK=0; // FOSC  Q=10MHzxPLL= 40Mhz
   //     REGISTER 8-1: CLKRCON: REFERENCE CLOCK CONTROL REGISTER
    CLKRCON=0b10010111;   // div by 128
 


FOSC soit 40MHz divisé par 128 => ticks = 3,2µS au lieu de 0,1µS
On peut atteindre maintenant (presque) 1sec
(0.125*128) * 128*16*152=996147.2µS

Code : Tout sélectionner


void TMR4_Init
(void)   // 49971.2 µS
{
//     T4CLKCON = 0x01;    // T4CS 0x01=>FOSC/4     0x05 => 500Khz
     T4CLKCON =;    // T4CS 0b1000   1000        CLKREF_OUT
   //TxHLT: TIMERx HARDWARE LIMIT CONTROL REGISTER
    // PSYNC CKPOL CKSYNC MODE[4:0]
    T4HLT = 0x00;  // MODE=0 => free runing software gate
    T4RST = 0x00;  // TxRSEL
    T4PR = 152; //            244; // PRx ;
    T4TMR = 0x00;  // TMRx= 0;
    // T4CKPS=0x00=> 1:1; T4OUTPS=0x03=> 1:4;   // ( FOSC/4) /4=> 4MHz  0,25?
    T4CON = 0x7F ; //  Prescaler =1/128  Poscaler=1/16 => 1/2048
    TMR4IF_bit = 0;  // Clearing IF flag.
    TMR4ON_bit=;
    TMR4IE_bit=;
    Count4=0; // non utilisé ici
}
 



et modifier l'aiguillage entrée WIN SMT1

Code : Tout sélectionner

 
   
//SMT1WIN=0;     //  sortie TMR0 500mS x 2 sur RC5 reliée à RC0
    SMT1WIN=7;  // TMR4_postscaled     996147.2 µS
 


:sifflotte: C'est (presque) tout bon ...car manque de précision de la durée 1 sec..
:!!: et on ne peut pas inserer un micro delay pour arriver à 1 000 000µS

Ultime solution :
utiliser un QUART 3,2768 MHz comme Quartz principal du MCU
le timer4 peut alors deliver pile poil 1 000 000 µsec

Code : Tout sélectionner

FOSC  3.2768MHz
T2CLKCON 
= 0x01;  // FOSC/4
T2PR    160    0xA0
Prescaler    6    64
Postscaler    7    8


j'en ai un de 32,768MHz dans mes tiroirs !
avec CLKR diviseur =64
T4PR=250, Prescaler=128 , Postscaler=16 => 1000 000 µS !
je vais donc pouvoir tester cela... à suivre

ou l'Oscillateur Secondaire SOSC avec un quartz Horloger
inconvenient :
* mobilise les 2 pins ..RC0 et RC1
* impose de ré-attribuer la pin PPS SMT1 entree Signal sur une autre pin !
* montage PIC avec 2 quartz ( ou alors repasser le PIC en FOSC Interne
avantage : precision du quartz horloger , on garde SMT1 Windows relié en interne avec timer4 bits output

apres quelques recherches :
là, j'en ai 2 petits qui ressemble à des quartz horlogers , un qui est noté GND2 ?? et un autre S373
c'est pas comme le "port salut " , pas d'autre marquage (comme la frequence!)
je vais les tester avec un CD4060 pour les verifier d'abord ...

Bref, c'est comme la cuisine ...
plein d'ingredients à melanger pour arriver à un resultat

A vos gamelles , les Chefs !
Aide toi, le ciel ou FantasPic t'aidera

Fréquencemètre divers technique
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#18 Message par Temps-x » mer. 17 nov. 2021 01:24

Bonsoir paulfjujo, et tout le forum,

paulfjujo a écrit :Source du message je vais les tester avec un CD4060 pour les verifier d'abord

Dans les année 80 j'avais construit un fréquencemètre qui pouvait aller de 0,1 Hz à 10 Mhz, la base de temps était piloté par un quartz de 32 768 Hz avec le fameux CD4060.

Ce soir, j'ai fait une mesure avec cette appareille sur un quartz à 4Mhz voilà ce que je trouve

Fréquencemètre Cmos.jpg


Le schéma pour ceux qui souhaite avoir plus de détail, :eek: c'est incroyable le nombre de composant qu'il fallait à l'époque.

Fréquencemètre 0.1 Hz à 10 Mhz (schéma).jpg


Une base de temps à fabriquer pour les futurs essais

Base de temps.gif


Vu la précision de l'appareille , pourquoi ne pas utiliser une base de temps à base du Cd4060 avec quartz de 32 768 Hz, de plus, on peut trouver ce quartz dans les montres

paulfjujo a écrit :Source du message Bref, c'est comme la cuisine ...
plein d’ingrédients à mélanger pour arriver à un résultat


:sifflotte: pour moi ça serait plutôt une catastrophe, car la cuisine c'est pas mon truc.... :-D


:eek: Quelle plat que va nous mijoté le Chef paulfjujo.

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Fréquencemètre divers technique
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#19 Message par paulfjujo » mer. 17 nov. 2021 13:52

bonjour,

ma version "Boite à quartz" de 1989 , révisée en 2011 ( rajout diviseur par 10 et commutateur de gamme)
une bascule en sortie permet d'avoir toujour des signaux carrés
et le transistor ..permet de supporter un court-circuit ..
de plus on pourrait aussi l'alimenter via 9 ou 12V si on veut de plus grande amplitude de signal.

le mode coups par coups ... aucun rebonds !

une commutation entrée diviseur 4060 sur oscillateur 400KHz
OU oscillateur EPSON 25MHz
est prévue pour la prochaine version ..

alimentation externe 9V via 78L05 ou directe par 3 piles AA 1,5V

c'est le genre d'outil simple et pratique à avoir sous la main.

Generateur-Quartz_4040_2011.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Fréquencemètre divers technique
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#20 Message par paulfjujo » dim. 21 nov. 2021 13:18

bonjour à tous,


:sifflotte: Version avec quartz horloger 32,768KHz sur Secondary Oscillator SOSC .. OK

quartz en RC0 et RC1 , encadré de 2x22pF
aiguillage SOSC sur entree timer 4 ... confguré pour sortir 1 seconde sur TMR4_Scaled output
sortie dirigée sur SMT1 Window input
L' entree SMT1 Signal est redirigée sur RC2 input (via PPS) ( car RC1 mobilisé par SOSC)

Capture mesure = registre SMT1CPR dans l'interrupt AIF (IVT_SMT1PRA)
=> frequence en HZ

tests
12 500 000 Hz -> mesure 12500300Hz erreur <0.03%
3 125 000 Hz => mesure 3125077Hz
25 000 Hz --> 25000
2500 Hz --> 2503
48.82Hz -> 48 ou 49

impossible de savoir si l'erreur est coté Quartz Horloger ou quartz EPSON
ou programmation ?
sachant qu' avec FOSC =64MHz une instruction ne mobilise que 62.5nS !
guère probable ..

gamme limité à 16 000 001 Hz avec Window de 1 sec ( Overlimit message si debordement SMT1)
sinon up to 32MHz avec window 0.5sec (Prescaler TMR4 de 8 au lieu de 16) et mesure = registre SMT1CPR <<1
...details sur ma page..

conclusion : fréquencemetre EASY avec SMT1

* On peut aussi gerer en interne , l'heure sans RTC , puisqu'on dispose du 1Hz...TMR4
* on peut aussi activer NCO pour disposer d'une frequenc de sortie connue
* De meme, on pourrait aussi commuter le mode de mesure SMT1 en mode Periodmetre avec mesure duty cycle en plus.
via une pin de selection de mode.
* un ecran LCD tactile pour gerer tout ça

:sifflotte: Bref, possible de faire une usine à gaz, avec ce PIC. ( si en plus on passe en 40Pins 18F47K42)
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage ASM »

Qui est en ligne

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