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à ...


toujours prêt à aider les autres ...