Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Регистр управления и состояния ADC - ADCSRA




Бит                  
$06 ($26) ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSR
Чтение/Запись R/W R/W R/W R/W R/W R/W R/W R/W  
Исходное значение                  

· Бит 7 – ADEN: ADC Enable – Разрешение АЦП. Установка данного бита в состояние 1 разрешает работу АЦП. Очистка бита запрещает работу АЦП. Запрещение АЦП в процессе преобразования прекращает преобразование.

· Бит 6 – ADSC: ADC Start Conversion – Запуск преобразования. В режиме однократного преобразования для запуска каждого цикла преобразования необходимо устанавливать бит ADSC в состояние 1. В циклическом режиме бит ADSC устанавливается в состояние 1 только при запуске первого цикла преобразования. Каждый раз после первой установки бита ADSC, выполненной после разрешения ADC или одновременно с разрешением ADC, будет выполняться пустое преобразование, предшествующее активируемому преобразованию. Это пустое преобразование активирует АЦП. ADSC будет сохранять состояние 1 в течение всего цикла преобразования и сбрасывается по завершении преобразования.

· Бит 5 – ADATE: ADC Auto Trigger Enable – Выбор режима работы АЦП. В микроконтроллере Atmega8535 запуск АЦП возможен не только по команде пользователя, но и по прерыванию от некоторых периферийных устройств, имеющихся в составе микроконтроллера. Для выбора режима работы используется разряд ADATE регистра ADCSRA и разряды ADTS2..0 регистра специальных функций SFIOR.

Если разряд ADATE сброшен в «0», АЦП работает в режиме одиночного преобразования. Если же разряд ADATE установлен в «1», функционирование АЦП определяется содержимым разрядов ADTS2...0 согласно табл. 21.

Таблица 21. Источник сигнала для запуска преобразования Atmega8535

ADTS2 ADTS1 ADTS0 Источник стартового сигнала
      Режим непрерывного преобразования
      Прерывание от аналогового компаратора
      Внешнее прерывание INT0
      Прерывание по событию «Совпадение» таймера/счетчика 0
      Прерывание по переполнению таймера/счетчика 0
      Прерывание по событию «Совпадение В» таймера/счетчика 1
      Прерывание по переполнению таймера/счетчика 1
      Прерывание по событию «Захват» таймера/счетчика 1

· Бит 4 - ADIF: ADC Interrupt Flag - Флаг прерывания АЦП. Данный бит устанавливается в состояние 1 по завершению преобразования и обновления регистров данных. Прерывание по завершению преобразования АЦП выполняется, если в состояние 1 установлены бит ADIE и I-бит регистра SREG. Бит ADIF сбрасывается аппаратно при выполнении подпрограммы обработки соответствующего вектора прерывания. Кроме того, бит ADIF может быть очищен записью во флаг логической единицы.

· Бит 3 – ADIE: ADC Interrupt Enable - Разрешение прерывания от АЦП. При установленных в состояние 1 бите ADIE и I-бите регистра SREG активируется прерывание по завершению преобразования АЦП.

· Биты 2…0ADPS2…ADPS0: ADC Prescaler Select BitsВыбор коэффициента предварительного деления. Данные биты определяют коэффициент деления частоты XTAL для получения необходимой тактовой частоты АЦП (см. табл. 22).

Таблица 22. Выбор коэффициента предварительного деления

ADPS2 ADPS1 ADPS0 Коэффициент деления
       
       
       
       
       
       
       
       

В блоке управления лабораторного комплекса канал РА0 порта А используется для ввода сигнала на АЦП микроконтроллера. Вводимое напряжение снимается с потенциометрического резистора, движок которого выведен на лицевую панель. Максимальное напряжение, снимаемое с потенциометрического резистора, составляет 5 В.

Ниже представлена программа, обеспечивающая вывод на семисегментный индикатор HG1 цифр от 0 до 5 в зависимости от напряжения на входе АЦП.

Цифра 0 выводится, если напряжение на входе АЦП находится в пределах 0...0,5 В,

1 – в пределах 0,5...1,5 В,

2 – в пределах 1,5...2,5 В,

3 – в пределах 2,5...3,5 В,

4 – в пределах 3,5...4,5 В,

5 – в пределах 4,5...5,0 В.

 

; Пример использования АЦП микроконтроллером АТmega8535

