Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Теперь посмотрим, как это может выглядеть в конкретной задаче. Предположим, что нам нужно с частотой 1 кГц переключать внешний вывод МК (для определенности пусть это будет вывод PD6). Чтобы частота переключения была 1 кГц, нам необходимо за один период переключить вывод дважды (от высокого к низкому уровню и обратно). Листинг 8.1 иллюстрирует, как это может выглядеть в реальности.

Листинг 8.1
.device AT90S2313 .include "2313def.inc" ;частота 4 Мгц
.equ K_div = 250 ;коэффициент деления Кдел .def rK_div = rl6 ;рабочая ячейка для Кдел
.def count = rl7 ;счетчик до 2
.def temp = rl8 /рабочая переменная
;===== прерывания
rjmp Reset /вектор сброса
.org $006 /по адресу $006 прерывание переполнения TimerO rjmp TIMO
/====== начало программы
.org $00С
TIMO: /прерывание TimerO ' inc count
sbrs count,0 /если счетчик нечетный, пропустить sbr temp,ОЬОЮООООО /иначе установить бит б sbrc count,0 /если счетчик четный, пропустить cbr temp, ОЬОЮООООО /иначе сбросить бит б out PortD,temp /вывести в порт D out TCNT0,rK_div /"заряжаем" таймер reti /конец прерывания таймера

Reset:
ldi temp,low(RAMEND) /загрузка указателя стека out SPL,temp
ldi temp,ОЬОЮООООО /шестой разряд порта D на выход
out DDRD, temp
clr count /очищаем
clr temp /регистры
ldi temp, (l«TOIE0) /разр. прерывания TimerO out TIMSK,temp
ldi rK_div,K_div /значение к. деления (250)
neg rK_div /256-K_div, т. к. счетчик суммирующий
out TCNT0,rK_div /"заряжаем" таймер
ldi temp, ОЬООООООЮ /TimerO включить 1:8
out TCCR0,temp
sei
Cykle:
rjmp cykle

Как и в примере из главы 5, следует учесть, что у модели ATtiny2313 прерываний больше, чем у "классической", поэтому эта программа без переделок будет работать только для AT90S2313, либо для ATtiny23l3 в режиме "совместимости" с Classic.
В этом примере у нас фактически получилась частота не 1, а 2 кГц, т. к. нам все равно требуется переключать вывод дважды за период. Если же за период выполнять только одно действие, то можно переписать прерывание (листинг 8.2).

Листинг 8.2
ldi count,
TIMO: ';прерывание TimerO dec count
brne exit ;на выход ldi count, 2 ;восстанавливаем счетчик <производим нужное действие> exit:
out TCNTO, rK_div ;"заряжаем" таймер reti ;конец прерывания таймера

При необходимости точной подстройки частоты по такому способу время, уходящее на вызов прерываний и выполнение команд, можно не учитывать, т. к. таймер считает независимо от работы ядра, и частота прерываний будет точно равна заданной. Но вот сама эта заданная частота отличается от точного значения 1 кГц на величину нестабильности "кварца", которая может достигать заметных величин. Для часового "кварца" типа РК206 32 768 Гц разброс номинальной частоты составляет порядка 2-10-5 (плюс еще не менее 410"5 ухода в интервале температур от -40 до +70 °С), для обычного в корпусе HC-49U она несколько меньше, и может составлять около 15-10-*.

Следовательно, номинальная частота "кварца" 4 МГц может оказаться в диапазоне от 3 999 940 до 4 ООО 060 Гц. Это усредненные величины, а реально ошибка может оказаться еще больше, т. к. на корпусе тип "кварца" чаще всего указывается не полностью, и определить допуск для купленного экземпляра, особенно импортного, нередко крайне затруднительно. Самые "плохие" кварцевые резонаторы дают разброс до 5 • 10 4.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru