Когда я делаю встроенных программ, я нахожу это чрезвычайно полезно добавлять комментарии объясняя именно то, что я намерен, когда я 'm устанавливает регистры конфигурации. Таким образом, мне не нужно возвращаться к листам данных, чтобы выяснить, что делает 0x01001010
, когда я пытаюсь получить код в следующий раз, когда мне нужно его изменить. (Просто не забудьте сохранить комментарии в синхронизации с изменениями).
Из того, что я могу расшифровать, похоже, что у вас настроены регистры PWM, но нет возможности изменить частоту в нужные промежутки времени. Есть несколько способов сделать это, вот 2 идеи:
- Вы можете прочитать таймер при запуске, добавить желаемый интервал, чтобы получить целевое время, и опросить таймер в цикле while. Когда таймер попадает в цель, установите новый рабочий цикл PWM и добавьте следующий интервал в целевое время. Это будет работать нормально, пока вам не придется начинать делать другие вещи в фоновом цикле.
- Вы можете установить счетчик таймера 0 на
0xFFFF-interval
и настроить его на прерывание при опрокидывании. В ISR установите новый рабочий цикл ШИМ и сбросьте таймер 0 на следующий интервал.
Один общий способ контроля времени во встроенных процессов выглядит следующим образом:
int flag=0;
void main()
{
setup_interrupt(); //schedule interrupt for desired time.
while (1)
{
if (flag)
{
update_something();
flag = 0;
}
}
Где flag
получить набор? В обработчик прерывания:
void InterruptHandler()
{
flag = 1;
acknowledge_interupt_reg = 0;
}
У вас есть все части в вашем примере, нужно просто поставить их в нужных местах. В вашем случае update_something()
обновит PWM. Логика выглядела бы так: «Если она включена, выключите ее, а затем включите ее. Обновите тон (рабочий цикл), если хотите»
В основной петле во время работы не должно быть необходимости в дополнительных задержках или паузах. Цель состоит в том, что он просто работает снова и снова, ожидая чего-то сделать. Если программе нужно сделать что-то другое с другой скоростью, вы можете добавить еще один флаг, который запускается полностью независимо, а время выполнения этих двух задач не будет мешать друг другу.
Как насчет добавления «PIC18F» в качестве метки? – Johan