.include "m8535def.inc"; включить файл описания АТmega8535

.def code = r20; регистр куда помещается преобразованное

; число

.ORG$0; Обработка прерывания сброса

rjmp Reset

.ORG$0e; Вектор АЦП

rjmp inADC

;

Reset:

ldi r16,$02; Инициализация вершины стека по адресу

out SPH,r16; $025F

ldi r16,$5f

out SPL,r16

cbi DDRA,0; PA0 на ввод

sbi PORTA,0; Подключить вывод РА0

ldi r16,$0ff; Определить все выводы портов D и С

out DDRD,r16; на выход

out DDRC,r16

sbi PORTD,4; Активизировать семисегментный индикатор HG1

;

ldi r16,$00; выбор нулевого канала АЦП (РА0)

out ADMUX,r16

ldi r16,$0e8;инициализация АЦП: разрешение и запуск циклич.

out ADCSRA,r16;преобразования без деления тактовой частоты

sei; установка общего флага прерываний

m1:

rjmp m1; рабочий цикл программы, ничего не делаем

;

inADC:; Подпрограмма обслуживающая прерывания

; по запросу АЦП

in r16,ADCL; Считать младший байт регистра данных АЦП

in code,ADCH; Считать старший байт регистра данных АЦП

lsr r16; Исключить два младших разряда

lsr r16; преобразованного сигнала

swap code; Поменять местами биты 3...0 с

lsl code; битами 7...4 и сдвинуть влево на

lsl code; два разряда

andi code,$0c0; Выделить биты 7 и 6 code

or code,r16; Получить в code восьмиразрядное число

rcall kod; Вызвать подпрограмму зажигания цифры

reti

;

kod:; Подпрограмма зажигания цифры

ldi r22,51; В r22 дискрета напряжения 1 В на РА0 для цифр

; на семисегментном индикаторе

ldi r21,26; В r21 максимальное значение кода АЦП при

; котором на индикаторе горит 0 - порог нуля

cp code,r21; Если код АЦП не превышает порог нуля, то

brlo k0; зажечь 0

add r21,r22; Установить порог единицы

cp code,r21; Если код АЦП не превышает порог единицы, то

brlo k1; зажечь 1

add r21,r22; Установить порог двойки

cp code,r21; Если код АЦП не превышает порог двойки, то

brlo k2; зажечь 2

add r21,r22; Установить порог тройки

cp code,r21; Если код АЦП не превышает порог тройки, то

brlo k3; зажечь 3

add r21,r22; Установить порог четверки

cp code,r21; Если код АЦП не превышает порог четверки, то

brlo k4; зажечь 4

ldi r23,$6d; Если код АЦП выше порога четверки, то зажечь 5

out PORTC,r23

ret; Выход из подпрограммы

;

k0:

ldi r23,$3f; Зажечь 0

out PORTC,r23

ret; Возврат

k1:

ldi r23,$06; Зажечь 1

out PORTC,r23

ret; Возврат

k2:

ldi r23,$5b; Зажечь 2

out PORTC,r23

ret; Возврат

k3:

ldi r23, $4f; Зажечь 3

out PORTC,r23

ret; Возврат

k4:

ldi r23,$66; Зажечь 4

out PORTC,r23

ret; Возврат

 

Варианты индивидуальных заданий

1. В одном из регистров общего назначения записано число, определяющее заданный уровень порога преобразуемого напряжения. Если напряжение на входе АЦП меньше (ниже) этого порога, то на семисегментном индикаторе HG2 высвечивается буква Н, при равенстве напряжений – буква Р, при превышении преобразуемым напряжением уровня порога (больше) – буква Б. При выполнении этого задания два младших разряда преобразованного числа АЦП опустить.

2. Полученный результат преобразования АЦП вывести в шестнадцатеричном формате на семисегментные индикаторы HG1 и HG2 (динамическая индикация). При изменении положения движка потенциометрического резистора наблюдать изменение информации на индикаторах HG1 и HG2. При выполнении задания два младших разряда преобразованного числа АЦП опустить.

3. В двух регистрах общего назначения записаны числа, определяющие заданные уровни порогов преобразуемого напряжения. В первом регистре число меньше, чем во втором регистре. Если напряжение на входе АЦП меньше (ниже) порога первого регистра, то на семисегментном индикаторе HG1 высвечивается буква Н. Если результат преобразования АЦП находится между двумя порогами, то он отображается на индикаторах HG1 и HG2 (динамическая индикация). Если же результат преобразования превышает порог второго регистра, то на индикатор HG1 выводится буква Б. При выполнении задания два младших разряда преобразованного числа АЦП опустить.

4. Организовать мигание светодиода VD6. В момент загорания светодиода раздается щелчок звукоизлучателя HA1. При увеличении уровня напряжения на входе АЦП, скорость мигания увеличивается, при уменьшении напряжения – скорость уменьшается.

5. В двух регистрах общего назначения записаны числа, определяющие заданные уровни порогов преобразуемого напряжения. В первом регистре число меньше, чем во втором регистре. Если напряжение на входе АЦП меньше порога первого регистра, то на семисегментных индикаторах HG1 и HG2 в шестнадцатеричном формате выводится число первого регистра. Если напряжение на входе АЦП больше порога второго регистра, то – число второго регистра. Если же напряжение на входе АЦП располагается между указанными порогами, то выводится результат преобразования АЦП.

6. Организовать бегущий огонь на семисегментном индикаторе HG2. При увеличении уровня напряжения на входе АЦП скорость бега на семисегментном индикаторе увеличивается, при уменьшении – скорость бега уменьшается.

7. В двух регистрах общего назначения записаны числа, определяющие заданные уровни порогов преобразуемого напряжения. В первом регистре число меньше, чем во втором регистре. Если напряжение на входе АЦП меньше (ниже) первого уровня, то горит 1 светодиод. Если оно находится между двумя уровнями, то горят 2 светодиода. Если же напряжение на входе АЦП выше второго уровня, то горят 3 светодиода.

8. Организовать бегущий огонь на светодиодах VD1 – VD8. При увеличении уровня напряжения на входе АЦП, скорость бега на светодиодах увеличивается. При уменьшении – скорость бега уменьшается.

9. Полученный результат преобразования АЦП вывести в виде двоичного кода на светодиоды VD1 – VD8. При изменении положения движка потенциометрического резистора наблюдать изменение кода на светодиодах VD1 – VD8. При выполнении задания два младших разряда преобразованного числа АЦП опустить.

10. Разбить весь диапазон напряжений на входе АЦП на 8 равных поддиапазонов. При попадании преобразуемого напряжения в какой-либо поддиапазон зажечь соответствующий светодиод (в порядке VD1, VD2, …, VD8).

11. Организовать формирование звука изменяющейся частоты с помощью звукоизлучателя HA1. При увеличении уровня напряжения на входе АЦП частота звука увеличивается, при уменьшении напряжения – уменьшается.

12. Восемь младших разрядов полученныго результата преобразования АЦП вывести в шестнадцатеричном формате на семисегментные индикаторы HG1 и HG2 (динамическая индикация). При изменении положения движка потенциометрического резистора наблюдать изменение информации на индикаторах HG1 и HG2. При равенстве или превышении преобразованным числом АЦП значения 256 зажечь на индикаторе HG1 букву Б.

13. Разбить весь диапазон напряжений на входе АЦП на 16 равных поддиапазонов. При попадании преобразуемого напряжения в какой-либо поддиапазон высветить на семисегментном индикаторе HG4 соответствующую шестнадцатеричную цифру от 0 до F.

14. Разбить весь диапазон напряжений на входе АЦП на 4 равных поддиапазон. При попадании преобразуемого напряжения в какой-либо поддиапазон высвечивать на поочередно на семисегментных индикаторах HG1 – HG4 соответствующую цифру от 0 до 3. В каждом более высоком диапазоне скорость поочередного зажигания индикаторов увеличивается.

15. Разбить весь диапазон напряжений на входе АЦП на 8 равных поддиапазонов. При попадании преобразуемого напряжения в какой-либо поддиапазон зажечь соответствующее количество светодиодов – 1, 2, …, 8 (в порядке VD1, VD2, …, VD8).

16. Полученный результат преобразования АЦП вывести в десятичном формате на семисегментные индикаторы HG1 и HG2 (динамическая индикация). При изменении положения движка потенциометрического резистора наблюдать изменение информации на индикаторах HG1 и HG2. При выполнении задания четыре младших разряда преобразованного числа АЦП опустить.

6.6. Лабораторная работа № 5. Изучение систем
автоматизации на базе микроконтроллеров

Цель работы

На базе микроконтроллера ATmega8535 реализовать систему автоматизации управления виртуальным объектом.

Пояснения к работе

Виртуальный объект реализуется на экране монитора ПЭВМ в виде мультипликации. Микроконтроллер подает управляющие команды, по которым механизмы виртуального объекта совершают заданные перемещения с заданной скоростью. Сигналы с датчиков виртуального объекта также передаются в микроконтроллер. Изображения механизмов виртуального объекта при их включении изменяют свой цвет, при срабатывании датчиков виртуального объекта их изображение также меняет свой цвет.

Для управления виртуальными объектами между ПЭВМ и микроконтроллером постоянно идет обмен информацией по последовательному интерфейсу USART. От ПЭВМ передается в микроконтроллер информация о состоянии датчиков виртуального объекта, а микроконтроллер выдает на объект управляющие команды.

В ПЭВМ хранятся 4 варианта виртуальных объектов:

– роботизированный комплекс;

– методическая печь (участок транспортировки изделий в методическую печь для их нагрева перед прокаткой);

– нагревательный колодец (механизмы управления крышкой нагревательного колодца обжимного прокатного стана);

– сортировка и пакетирование (участок сортировки и пакетирования годных и бракованных листов металла).

В качестве примера ниже рассмотрено управление механизмами напольно-крышечной машины нагревательного колодца обжимного прокатного стана. Упрощенный вид напольно-крышечной машины представлен на рис. 11.

Рис. 11. Механизм управления крышкой нагревательного колодца

Это один из вариантов виртуальных объектов, представленных в приложении, где дано подробное описание назначения и последовательности работы напольно-крышечной машины. Здесь же повторяется конструктивная схема этого виртуального объекта и более кратко представлена последовательность работы механизмов объекта.

На рис. 11 кроме конструктивных механизмов объекта, расположения датчиков и исполнительных устройств (в рассматриваемом случае это электродвигатели подъема крышки 2 и передвижения тележки 3) представлены линейки битов управляющих команд на исполнительные устройства 6 и состояния датчиков объекта 7. Единица в бите линейки соответствует наличию команды и наличию сигнала с датчика.

Управление механизмами напольно-крышечной машины должно осуществляться с блока управления рабочего места студента. С этого блока должны подаваться для управления две ручные команды ''Открыть'' и ''Закрыть''. Принимаем решение, что команда ''Открыть'' подается на вход РА3 микроконтроллера, а ''Закрыть'' – на вход РА2.

В процессе управления объектом микроконтроллер должен считывать информацию из ПЭВМ о состоянии датчиков объекта, по программе формировать управляющие команды и выдавать их на объект для управления его механизмами. В ниже представленных программах управление указанным обменом осуществляется подпрограммой "irps". Для корректной передачи информации из ПЭВМ в микроконтроллер и обратно необходима также подпрограмма "delay".

Программирование виртуального объекта студентом заключается в считывании информации о состоянии датчиков из соответствующих регистров (in1, in2) и в выдаче в зависимости от этих данных управляющих сигналов в регистры (out1, out2). Биты регистров in1, in2, out1, out2 для рассматриваемого примера представлены в таблице 23, а для остальных виртуальных объектов – в приложении. Программа должна составляться с учетом этих битов. В программе студента кроме подпрограмм "irps" и "delay" должны быть правильно инициализированы порты, USART, настроены векторы прерываний. Преподаватель со своего рабочего места должен перед началом работы студента загрузить шаблон программы для виртуального объекта.

Таблица 23. Регистры микроконтроллера для обмена информацией с ПЭВМ

Мнемо-ника Ре-гистр Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
in 1 r20
in 2 r21
                   
out 1 r23
out 2 r24

 

Рис.12. Схема алгоритма управления работой напольно-крышечной машины


На рис. 12 приведена схема алгоритма управления работой напольно-крышечной машины, соответствущая представленному в приложении описанию. Все действия однотипны: контролируется поступление необходимого сигнала, после чего выдаются требуемые управляющие команды.

Ниже представлена программа для микроконтроллера, реализующая приведенный алгоритм.

 

; Программа управления механизмами напольно-крышечной машины.

; Команды "Открыть" и "Закрыть" подаются кнопками PA3 и PA2

