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 ---
- 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 ---
Modérateur : Jérémy
Calcul Timer0 500mS 18F27K42 ..anomalie [closed]
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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 :
l'interrupt :
l'init TMR0
j'utilise SMRT1 compteur 24bits pour le chronometrage ( et aussi le timestamp de YAT terminal)
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à ...
j'ai posé le probleme aussi sur microchip forum ..
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
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();
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à ...
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.
Calcul Timer0 500mS 18F27K42 ..anomalie
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
Timer0 mode 16bits mais avec MFINTOSC
(16:34:58.159) Test TMR0 mode 16b (MFINTOSC 500Khz) 500mS , Nb Tics 249997 L2=499994 uS OK
reste à trouver pourquoi ça coince en TMR0 16 bits et FOSC/4
// (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;
}
reste à trouver pourquoi ça coince en TMR0 16 bits et FOSC/4 Calcul Timer0 500mS 18F27K42 ..anomalie
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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" ....
(
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 )
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Calcul Timer0 500mS 18F27K42 ..anomalie
Calcul Timer0 500mS 18F27K42 ..anomalie
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Satinas,
toujours prêt à aider les autres ...
dossier Pack dans le zip
+ fichier compilé .hex
résultat sur Terminal
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
toujours prêt à aider les autres ...
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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Calcul Timer0 500mS 18F27K42 ..anomalie
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 ?
Le prescaler marche bien, le postscaler pose problème.
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
Calcul Timer0 500mS 18F27K42 ..anomalie
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.
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

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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 !
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
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 !
Calcul Timer0 500mS 18F27K42 ..anomalie [closed]
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 ..
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;
}
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités

