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

Прохожий написал:
Зачем другие файлики? Какие? Отлично!!! Спасибо :) Можно для пользы дела...
сообщений (10)

Yushik написал:
Предупрежу сразу я реализовать такое не смогу, у меня для этого знаний пока мало. Но...
сообщений (2)

 -> Помощь по математическим расчётам
15-Августа-2018 | 11:39:15 (Europe/Kiev)
Volume написал:
Здравствуйте. Подскажите, как применить команду "ADC (Сложение с переносом)" для PIC контроллера. FC5, компилятор BoostC....
сообщений (58)

 -> Макрос и программа для gLCD ILI9341
14-Августа-2018 | 10:48:14 (Europe/Kiev)
geliosss написал:
макрос обновлён ! Добавлена возможность вывода символов на экран с помощью ASCII кода(в том числе...
сообщений (5)

 -> Ввод пароля с двух кнопок
28-Июля-2018 | 23:50:28 (Europe/Kiev)
Vovan_G5 написал:
на ESP сделай режим настройки, ну типа зажал кнопочку, ресетнул и вошел в режим. Подымаешь...
сообщений (3)

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

Автор: 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

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

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


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