Как использовать таймер PIC18f87k22 в качестве прерывания - PullRequest
0 голосов
/ 04 июля 2018

Это общий вопрос о том, как использовать timer0 на PIC.

Я пытаюсь построить систему управления двигателем постоянного тока, используя PIC18f87k22 и брелок arduino pro.

В моей программе есть функция с именем get_courant(). Эта функция отправляет запросы на брелок, читает полученный ответ (от uart) и сохраняет это значение в одной из моих глобальных переменных, тем самым актуализируя его.

То, что я хотел бы сделать, это использовать таймер следующим образом:

Если для get_courant() требуется более 10us, пропустите его и перейдите непосредственно к остальным инструкциям в моем главном.

Я знаю, что должен запустить таймер перед вызовом функции и каким-то образом прочитать значение таймера, чтобы решить, пропустить его или нет.

Однако, если я проверю значение таймера после , когда функция будет вызвана, то мое время можно будет изменить, если выполнение `get_courant () превысит 10us, и в этом случае таймер будет бесполезным.

Любой совет, который поможет мне понять, чего я хочу достичь (ИДК, если это было понятно с моим плохим английским)? Вот код get_courant(), если это может помочь:

int16_t get_courant()
{
 uint8_t courant1;
 uint8_t courant2;
 int16_t courant;

 if(EUSART1_is_tx_ready())
        {
            EUSART1_Write(0b00000001);
        }
 if(EUSART1_is_rx_ready())
        {
        courant1= EUSART1_Read(); 
        }

 if(EUSART1_is_tx_ready())
        {
            EUSART1_Write(0b00000010);
        }
 if(EUSART1_is_rx_ready())
        {
        courant2= EUSART1_Read(); 
        }
 if (CheckBit(courant1,7))
 {
    bit_clr(courant1,7);
    courant = (courant1 << 8) | courant2;
    courant = - courant;
 }
 else 
 {
    courant = (courant1 << 8) | courant2;
 }

 return courant;   
 }

и это часть моей основной функции, где я вызываю get_courant ():

while(!Stop_flag)
{   
    int i=0;
    do
    {


        Mesure_courant=get_courant();
        Tension_initiale = PID_Courant(Mesure_courant,Erreur_courant,Consigne_courant,Integrale_courant,Kp_courant,Ki_courant,Kd_courant,Wind_up_flag_courant);
        i++;
        Put_Rapport_Cyclique(Tension_initiale, Choix_Mode);

    } while(i<10);

1 Ответ

0 голосов
/ 05 июля 2018

в соответствии со страницей 193 таблицы данных PIC18f87k22 в 7-м бите регистра T0CON TMR0ON активирует таймер, чтобы считать или остановить его. Уважая это, вы можете установить, что TMR0ON в функции, которую вы хотите измерить время пребывания и проверить 10 мкс, и вы должны сбросить его после выхода из функции (через 10 мс или после 10 мс в любом случае), вы также должны убедиться после очистки TMR0ON. или перед установкой TMR0ON вы должны очистить старое значение, которое таймер удерживает, чтобы не повлиять на предыдущее измерение

...