- •Кузнецов в.Н., Лисютченков с.Н. Цифровые и микропроцессорные устройства
- •Часть 3
- •220301– Автоматизация технологических процессов и производств
- •Содержание
- •Предисловие
- •Лабораторная работа №1 «Освоение среды разработки vmlab 3.12»
- •1.2 Теоретическое введение
- •1.2.1 Общие сведения
- •1.2.2 Среда разработки vmlab
- •1.2.3 Описание пользовательского интерфейса
- •1.2.4 Команды меню
- •Save All − сохранить все файлы Save As − сохранить файл текущего окна под новым именем
- •1.2.5 Доступные окна
- •1.2.6 Аппаратные компоненты
- •1.2.7 Формат программы на ассемблере
- •1.3 Порядок выполнения лабораторной работы
- •1.3.1 Создание нового проекта
- •1.3.2 Редактирование файла ассемблера
- •1.3.3 Ассемблирование и выполнение программы
- •1.4 Задание на лабораторную работу
- •1.5 Контрольные вопросы
- •1.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №2 «Изучение микроконтроллера aTmega128 и основы программирования»
- •2.2.1 Общие сведения о микроконтроллере aTmega128
- •Регистры ввода/вывода (рвв)
- •Организация памяти
- •Внешние прерывания
- •2.2.9 Директивы транслятора ассемблера
- •2.2.10 Выражения
- •2.2.11 Операнды
- •2.2.12 Функции
- •2.2.13 Операции
- •2.3 Порядок выполнения лабораторной работы
- •2.4 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •2.5 Контрольные вопросы
- •2.6 Содержание отчета по лабораторной работе
- •3.2.2 Адресация в микроконтроллере
- •3.2.3 Команды пересылки данных
- •Mov Rd,Rr(пересылка между рон) – копирует содержимое регистра Rrв регистр Rd. Регистр-источник Rrне изменяется.
- •3.2.4 Команды передачи управления
- •3.3 Порядок выполнения лабораторной работы
- •3.4 Задание на лабораторную работу
- •3.5 Контрольные вопросы
- •3.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №4 «Выполнение арифметических операций»
- •4.2 Теоретическое введение
- •4.3 Порядок выполнения лабораторной работы
- •4.4 Задание на лабораторную работу
- •4.5 Контрольные вопросы
- •4.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №5 «Изучение логических операций»
- •5.2 Теоретическое введение
- •Управление энергопотреблением и режимы сна.
- •5.3 Порядок выполнения лабораторной работы
- •5.4 Задания на лабораторную работу
- •5.5 Контрольные вопросы
- •5.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №6 «Изучение портов ввода/вывода и их программирование»
- •6.2 Теоретическое введение
- •6.2.1 Общие сведения
- •6.2.2 Порты в качестве универсального цифрового ввода-вывода
- •6.2.3 Настройка выводов
- •6.2.4 Неподключенные выводы
- •6.2.5 Альтернативные функции порта
- •6.2.5.1 Альтернативные функции порта a
- •6.2.5.2 Альтернативные функции порта в
- •6.2.5.3 Альтернативные функции порта c
- •6.2.5.4 Альтернативные функции порта d.
- •6.2.5.5 Альтернативные функции порта e
- •6.2.5.6 Альтернативные функции порта f
- •6.2.5.1 Альтернативные функции порта g
- •6.2.6 Описание регистров портов ввода-вывода
- •6.2.7 Обращение к портам ввода/вывода
- •6.3 Порядок выполнения лабораторной работы на симуляторе
- •6.4 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •Контрольные вопросы
- •6.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №7.
- •7.2.1 Общие сведения о Память
- •7.2.2 Статическое озу памяти данных
- •7.2.3 Организация памяти
- •7.2.4 Запоминающее устройство sram
- •7.2.5 Временная диаграмма доступа к памяти
- •7.3 Память данных на эсппзу
- •7.3.1 Чтение и запись эсппзу
- •7.3.2 Адресные регистры эсппзу
- •Порядок выполнения
- •7.4 Память ввода-вывода
- •Порядок выполнения
- •Порядок выполнения
- •7.5 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •7.6 Контрольные вопросы
- •7.7 Содержание отчета по лабораторной работе
- •Генерация тактовых импульсов
- •Инициализация усапп
- •8.2.2 Передача данных - Передатчик усапп
- •8.2.3 Прием данных - Приемник усапп
- •Асинхронный прием данных
- •8.2.4 Многопроцессорный режим связи
- •8.2.5 Описание регистров усапп
- •8.2.6 Последовательный периферийный интерфейс - spi
- •8.2.7 Функционирование вывода ss
- •8.2.8 Связь двух мк
- •8.3 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •8.6 Контрольные вопросы
- •Лабораторная работа №9 «Изучение принципа работы таймеров/счетчиков микроконтроллера»
- •9.2 Теоретическое введение
- •9.2.1 Общие сведения о таймерах/счетчиках
- •9.2.2 Назначение выводов таймеров/счетчиков
- •9.2.5 Выбор источника тактового сигнала
- •9.2.6 Режим таймера
- •9.2.7 Функция захвата (Capture)
- •9.2.8 Функция сравнения (Compare)
- •9.2.9 Режим шим
- •9.2.10 Сторожевой таймер
- •9.2.11 Общие сведения о работе клавиатуры
- •9.2.12 Ввод кода нажатой клавиши
- •9.2.13 Сканирование и идентификация
- •Листинг проектного файла №9
- •На эмуляторе
- •9.4 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •9.5 Контрольные вопросы
- •10.2.2 Функционирование модуля ацп
- •10.2.3 Принцип действия
- •10.2.4 Каналы дифференциального усиления
- •10.2.5 Изменение канала или выбор опорного источника
- •10.2.6 Входные каналы ацп
- •10.2.7 Источник опорного напряжения ацп
- •10.2.8 Повышение точности преобразования
- •10.2.9 Методы компенсации смещения
- •10.2.10 Описание получения результата преобразования
- •10.2.5 Параметры ацп
- •10.2 Порядок выполнения работы на симуляторе
- •На эмуляторе
- •10.3 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •10.4 Контрольные вопросы
- •Приложение
- •Список литературы
9.2.11 Общие сведения о работе клавиатуры
Во многих применениях МК работают автономно по заранее заданной программе без вмешательства человека. Наряду с этим существуют интерактивные МК-системы, включающие в контур управления человека-оператора. Простейший пример интерактивной управляющей системы − обслуживаемый МК, требующий ввода оперативной информации и ее отображения.
В качестве устройств ввода/вывода информации наиболее широкое распространение в МК-системах получил цифровые, алфавитно-цифровые и специальные клавиатуры.
На плате эмулятора применена некодирующая (матричная) клавиатура, которая представляет собой простую матрицу двоичных переключателей (размерностью 3 на 4, т.е. на двенадцать клавиш), включенных на пересечении строк и колонок матрицы. Идентификация (кодирование) нажатой клавиши в клавиатуре выполняется программой.
9.2.12 Ввод кода нажатой клавиши
Для обслуживания клавиатуры в МК-системе используется процедура ввода кода нажатой клавиши.
Процедура осуществляет циклический опрос клавиатуры до тех пор, пока не будет нажата клавиша. Будучи встроена в основную программу, она блокирует процесс выполнения команд основной программы и вспомогательных процедур на время ожидания нажатия клавиши. После нажатия какой-либо клавиши (кроме клавиши S10 − “Сброс”) клавиатуры управление будет передано на другие процедуры.
Рассмотрим, как осуществляется процедура ввода информации с матричной клавиатуры 3x4, включающей 10 цифровых клавиш (0 − 9) и 1 управляющую (клавиша “Ввод”). Способ подключения клавиатуры к МК представлен на рисунке 9.9.
Рис. 9.9Схема электрическая принципиальная подключения клавиатуры к МК
Подключение клавиатуры организовано через порт E микроконтроллера. Линии PE0 − PE3 порта E используются для сканирования, а линии PE4 − PE6 того же порта − для опроса матрицы клавиш. Каждая клавиша в такой матрице имеет свой номер, соответствующий ее местоположению. Клавиша S10 (“Сброс”) не сканируется, а S12 (“Ввод”) имеет свой номер, но по функциональному назначению отличается от цифровых клавиш – она служит для завершения процедуры ввода цифры. Диоды обеспечивают защиту от замыкания между собой сканирующих линий в случае одновременного нажатия более чем одной клавиши.
Процедура ввода кода нажатой клавиши состоит из последовательности частных процедур: сканирования матрицы клавиш, устранения дребезга контактов (рис. 9.9) и идентификации кода нажатой клавиши. Процедура сканирования совмещена с процедурой идентификации.
Рассмотрим отдельно каждую из перечисленных частных процедур.
9.2.13 Сканирование и идентификация
Частная процедура сканирования служит для обнаружения нажатой клавиши и последующей ее идентификации. Процедура сводится к поочередному обнулению каждой из линий сканирования и опросу линий возврата. В линии порта E PE0 − PE3 выдается байт сканирования (БС), содержащий 0 только в одном бите. Если на пересечении линии сканирования и линии возврата находится нажатая клавиша, то в соответствующем бите байта возврата (БВ), принимаемого в линиях PE4 − PE6, будет находиться 0.
Последовательность байтов сканирования представляет собой код "бегущий нуль"; формирование очередного байта сканирования осуществляется путем сдвига его предыдущего значения. Направление сдвига определяет последовательность опроса клавиш. Схема алгоритма процедуры сканирования представлена на рисунке9.10. Если при полном цикле сканирования не было обнаружено нажатой клавиши, то процедура сканирования повторяется сначала.
Каждой клавише клавиатуры поставлен в соответствие код (ее вес), являющийся функцией номеров линии сканирования (С) и линии возврата (В), на пересечении которых нажата клавиша. Поскольку процедура идентификации нажатой клавиши совмещена с процедурой сканирования, то после выхода из процедуры Scan в регистре Scancode будет размещен код нажатой клавиши. Получаемый код на линиях сканирования и возврата представлен в таблице 9.17. Также в таблице показано значение регистра Scancode при различных кодовых комбинациях на порте E.
Рис. 9.10 Анализ наличия нажатой клавиши с одновременной ее идентификацией
Таблица 9.17 Коды, получаемые с порта Е
Клавиша |
Линии порта Е |
Scancode | ||||||
PЕ6 |
PЕ5 |
PЕ4 |
PЕ3 |
PЕ2 |
PЕ1 |
PЕ0 |
| |
S1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
S2 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
2 |
S3 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
3 |
S4 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
4 |
S5 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
5 |
S6 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
6 |
S7 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
7 |
S8 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
8 |
S9 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
9 |
S11 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
A |
S12 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
C |
Кроме того, процедура Scan осуществляет защиту от одновременного нажатия нескольких клавиш. Порядок анализа клавиш таков, что при одновременном нажатии клавиша с большим кодом игнорируется.
После выхода из процедуры Scan управление передается частной процедуре устранения дребезга контактов Delay. Устранение дребезга контактов при вводе символа с клавиатуры осуществляется программной реализацией временной задержки 10 мс.
Пример программы
Рассмотренная ниже программа демонстрирует работу клавиатуры и организацию программных таймеров Т0 и Т1 с 8-разрядным счетным регистром. С использованием таймера Т0 программа формирует сигнал, частоту которого можно задать на клавиатуре, и выдает его на линию PB0 порта В. Каждой клавише клавиатуры назначена своя частота, которая может принимать значения от 800 Гц до 8 кГц. Значения частот для каждой клавиши и счетного регистра приведены в таблице 9.18.
Таблица 9.18 Задание частот клавишам
Клавиша на клавиатуре в VMLAB |
0 |
1 |
2 |
4 |
5 |
6 |
8 |
9 |
A |
D |
Клавиша на клавиатуре эмулятора |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
Частота, Гц |
800 |
1600 |
2400 |
3200 |
4000 |
4800 |
5600 |
6400 |
7200 |
8000 |
Значение счетного регистра TCNT0 |
$D9 |
$ED |
$F3 |
$F7 |
$F9 |
$FA |
$FB |
$FC |
$FD |
$FE |
Кроме того программа формирует ШИМ-сигнал с использованием таймера 1 и выдает на линию PB1 порта В импульсы заданной частотой (8 кГц) и с изменяемой скважностью. Длительность импульса также, как и с таймером Т0, можно изменять с помощью клавиатуры. Значения длительности импульса для каждой клавиши и регистра сравнения приведены в таблице 9.19.
Таблица 9.19 Задание частот клавишам
Клавиша на клавиатуре в VMLAB |
0 |
1 |
2 |
4 |
5 |
6 |
8 |
9 |
A |
D |
Клавиша на клавиатуре эмулятора |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
Длительность, мкс |
12 |
24 |
36 |
48 |
60 |
72 |
84 |
96 |
108 |
120 |
Значение регистра сравнения OCR1L |
$18 |
$30 |
$48 |
$60 |
$78 |
$90 |
$AB |
$C0 |
$D8 |
$F0 |
Схема подключения клавиатуры к МК в симуляторе VMLAB изображена на рисунке 9.11.
Рис. 9.11 Схема подключения клавиатуры к МК
Описание алгоритма программы
Программа состоит основной части и из нескольких процедур: сканирования клавиатуры, устранения дребезга контактов клавиш, задания частоты и длительности сигналам, прерывания по переполнению таймера Т0.
В начале программы описаны переменные, т.е. адресам регистров присвоены символические имена. В программе обращение к переменным производится по присвоенным именам.
Основная часть программы (рис. 9.12) начинается с таблицы переходов системы сброса и прерываний. Собственно программа начинается с адреса $20 обнулением и используемых регистров. После этого вызываются процедуры работы с клавиатурой (рис. 9.13). Процедуры работы с клавиатурой подробно рассмотрены выше, поэтому нет необходимости их повторно описывать. Далее загрузкой регистров управления для таймера Т0 указывается коэффициент деления тактовой частоты, а для таймера Т1 указывается режим 8-разрядного ШИМ с низким уровнем выходного сигнала при совпадении (счетчика и уставки) и счете вверх (рис. 9.15). Тактовая частота для таймера Т1 определена равной СК (системная частота). Таймер Т0 загружается значением частоты в cчетный регистр (TCNT0) , а таймер Т1 – значением длительности сигнала в регистр сравнения (OCR1АL), заданных в предыдущих процедурах. Загрузка регистра TIMSK кодом $1 разрешает прерывания по переполнению таймера Т0, а установка битов 4 регистра направления DDRD и 5 регистра направления DDRB определяет выводы PD4 и PB5 как выходы. В конце основной программы устанавливается общий флаг разрешения прерываний. Далее программа зацикливается, и все действия выполняются по запросу прерываний от таймера Т0.
Процедура обработки прерываний по переполнению таймера Т0 начинается с сохранения в стеке регистра temp, а затем через регистр frec перезагружается счетный регистр таймера T0 (TCNT0) и далее в регистре temp сохраняется содержимое SREG. На выводе PD4 появляется сигнал низкого уровня, если присутствовал сигнал высокого уровня и наоборот. Таким образом, на выводе PD4 будет импульсный сигнал с заданной частотой. В завершении процедуры восстанавливаются значения SREG и регистра temp.
Таймер Т1 работает непрерывно в режиме 8−разрядного ШИМ с накоплением счетного регистра до значения $FF (255) и последующим убыванием его до $00, после чего цикл снова повторяется. При равенстве счетного регистра и регистра сравнения уровень сигнала сменяется на противоположный. Таким образом, задавая разные значения в регистре сравнения, можно изменять длительность с постоянным периодом следования импульсов. Выходной сигнал снимается с вывода PB5 микроконтроллера.
Алгоритм и листинг программы см. ниже.
Рис. 9.12 Алгоритм основной программы
Рис. 9.13 Процедура сканирования клавиатуры
Рис. 9.14 Процедура устранения дребезга контактов
Рис. 9.15 Процедура задания сигналам частоты и длительности
Задание частоты:
Клавишами 0,1,2,4,5,6,8,9,A,D – задается частоты сигнала
Клавиша 0 - Задать частоту сигнала 800 Гц
Клавиша 1 - Задать частоту сигнала 1600 Гц
Клавиша 2 - Задать частоту сигнала 2400 Гц
Клавиша 4 - Задать частоту сигнала 3200 Гц
Клавиша 5 - Задать частоту сигнала 4000 Гц
Клавиша 6 - Задать частоту сигнала 4800 Гц
Клавиша 8 - Задать частоту сигнала 5600 Гц
Клавиша 9 - Задать частоту сигнала 6400 Гц
Клавиша A - Задать частоту сигнала 7200 Гц
Клавиша D - Задать частоту сигнала 8000 Гц
После выбора частоты необходимо нажать ввод, за который отвечает клавиша E.
Если частота выбрана неправильно до нажатия ввода (Клавиши Е) можно выполнить сброс клавишей C и после этого можно выбрать необходимую частоту.
Листинг программы №9
; BASIC .ASM template file for AVR
; ******************************************************
; Define here the variables
;
.include "C:\VMLAB\include\m128def.inc""; определение библиотеки МК ;ATmega128, при условии расположения программы VMLAB на ;локальном диске С
.def scancode=r16
.def schscan=r17
.def schopr=r18
.def code=r19
.def keycode=r20
.def temp=r21
.def frec=r22
.def dlit=r23
.def zader=r24
.def zader1=r25
;Основная программа
;Определение таблицы переходов
.ORG $0 ;Начало таблицы переходов
reset: ; начальная метка
rjmp Start ;Переход на метку Start основной программы
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03 Вектора прерываний МК ATmega128.
reti ; Addr $04 Приведены вектора с адреса $01 по адрес $10.
reti ; Addr $05 Полностью вектора прерываний представлены
reti ; Addr $06 в приложении с назначением прерываний
reti ; Addr $07 (внешних и внутренних).
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
.ORG $20 ;Вектор прерывания при переполнении таймера T0
rjmp IntT0
.ORG $22 ;Начальный адрес основной пpогpаммы
Start:
ldi temp,high(RAMEND) ; Установка указателя стека в конце ОЗУ out SPH,temp
ldi temp,low(RAMEND) ; Установка указателя стека в конце ОЗУ out SPL,temp
rcall Scan ;Вызвать процедуру работы с клавиатурой
Frec: out TCNT0,frec ;Установить заданную частоту сигнала
ldi temp,$4 ;Запустить таймер T0, fck/64
out TCCR0,temp ;Задание значения $4 в регистр управления таймером Т0
out OCR1AL,dlit ;Установить заданную длительность сигнала ldi temp,$81 ;Настроить таймер T1, PWM 8 бит
out TCCR1A,temp ;Задание значения $81 в регистр А управления таймером Т1
ldi temp,$1 ;Запустить таймеp T1, fck/1
out TCCR1B,temp ;Задание значения $1 в регистр В управления таймером Т1
ldi temp,$1 ;Разрешить прерывания от таймера Т0
out TIMSK,temp
ldi temp,$F0 ;Конфигурирование линии PB5 на вывод
out DDRB,temp ;Задание значения $20 в регистр направления данных порта В sei ;Разрешить все пpеpывания
ldi temp,$10 ;Конфигурирование линий PD4 на вывод
out DDRD,temp ;Задание значения $10 в регистр направления данных порта D sei ;Разрешить все пpеpывания
Work:
rjmp Work ;Рабочий цикл пpогpаммы, ничего не делаем
;Процедура cканирования клавиатуры
Scan: clr scancode ;Сброс scancode
ldi temp,$0F ;Конфигурирование 4-х выводов порта E на вывод
out ddre,temp ;и 4-х выводов на ввод
Stklav: sec ;Установить флаг переноса
ldi temp,$1 ;Назначить кл. S1 число 1
ldi schscan,$44 ;Загрузка счетчика сканирования
ldi code,$FE ;Загрузка исходного байта сканирования
Schs: out porte,code ;Вывод байта сканирования в порт E
rol code ;Сдвиг байта сканирования
in keycode,pine ;Ввод байта сканирования
swap keycode ;Поменять местами 4-е разряда байта возврата
ldi schopr,$3 ;Загрузка счетчика опросов
Scho: ror keycode ;Сдвиг байта возврата
brcc Oprkl ;Выход из прочедуры при обнаружении нажатой ;клав.
If0: inc temp ;Инкремент scancode
dec schopr ;Уменьшить счетчик опросов
brne Scho ;Если schopr=0, то перейти на метку Sсho
dec schscan ;Уменьшить счетчик сканирований
brne Schs ;Если schscan=0, то перейти на метку Sсhs
rjmp Stklav ;иначе перейти на метку Klav
Oprkl: cpi temp,$C ;При обнаружении нажатой кл. "Ввод"
breq Delay ;перейти на процедуру устранения дребезга контактов
mov scancode,temp ;иначе сохранить значение нажатой кл.в ;scancode
rjmp If0 ;и продолжить сканирование клавиатуры
;Процедура устранения дребезга контактов клавиш
;Задержка около 10 мс
Delay: clr zader
ldi zader1,$96
Delay1: dec zader
brne Delay1
dec zader1
brne Delay1
;Процедура задания сигналам частоты и длительности
Setkl: cpi scancode,$0 ;Если нажата только кл. "Ввод", то
breq If0 ;снова сканировать клавиатуру
cpi scancode,$1
ldi frec,$D9 ;Задать частоту сигнала 800 Гц
ldi dlit,$18 ;и длительность импульса ШИМ-сигнала 12 мкс breq Endkl
cpi scancode,$2
ldi frec,$ED ;Задать частоту сигнала 1600 Гц
ldi dlit,$30 ;и длительность импульса ШИМ-сигнала 24 мкс breq Endkl
cpi scancode,$3
ldi frec,$F3 ;Задать частоту сигнала 2400 Гц
ldi dlit,$48 ;и длительность импульса ШИМ-сигнала 36 мкс
breq Endkl
cpi scancode,$4
ldi frec,$F7 ;Задать частоту сигнала 3200 Гц
ldi dlit,$60 ;и длительность импульса ШИМ-сигнала 48 мкс
breq Endkl
cpi scancode,$5
ldi frec,$F9 ;Задать частоту сигнала 4000 Гц
ldi dlit,$78 ;и длительность импульса ШИМ-сигнала 60 мкс
breq Endkl
cpi scancode,$6
ldi frec,$FA ;Задать частоту сигнала 4800 Гц
ldi dlit,$90 ;и длительность импульса ШИМ-сигнала 72 мкс
breq Endkl
cpi scancode,$7
ldi frec,$FB ;Задать частоту сигнала 5600 Гц
ldi dlit,$A8 ;и длительность импульса ШИМ-сигнала 84 мкс
breq Endkl
cpi scancode,$8
ldi frec,$FC ;Задать частоту сигнала 6400 Гц
ldi dlit,$C0 ;и длительность импульса ШИМ-сигнала 96 мкс
breq Endkl
cpi scancode,$9
ldi frec,$FD ;Задать частоту сигнала 7200 Гц
ldi dlit,$D8 ;и длительность импульса ШИМ-сигнала 108 мкс
breq Endkl
ldi frec,$FE ;Задать частоту сигнала 8000 Гц
ldi dlit,$F0 ;и длительность импульса ШИМ-сигнала 120 мкс
Endkl: ret
;Пpоцедуpа пpеpывания по пеpеполнению таймеpа T0
IntT0: push temp ;Сохранить temp в стеке
out TCNT0,frec ;Пеpезагpузить таймер Т0
in temp,SREG ;Сохранить SREG
sbis pind,4 ;Если на PD4 был "0", то установить "1"
rjmp Ust1 ;и наоборот
cbi portd,4
rjmp EndT0
Ust1: sbi portd,4
EndT0: out SREG,temp ;Восстановление SREG
pop temp ;Выгрузить данные из стека
reti ;Выйти из процедуры