.include"m8535def.inc"

.def count=r18; Счетчик прочитанных слов

.def temp=r19

.def in1=r20; Регистры хранения состояния датчиков

.def in2=r21; виртуального объекта автоматизации

.def in3=r22; (читаемая информация)

.def out1=r23; Регистры хранения управляющих команд на

.def out2=r24; виртуальн. объект (передаваемая инф-ция)

;―――――――――――――――― ―――――――――――――――――――――――――

.org $000; Вектор прерывания по Сбросу

rjmp reset

.org $00b; Вектор прерывания по приему USART

rjmp irps

.org $00c; Вект. прерыв. по пустому регистру данных USART

reti

.org $00d; Вектор прерывания по завершению передачи USART

reti

;―――――――――――――――― ―――――――――――――――――――――――――

reset:

ldi R17,$ff; Установка указателя стека

out spl,R17

ldi R17,$00

out sph,R17

;―――――――――――――――― ―――――――――――――――――――――――――

sei; Установить флаг глобального прерывания в регистре SREG

ldi r16,$ff; Настроить порт С на выход

out ddrc,r16

ldi r16,00; Настроить порт А на вход

out ddra,r16

ldi r16,$ff; Настроить порт В на выход

out ddrb,r16

ldi r16,0xf0; Настроить порт D: биты 0...3 на вход,

out ddrd,r16; остальные на выход

ldi R17,51; Инициализировать USART, скорость 9600 бод

out ubrrl,R17

ldi R17,0x9b; Разрешить прием - передачу 10011011

out ucsrb,R17

;―――――――――――――――― ――――――――――――――――――――――――

ldi count,0; Обнуление переменных

ldi temp,0

ldi in1,0

ldi in2,0

ldi in3,0

ldi out1,0

ldi out2,0

ldi r17,0

out portd,r17

;―――――――――――――――― ――――――――――――――――――――――――

start:; Начало основной программы

sei; Установить флаг глобального прерывания

sbis pina,3; Проверка состояния кнопки "Открыть"

rjmp start

set; Установить флаг Т в регистре SREG

bld out1,0; Выдать команду "Вверх"

mo1: sei

sbrs in1,0; Контроль состояния датчика ВП

rjmp mo1

clt; Очистить флаг Т в регистре SREG

bld out1,0; Отключить команду "Вверх"

set; Установить флаг Т в регистре SREG

bld out1,3; Выдать команду "Вправо"

mo2: sei

sbrs in1,6; Контроль состояния датчика П2

rjmp mo2

clt; Очистить флаг Т в регистре SREG

bld out1,3; Отключить команду "Вправо"

mo3: sei

sbis pina,2; Проверка состояния кнопки "Закрыть"

rjmp mo3

set

bld out1,4; Выдать команду "Влево"

mo4: sei

sbrs in1,5; Контроль состояния датчика П1

rjmp mo4

set

bld out1,5; Выдать команду "Тележка медленно"

mo5: sei

sbrs in1,4; Контроль с остояния датчика П0

rjmp mo5

clt

bld out1,4; Отключить команду "Влево"

bld out1,5; Отключить команду "Тележка медленно"

set

bld out1,1; Выдать команду "Вниз"

mo6: sei

sbrs in1,1; Контроль состояния датчика ПС

rjmp mo6

set

bld out1,2; Выдать команду "Крышка медленно"

mo7: sei

sbrs in1,2; Контроль состояния датчика НП

rjmp mo7

clt

bld out1,1; Отключить команду "Вниз"

bld out1,2; Отключить команду "Крышка медленно"

rjmp start

;―――――――――――――――― ――――――――――――――――――――――――

irps:; Подпрограмма прерывания по приёму USART

in r25, sreg; Сохранение регистра SREG

cli; Запретить прерывания

mov count,temp

sbi portb,4; Включить светодиод VD5

tst count; Проверка счетчика на нуль

brne m21

in in2,udr; Записать первый принятый байт информации

inc count; с объекта

mov temp,count

rjmp exit

m21: mov count,temp

cpi count,1

brne m22

in in1,udr; Записать второй принятый байт информации mov

count,temp; с объекта

inc count

mov temp,count

rjmp exit

m22: mov count,temp

in in3,udr; Записать третий принятый байт информации

