Я использую микроконтроллер PIC15F1516 и занимаюсь реверс-инжинирингом, чтобы понять код без какой-либо документации. Мне не удалось понять использование таймера и логики c, реализованных в main. c
- Timer0RegValue = 64536.0
- Prescalar = 1
- Задержка = (( 65536-Timer0RegValue) * (Prescalar * 4)) / Fos c = 0,001 Se c
Я понимаю, что в основной функции таймер обновляется со значением 1mSe c, однако , Я не смог получить через сколько времени будет выполнен ProcessTenthSe c () и ProcessTwelfthSe c ()?
void TMR1_Initialize(void)
{
//Set the Timer to the options selected in the GUI
//T1CKPS 1:1; T1OSCEN disabled; nT1SYNC synchronize; TMR1CS FOSC/4; TMR1ON disabled;
T1CON = 0x00;
//T1GSS T1G; TMR1GE disabled; T1GTM disabled; T1GPOL low; T1GGO_nDONE done; T1GSPM disabled;
T1GCON = 0x00;
//TMR1H 252;
TMR1H = 0xFC;
//TMR1L 24;
TMR1L = 0x18;
// Load the TMR value to reload variable
// 6396= 0xFC18
// Delay = ( (65536-Timer0RegValue)*(Prescalar*4) ) / Fosc;
// Delay = ( (65536-6396)*(1*4) ) / 500000;
// Delay =
timer1ReloadVal=(TMR1H << 8) | TMR1L;
// Clearing IF flag before enabling the interrupt.
PIR1bits.TMR1IF = 0;
// Enabling TMR1 interrupt.
//PIE1bits.TMR1IE = 1;
// Set Default Interrupt Handler
//TMR1_SetInterruptHandler(TMR1_DefaultInterruptHandler);
// Start TMR1
//TMR1_StartTimer();
}
#define TENTH_SEC_RELOAD 156
#define TWELFTH_SEC_RELOAD 130
void main(void)
{
// initialize the device
SYSTEM_Initialize();
// When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
// Use the following macros to:
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();
byTenthSec = TENTH_SEC_RELOAD
byTwelfthSec = TWELFTH_SEC_RELOAD
while (1)
{
if(PIR1bits.TMR1IF)
{
T1CONbits.TMR1ON = 0;
//TMR1H 252;
TMR1H = 0xFC;
//TMR1L 24;
TMR1L = 0x18;
T1CONbits.TMR1ON = 1;
PIR1bits.TMR1IF = 0;
if(--byTenthSec == 0)
{
byTenthSec = TENTH_SEC_RELOAD;
ProcessTenthSec();
}
if(--byTwelfthSec == 0)
{
if(byTwelfthFix--)
{
byTwelfthSec = TWELFTH_SEC_RELOAD ;
}
else
{
byTwelfthFix = 3;
byTwelfthSec = TWELFTH_SEC_RELOAD + 1;
}
ProcessTwelfthSec();
}
}
//if an ADC conversion is in progress do a low priority task
if(uHiPriTasks.HighPriority)
{
if(uHiPriTasks.One)
Function1();
else if(uHiPriTasks.Two)
Function2();
else if(uHiPriTasks.Three)
Function3();
else if(uHiPriTasks.four)
Function4();
else if(uHiPriTasks.five)
Function4();
}
if(uWatchdog.byWatchdog == WDT_ALL_TASKS_COMPLETE)
{
//reset the watchdog task structure
uWatchdog.byWatchdog = 0;
//restart the watchdog timer
CLRWDT();
}
}
}