Последние сообщения форума

 -> Как проверить SPI .
24-Мая-2019 | 20:46:24 (Europe/Kiev)
alek s написал:
Колямба привет. Как сам? Бабуля здравствуй, прости их, ибо они сами не ведают чего себя...
сообщений (13)

 -> FLOWCODE 8 ищем баги
18-Мая-2019 | 14:02:18 (Europe/Kiev)
livrena написал:
рабочий пример таймера WDT для Atmega328p. ( новые чипы ) (Была проблема, контроллер уходил в...
сообщений (31)

 -> пользовательское прерывание
13-Мая-2019 | 20:27:13 (Europe/Kiev)
krian написал:
Ну вобщем все я понял. Друг надоумил вспомнить Найквиста и все стало на свои места....
сообщений (24)

 -> Прошить PIC изнутри
2-Мая-2019 | 23:44:02 (Europe/Kiev)
Coder_83 написал:
[quote="щербатый">И рано, или поздно. Ты поймешь. Как обезьяна менять одни цифры на другие. Нерационально, и...
сообщений (11)

Yushik написал:
Здравствуйте коллеги пробовал я подключать ардуиновские библиотеки стандартной функцией #include "<путь к h файлу>" во...
сообщений (8)

Наши партнеры

Автор: mim

Частенько возникает задача (хотя ее можно решить и на основе других таймеров), которая требует установить, на основе Таймера_0 (tmr0), точного (целого) числа прерываний (или частот отличных от возможностей предделителя).

Рассмотрим 8-ми разрядный таймер-счетчик tmr0, если с ним разобраться во всех нюансах, то с остальными таймерами проблем уже не будет.
Итак, регистр управления таймером tmr0 называется option_reg.
В Hi-tech его название немного сократили до OPTION, но это одно и тоже.

Вообще, узнать, как названы регистры в компиляторе можно открыв подключаемый библиотечный файл для своего контроллера. Для этого заходим в директорию, где у вас установлен FC, и ищем папку "include" в ней располагаются все библиотечные файлы. Далее открываем знакомый нам файл ххх.h и изучаем его.

В архиве приведено описание таймера и приложен файл в формате Excel, в котором представлена модель таймера, а также дан исходный текст фрагментов программ на Си и указаны регистры, связанные с работой таймера (текст можно копировать в исходник FC для других задач). При запуске файла в Excel разрешите выполнение макросов (вирусов нет).

TMR0.rar

Рассмотрим задачу, которая заключается в установке определенного значения частоты прерывания на основе Таймера_0 (tmr0) методом предзагрузки регистра tmr0. Предзагрузка – это предварительная запись в регистр таймера числа, которое определяет начальное значение регистра таймера. Начальное значение регистра таймера – это значение, от которого начинается отсчет временного интервала.

Обычно в режиме прерывания регистра tmr0 отсчитывает свое значение от 0 до 255 (8 бит). Если в регистр tmr0 предварительно занести число, то отсчет будет начинаться от занесенного значения до 255, тем самым время счета будет уменьшено (уменьшится период), а значит, увеличится частота прерывания. Предзагрузку tmr0 нужно делать в прерывании, и как можно раньше (хотя все это зависит от задачи и правильного понимания что делаешь).

Ниже приведен простенький пример.

tmr_0.rar

Пусть есть необходимость установить частоту прерывания равную 12,5 кГц. Получить такую частоту, если МК тактируется частотой 8 МГц простым делением (установкой предделителя) не получится.
Можно провести расчеты предзагрузочного значения, а можно запустить программу «PIC_Timer_Calculator», существуют разные версии написанные разными авторами. Устанавливаем частоту тактирования МК, устанавливаем предделитель 1:1 и передвигаем движок TMR0 Preload до тех пор, пока не поймаем нужную частоту прерывания (это будет 96). Пишем в программу строчку tmr0=96;.

Запустите пример и посмотрите на значение частоты. Значение частоты не будет соответствовать расчетному. Так и должно быть. Это происходит из-за задержек, связанных с выполнением участка программы по переходу на подпрограмму прерывания. Как это выглядит? После того как tmr0 досчитал до 255 в следующем цикле будет выполнен переход на прерывание, таймер при этом начнет отсчет с нуля и к тому моменту, когда в подпрограмме прерывания написана строчка tmr0=96; будет уже насчитано некоторое количество тиков таймера (это проверка флага, время перехода на подпрограмму, блокировка прерывания и т.д. смотрите файл ассемблера). Что бы компенсировать это время нужно знать, сколько команд (циклов) выполнено к моменту загрузки таймера. Нужно подсчитать команды в ассемблере – это не очень удобно.

Запускаем пример в Протеусе и смотрим на показания частотомера – 10638 (10639) Гц. В калькуляторе перемещаем движок ISR Overhead до тех пор, пока калькулятор не покажет частоту равную 10638 с дробными числами (поэтому Протеус и прыгает 10638 или 10639). Значение ISR Overhead будет равно 28 (шаг влево или вправо будет сильно отличаться от показаний искомой частоты). Таким образом, в tmr0 нужно записывать число 96+28=124. Смотрите пример ниже. Задача решена.

tmr0+.rar

Тема на форуме

Добавить комментарий


Защитный код
Обновить