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
Expert- Messages : 2598
- Âge : 73
- 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
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();
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 ..
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
Expert- Messages : 2598
- Âge : 73
- 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
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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" ....
( 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 )
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
Expert- Messages : 2598
- Âge : 73
- 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
Expert- Messages : 2598
- Âge : 73
- 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
Expert- Messages : 2598
- Âge : 73
- 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 6 invités