ТАЙМЕР Logi c используется в микроконтроллере PIC15F1516 - PullRequest
0 голосов
/ 04 февраля 2020

Я использую микроконтроллер 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();
        }
    }
}
...