ldi count,0; с объекта

mov temp,count

rcall delay

out udr,out2; Выдать первый байт команд на объект

sbi portb,5; Включить светодиод VD6

mt1: sbis ucsra,udre; Передатчик готов к получению нового символа?

rjmp mt1

ldi r17,64

out ucsra,r17

sbi portb,6; Включить светодиод VD7

rcall delay

out udr,out1; Выдать второй байт команд на объект

mt2: sbis ucsra,udre; Передатчик готов к получению нового символа?

rjmp mt2

ldi r17,64

out ucsra,r17

exit: mov count,temp

sei

out sreg,r25; Восстановление регистра SREG

cbi portb,4; Выключение индикации

cbi portb,5

cbi portb,6

reti; Выход из подпрограммы прерывания

delay:; Подпрограмма временной задержки

ldi r27,0x0F

loop1: ldi r28,0xFF

loop: dec r28

brne loop

dec r27

brne loop1

ret; Выход из подпрограммы


Другой вариант написания программы для микроконтроллера – по логическим уравнениям. Например, команда ''Вверх'' на движение крышки напольно-крышечной машины возникает при нажатии на кнопку ''Открыть'' (команда ''Откр.''). Возникшая команда ''Вверх'' сохраняется до прихода крышки в верхнее положение ВП. Этому содержательному описанию соответствует логическое уравнение

Вверх = (Откр. + Вверх)*ВП.

Команда на движение крышки ''Вниз'' возникает после того как крышка побывала в правом положении П2 и вернулась в положение П0 над колодцем. Возникшая команда сохраняется до прихода крышки в крайнее нижнее положение НП. Представленному описанию соответствует логическое уравнение

Вниз = (П0*ВП*рn + Вниз)*НП.

В этом уравнении промежуточная переменная рn выполняет роль памяти о том, что крышка побывала в положении П2. Она возникает в положении П2 и сохраняется до прохода крышки в положение НП. Тогда логическое выражение для рассматриваемой переменной имеет вид

рn = (П2 + рn)*НП.

Команда на снижение скорости крышки Мк (крышка медленно) возникает только при движении ''Вниз''. Она появляется при наличии сигнала ПС и сохраняется, пока существует команда ''Вниз''. Логическое уравнение для команды Мк имеет вид

Мк = (ПС + Мк)*Вниз.

Команда на перемещение тележки ''Вправо'' возникает в верхнем положении крышки и нахождении тележки в положении П0, если тележка до этого не побывала в положении П2, т.е. если еще нет сигнала рn. Возникшая команда сохраняется до прихода тележки в положение П2. Команда должна отключаться, если по какой-то причине тележка дойдет до крайнего правого положения КВП (аварийное отключение). Логическое уравнение для этой команды имеет вид

 
 

Вправо = (П0*рn + Вправо)*ВП*П2*КВП.

Команда на движение тележки ''Влево'' возникает в положении тележки П2 при нажатии на кнопку ''Закрыть'' (команда ''Закр.''). Возникшая команда сохраняется до прихода тележки в положение П0. Команда должна отключаться, если по какой-то причине тележка дойдет до крайнего левого положения КВЛ (аварийное отключение). Представленному описанию соответствует логическое уравнение

Влево = (П2*Закр + Влево)*ВП*ПО*КВЛ.

Команда Мт на снижение скорости тележки возникает только при движении тележки влево. Она появляется в положении тележки П1 и сохраняется, пока существует команда ''Влево''. Логическое уравнение для команды Мт имеет вид

Мт = (П1 + Мт)*Влево.

Пример программы микроконтроллера с использованием логических уравнений представлен ниже.

 

  ; Программа управления механизмами напольно-крышечной машины
  ; по логическим уравнениям
  .include "m8535def.inc"  
  .def count=r18  
  .def temp=r19  
  ; ————————————————————————————————
  .def in1=r20 ; Регистры хранения состояния датчиков и
  ; управляющих команд (аналогично предыдущей
  .def out2=r24 ; программе)
  ; ————————————————————————————————
  .def A=r27 ; Регистр, используемый как аккумулятор А
  .def B=r28 ;
  .def C=r29 ; Регистр, используемый для инвертирования бита
  .def D=r30 ; Хранение промежуточной переменной pn
  ; ————————————————————————————————
  .org $0000 ; Вектора прерываний (аналогично предыдущей
  ; программе)
  .org $00d  
  reti    
  ; ————————————————————————————————
