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

Calcul Timer0 500mS 18F27K42 ..anomalie [closed]
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » jeu. 29 juin 2023 17:52

bonsoir,

J'utilise une feuille excel pour le paramtrage du timer0 ,
qui jusqu'alors me paraissait OK
Hors je n'arrive pas à obtenir mon delay de 500mS avec ce paramétrage

:sifflotte: il y a un probleme sur ma feuille excel , ou entre mes neurones et le clavier .. ou ?

CS=0b010 => FOSC/4 64/4=16MHz => T=0.0625µS
Prescaler= 8 => div 1/256
Postscaler=0 => 1/1
TMR0= 0x85EE => 34286
soit duree = (65536-34286)* 0.0625 * 256 *1 => 500 000µS

mais j'obtiens :
(17:21:02.000) Init Compteur 24 bits SMT1, avec choix clock 4=> 500KHz tick=2uS
(17:21:02.000)
(17:21:02.000) Test Timer0 500mS interrupt
(17:21:02.978)
(17:21:02.978) Test TMR0 500mS , Nb Tics 490000L2=980000 uS
(17:21:03.012)


l'interrupt :

Code : Tout sélectionner


void __interrupt
(irq(IRQ_TMR0),high_priority)TMR0_ISR(void)
{
        
    Cpt0
++ ;       // x 500ms avec MFINTFosc=500Khz
    Drapeaux.Tmr0_Elapsed=1;
    TMR0H   = 0x85; // 34236 
    TMR0L   = 0xEE; 
    PIR3bits
.TMR0IF = 0;
 }


l'init TMR0

Code : Tout sélectionner

void Init_Timer0_500mS(void)  // 0.5sec  
{
T0CON0=0;
T0CON0bits.EN=0;
T0CON0bits.MD16=1;
//CS[2:0]:Timer0 Clock Source Select bits  
//// 010 = FOSC/4    
T0CON1bits.CS2=0;
T0CON1bits.CS1=1;
T0CON1bits.CS0=0;
//0= The input to the TMR0 counter is synchronized to FOSC/4
T0CON1bits.ASYNC=1;
// Postscaler=7 => 1/8
T0CON0bits.OUTPS3=0; 
T0CON0bits
.OUTPS2=1;
T0CON0bits.OUTPS1=1;
T0CON0bits.OUTPS0=1;
// CKPS[3:0]: Prescaler =5 => Rate Select bit => div  1/32
T0CON1bits.CKPS3=0; 
T0CON1bits
.CKPS2=1;
T0CON1bits.CKPS1=0; 
T0CON1bits
.CKPS0=1; 
    
//  complement=65536-34286=31250    
    // 0.0625 * 31250 * 8 * 32 = 500 000µS
TMR0H   = 0x85; // 34286 
TMR0L   = 0xEE;  
Cpt0
=0;
Drapeaux.Tmr0_Elapsed=0;
PIR3bits.TMR0IF = 0;
PIE3bits.TMR0IE=1; // en mode interrupt par defaut
T0CON0bits.EN=1;
}


j'utilise SMRT1 compteur 24bits pour le chronometrage ( et aussi le timestamp de YAT terminal)

Code : Tout sélectionner


    CPrint
("\r\n Init Compteur 24 bits SMT1, avec choix clock 4=> 500KHz  tick=2uS\r\n");
    SMT1_Init(4);  // 500Khz  clock base de temps du compteur 24bits SMRT1
    
    Interrupt_Init
();
    GIE=1; 
      CPrint
("\r\n Test Timer0  500mS interrupt\r\n");
     Init_Timer0_500mS();
 
    SMT1_Measure
=0;   // RAZ comptage
    ST=&SMT1_Measure; // pointeur sur le resultat
    SMT1STATbits.RST=1; // Reset  compteur
    SMT1CON1bits.SMT1GO=1; // START 
    
     while
(Drapeaux.Tmr0_Elapsed==0);
     TMR0IE=0;
     TMR0IF=0;
             
    
//__delay_ms(500);       // delai utilisé pour verifier le comptage   
     
    SMT1CON1bits
.SMT1GO=0; // STOP
    *(ST)=SMT1TMRL;   
    
*(ST+1)=SMT1TMRH;
    *(ST+2)=SMT1TMRU;
    *(ST+3)=0;
    L1=SMT1_Measure; // mesure stockée dans L1 (entier long de 32 bits)
    L2=L1<<1;    // à 500Khz tick=2µS => multiplie par 2  la valeur !!  ,Nota :avec clock  31,25KHz : L1>>5 par 32
 
    sprintf
(txt,"\r\n Test TMR0 500mS , Nb Tics %lu L2=%lu uS\r\n",L1,L2); 
     Print
(txt);// affiche valeur brute et valeur en µS
    CRLF1();



oops Nota : ma version TMR0_10sec ,utilisant 500KHz est OK avec cette feuille excel !
CS=0b101 => MFINTOSC Prescaler=7 => 1/128 Postscaler=0 => 1/1 TMR0=24436 => 0x6744
(17:06:12.602) Test Timer0 10sec interrupt
(17:06:22.577)
(17:06:22.577) Test TMR0 10sec , Nb Tics 5004797 L2=10009594 uS
(17:06:22.614)

je n'utilise pas le postscaler dans ce cas là ...


18F47K42_TMR0.zip


:sifflotte: j'ai posé le probleme aussi sur microchip forum ..
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le jeu. 6 juil. 2023 14:32, modifié 1 fois.
Aide toi, le ciel ou FantasPic t'aidera

Calcul Timer0 500mS 18F27K42 ..anomalie
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » sam. 1 juil. 2023 16:44

un test avec TMR0 en mode 8 bit et FOSC/4 pour 500mS ... est OK !
// (16:00:42.613) Test TMR0 mode 8b (FOSC/4=16MHz) 500mS , Nb Tics 249854 L2=499708 uS

Code : Tout sélectionner



void Init_Timer0_8b_500mS
(void)  // 0.5sec  
{
T0CON0=0;
T0CON0bits.EN=0;
T0CON0bits.[b]MD16=0[/b];
//CS[2:0]:Timer0 Clock Source Select bits  
//[b] 010 = FOSC/4 [/b]   ,     101 = MFINTOSC (500 kHz)
T0CON1bits.CS2=0;
T0CON1bits.CS1=1;
T0CON1bits.CS0=0;
//0= The input to the TMR0 counter is synchronized to FOSC/4
T0CON1bits.ASYNC=1;
// Postscaler=0 => 1/1
T0CON0bits.OUTPS3=0; 
T0CON0bits
.OUTPS2=0;
T0CON0bits.OUTPS1=0;
T0CON0bits.OUTPS0=0;
// CKPS[3:0]: Prescaler =15 => Rate Select bit => div  1/32768
T0CON1bits.CKPS3=1; 
T0CON1bits
.CKPS2=1;
T0CON1bits.CKPS1=1; 
T0CON1bits
.CKPS0=1; 
   
    
// 0.0625* 31250 × 8 *32 = 500 000µS
TMR0H   = 243;  //  TMR0 +1 =243+1 =244
TMR0L   = 0; 
// 0.0625* 243* 32768 × 1 = 499 712µS
Cpt0=0;
Drapeaux.Tmr0_Elapsed=0;
PIR3bits.TMR0IF = 0;
PIE3bits.TMR0IE=1; // en mode interrupt par defaut
T0CON0bits.EN=1;
}


Timer0 mode 16bits mais avec MFINTOSC
(16:34:58.159) Test TMR0 mode 16b (MFINTOSC 500Khz) 500mS , Nb Tics 249997 L2=499994 uS OK

Code : Tout sélectionner



void Init_Timer0_16b_500mS
(void)  // 0.5sec  
{
T0CON0=0;
T0CON0bits.EN=0;
T0CON0bits.[b]MD16=1[/b];
//CS[2:0]:Timer0 Clock Source Select bits  
//[b]101 [/b]= MFINTOSC (500 kHz)
T0CON1bits.CS2=1;
T0CON1bits.CS1=0;
T0CON1bits.CS0=1;
//0= The input to the TMR0 counter is synchronized to FOSC/4
T0CON1bits.ASYNC=1;
// Postscaler=0 => 1/1
T0CON0bits.OUTPS3=0; 
T0CON0bits
.OUTPS2=0;
T0CON0bits.OUTPS1=0;
T0CON0bits.OUTPS0=0;
// CKPS[3:0]: Prescaler =3 => Rate Select bit => div  1/8
T0CON1bits.CKPS3=0; 
T0CON1bits
.CKPS2=0;
T0CON1bits.CKPS1=1; 
T0CON1bits
.CKPS0=1; 
    
//  complement=65536-34286=31250    
    // 2 * 31250 × 8 *1  = 500 000µS
TMR0H   = 0x85; // 34286 
TMR0L   = 0xEE;  
Cpt0
=0;
Drapeaux.Tmr0_Elapsed=0;
PIR3bits.TMR0IF = 0;
PIE3bits.TMR0IE=1; // en mode interrupt par defaut
T0CON0bits.EN=1;
}


oops reste à trouver pourquoi ça coince en TMR0 16 bits et FOSC/4
Aide toi, le ciel ou FantasPic t'aidera

