Это общий вопрос о том, как использовать 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);