reset:      
  ldi R13,$ff ; Установка указателя стека
  out SPL,R13  
  ldi R13,$00  
  out SPH,R13  
  ; ————————————————————————————————
  sei   ; Настройка портов, инициализация UART
  ; (аналогично предыдущей программе)
  out UCR,R17  
  ; ————————————————————————————————
  ldi count,0 ; Обнуление переменных (аналогично предыдущей
  ; программе)
  out portd,r17  
  ; ————————————————————————————————
  ldi A,0 ; Обнуление дополнительно введённых регистров
  ldi B,0  
  ldi C,1  
  ldi D,0  
  ; ————————————————————————————————
start:     ; Начало основной программы
  ;Программирование команды "Вверх"
  ;
  ;
  in A,pina ; A,0 pina,3
  lsr A  
  lsr A  
  lsr A  
  bst out1,0 ; B,0 out1,0
  bld B,0  
  or A,B ; A A Ú B
  bst in1,0 ; B,0 in1,0
  bld B,0  
  eor B,C ; B B Å C
  and A,B ; A A · B
  bst A,0 ; out1,0 A,0
  bld out1,0 ; Выдать команду «Вверх»
  ; Программирование команды "Вниз"
; ;
  bst in1,4 ; A,0 in1,4
  bld A,0  
  bst in1,0 ; B,0 in1,0
  bld B,0  
  and A,B ; A A · B
  bst D,0 ; B,0 D,0
  bld B,0  
  and A,B ; A A · B
  bst out1,1 ; B,0 out1,1
  bld B,0  
  or A,B ; A A Ú B
  bst in1,2 ; B,0 in1,2
  bld B,0  
  eor B,C ; B B Å C
  and A,B ; A A · B
  bst A,0 ; out1,1 A,0
  bld out1,1 ; Выдать команду «Вниз»
  ; Программирование промежуточной переменной pn
  ;
  ;
  bst in1,6 ; A,0 in1,6
  bld A,0  
  bst D,0 ; B,0 D,0
  bld B,0  
  or A,B ; A A Ú B
  bst in1,2 ; B,0 in1,2
  bld B,0  
  eor B,C ; B B Å C
  and A,B ; A A · B
  bst A,0 ; D,0 A,0
  bld D,0  
  ; Программирование команды "Медленно крышка"
  ;
  ;
  bst in1,1 ; A,0 in1,1
  bld A,0  
  bst out1,2 ; B,0 out1,2
  bld B,0  
  or A,B ; A A Ú B
  bst out1,1 ; B,0 out1,1
  bld B,0  
  and A,B ; A A · B
  bst A,0 ; out1,2 A,0
  bld out1,2 ; Выдать команду «Медленно крышка»
  ; Программирование команды "Вправо"
  ;
  ;
  bst in1,4 ; A,0 in1,4
  bld A,0  
  bst D,0 ; B,0 D,0
  bld B,0  
  eor B,C ; B B Å C
  and A,B ; A A · B
  bst out1,3 ; B,0 out1,3
  bld B,0  
  or A,B ; A A Ú B
  bst in1,0 ; B,0 in1,0
  bld B,0  
  and A,B ; A A · B
  bst in1,6 ; B,0 in1,6
  bld B,0  
  eor B,C ; B B Å C
  and A,B ; A A · B
  bst in1,7 ; B,0 in1,7
  bld B,0  
  eor B,C ; B B Å C
  and A,B ; A A · B
  bst A,0 ; out1,3 A,0
  bld out1,3 ; Выдать команду «Вправо»
  ; Программирование команды "Влево"
  ;
  ;
  bst in1,6 ; A,0 in1,6
  bld A,0  
  in B,pina ; B,0 pina,2
  lsr B  
  lsr B  
  and A,B ; A A · B
  bst out1,4 ; B,0 out1,4
  bld B,0  
  or A,B ; A A Ú B
  bst in1,0 ; B,0 in1,0
  bld B,0  
  and A,B ; A A · B
  bst in1,4 ; B,0 in1,4
  bld B,0  
  eor B,C ; B B Å C
  and A,B ; A A · B
  bst in1,3 ; B,0 in1,3
  bld B,0  
  eor B,C ;
Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...