Calcul Timer0 500mS 18F27K42 ..anomalie
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » lun. 3 juil. 2023 11:43

:eek: Personne pour m'aiguiller sur ce cas ?

meme Microchip forum tourne autour des warning ..au lieu de se polariser sur le probleme TMR0
Pas de réponse concrete à ce jour ..
un warning n'est pas une "error" ....
( oops même si j'admets quils faut quand meme les surveiller !)
On a quand meme le droit d'imposer ce que l'on veut à un compilateur !
ex: warning si usage de char non signé ! ..moi je veux voir les caracteres >127 !
... compilo qui devient un peu trop intrusif !

nota : 500mS , sans l'usage du postscaler ..c'est OK !
mais Why ?
le post scaler est sensé être actif en mode Timer .(.. et non en PWM )

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

Calcul Timer0 500mS 18F27K42 ..anomalie
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#4 Message par satinas » lun. 3 juil. 2023 13:37

Bonjour,
Il faut un zip du projet xc8 avec les fichiers source et hex, et qui fait apparaître le problème, sans rien y toucher. Avec si possible un toggle pin dans l'ISR pour visualiser les 500ms sur l'oscillo.

Calcul Timer0 500mS 18F27K42 ..anomalie
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » mar. 4 juil. 2023 14:24

bonjour Satinas,


:+1: toujours prêt à aider les autres ... Merci !

dossier Pack dans le zip
+ fichier compilé .hex

résultat sur Terminal
(14:16:40.535) Presentation :
(14:16:40.553) PIC18F27K42 version de test Timer0
(14:16:40.553) Directory :C:\MPLABX_Projects\_18F27K42_Test_Timer0_2023.X
(14:16:40.553) Project : _18F27K42_Test_Timer0_2023
(14:16:40.553) Source : main.c SMT1_Chrno.c,UART1_Function.c_2023-0630
(14:16:40.553) Config Internal Fosc 64MHz
(14:16:40.576) Autres : config.h, Presenation.h, SMT1_chrono.h ,UART1_Functions.h
(14:16:40.576) Eeprom : no Eeprom
(14:16:40.576) RC7=RX UART RC6=TX UART1 RA4=Led rouge
(14:16:40.576) RBxx not used
(14:16:40.576)
(14:16:40.576) Compile le Jul 4 2023 a 14:14:27 UTC
(14:16:40.576) avec version XC8 : 2360
(14:16:40.590)
(14:16:40.590) 2 leds eteintes (led tirées au +Vcc !)
(14:16:44.579)
(14:16:44.579) Init Compteur 24 bits SMT1, avec choix clock 4=> 500KHz tick=2uS
(14:16:44.609)
(14:16:44.609)
(14:16:44.609) Test Timer0 en mode 16b 500mS interrupt
(14:16:44.609) Led verte activée via interrupt en fin de delay TMR0 !
(14:16:45.580)
(14:16:45.580) Test TMR0 mode 16b 500mS , Nb Tics 490000 L2=980000 uS
(14:16:45.580)
(14:16:45.580)
(14:16:45.580)
(14:16:45.580) .. fin de test ..


bad result L2= 980 000 uS
led verte tirée au +Vcc via 2,7K => etat 1=eteinte
j'ai mis Led_verte=0 dans l'interrup TMR0 ..donc s'allume en fin de delay

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

Calcul Timer0 500mS 18F27K42 ..anomalie
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#6 Message par satinas » mar. 4 juil. 2023 16:15

C'est étrange, le programme simple qui suit est déjà dans les choux.
La tempo avec prescaler 256 et postscaler 1 donne bien 500ms, mesurée à l'oscillo.
En passant à un postscaler 2, j'obtiens 1600ms au lieu de 1000ms, késako ?

Code : Tout sélectionner

__at(0x08) void __interrupt(high_priority) highIsr(void)
{
  TMR0IF = 0;           // timer0 flag
  LATC2 ^= 1;
  TMR0H = 34286/256;    // 34286 = 65536-31250
  TMR0L = 34286%256;    // 500ms (62,5 * 256 * 1 * 31250)
}

void main(void)
{
  ANSELC = 0x00;        // pins numériques
  TRISC2 = 0;           // led
  T0CON1 = 0x48;        // timer0 FOSC/4, prescaler 256
  T0CON0 = 0x90;        // timer0 on, 16 bits, postscaler 1
  TMR0IE = 1;
  GIE    = 1;
  while (1) { } 
}

Le prescaler marche bien, le postscaler pose problème.

Calcul Timer0 500mS 18F27K42 ..anomalie
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#7 Message par satinas » mar. 4 juil. 2023 17:21

Dans ton programme, tu fais à un moment PIE3bits.TMR0IE=0;
je l'ai enlevé pour regarder à l'oscillo en modifiant les valeurs des prescaler/postscaler, et je retrouve tes résultats et les miens.
256 et 1 -> 500ms ok
256 et 2 -> ~1600ms au lieu de 1000ms
032 et 8 -> ~1000ms au lieu de 500ms

Calcul Timer0 500mS 18F27K42 ..anomalie
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#8 Message par satinas » mar. 4 juil. 2023 17:38

My god, c'est normal, non ? Comment marche le postscaler ?
Si tu mets le postscaler à 2, après le premier débordement le timer repart à 0 au lieu de 34286, puisque l'interruption se produit que tous les 2 débordements ! Cherche cerveau d'occase à acheter :)
C'est pas pour rien qu'il y a des timers avec registre PR.

Calcul Timer0 500mS 18F27K42 ..anomalie
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » mar. 4 juil. 2023 20:32

bonsoir Satinas,

merçi pour cet éclairage ....

... Microchip Forum n'a meme pas daigner me repondre ... ce sont des "suffisants"

Je n'ai pas vu de registre PR 16 bits , donc
il n'y a qu'en mode 8 bits ... où on a ce mode de fonctionnement , si je ne me trompe pas .
auto reload de PRx

oops On ne peut donc pas se servir du Postscaler en 16 bits !
bien que TMROIF soit placé apres le postscaler ..
:!!: C'est NUL !

il ne servait deja pas (directement) en mode PWM ..

j'utiliserai donc un timer 8 bits pour mes 500mS
et je garde le timer0 en 16b pour 10sec avec (Postscaler=000 => 1/1)

on a heureusement un large choix pour le clock timer ...

SMRT1 peut aussi servir de timer 24 bits !
Aide toi, le ciel ou FantasPic t'aidera

Calcul Timer0 500mS 18F27K42 ..anomalie [closed]
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » jeu. 6 juil. 2023 14:49

bonjour,


Suite à une réponse de
https://forum.microchip.com/s/topic/a5C ... A0/t391100
Posted: 5 Jul 2023 - 10:01 PM(New)(Reply to #8) by NorthGuy
confirmant cette possibilité d'usage du postscaler ...
j'utilise cette formule excel
=MCU_Cycle *Pre_div * ( (Post_div-1) *65536 + 65536-Valeur_TMR0 ) => 500 000µS
avec choix : FOSC/4=16MHz =>MCU_Cycle=0.0625µS
Prescaler = 4
Postcaler = 7
TMRO init=24288

(14:07:33.722) Test Timer0 en mode 16b 500mS (with FOSC/4=16MHz Prescale= 4 Postscaler=7 ),interrupt armée
(14:07:33.722) Led verte activée via interrupt en fin de delay TMR0 !
(14:07:34.186)
(14:07:34.186) Test TMR0 mode 16b 500mS , Nb Tics 249998 L2=499996 uS
(14:07:34.226)
(14:07:34.226)
(14:07:34.226)
(14:07:34.226) .. fin de test ..

Code : Tout sélectionner


void Init_Timer0_16b_500mS
()
{
T0CON0=0;
T0CON0bits.EN=0;
T0CON0bits.MD16=1;
//CS[2:0]:Timer0 Clock Source Select bits  
//// 010 = FOSC/4   
T0CON1bits.CS2=0;
T0CON1bits.CS1=1;
T0CON1bits.CS0=0;
//0= The input to the TMR0 counter is synchronized to FOSC/4
T0CON1bits.ASYNC=0;
// Postscaler=7 => 1/8
T0CON0bits.OUTPS3=0;
T0CON0bits.OUTPS2=1;
T0CON0bits.OUTPS1=1;
T0CON0bits.OUTPS0=1;
// CKPS[3:0]: Prescaler =4 => Rate Select bit => div  1/16
T0CON1bits.CKPS3=0;
T0CON1bits.CKPS2=1;
T0CON1bits.CKPS1=0;
T0CON1bits.CKPS0=0;
TMR0H = 0x5E; // 24288 
TMR0L = 0xE0;
 //  complement=65536-24288=41248 => 0x5EE0    
// =MCU_Cycle*Pre_div*(   (Post_div-1) *65536   +  65536-Valeur_TMR0 )=> 500 000µS
Cpt0=0;
Drapeaux.Tmr0_Elapsed=0;
PIR3bits.TMR0IF = 0;
PIE3bits.TMR0IE=1; // en mode interrupt par defaut
T0CON0bits.EN=1;
}


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


Retourner vers « Langage C »

Qui est en ligne

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