Регистр управления и состояния ADC - ADCSRA
⇐ ПредыдущаяСтр 11 из 11
· Бит 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
· Бит 4 - ADIF: ADC Interrupt Flag - Флаг прерывания АЦП. Данный бит устанавливается в состояние 1 по завершению преобразования и обновления регистров данных. Прерывание по завершению преобразования АЦП выполняется, если в состояние 1 установлены бит ADIE и I-бит регистра SREG. Бит ADIF сбрасывается аппаратно при выполнении подпрограммы обработки соответствующего вектора прерывания. Кроме того, бит ADIF может быть очищен записью во флаг логической единицы.
· Бит 3 – ADIE: ADC Interrupt Enable - Разрешение прерывания от АЦП. При установленных в состояние 1 бите ADIE и I-бите регистра SREG активируется прерывание по завершению преобразования АЦП. · Биты 2…0 – ADPS2…ADPS0: ADC Prescaler Select Bits – Выбор коэффициента предварительного деления. Данные биты определяют коэффициент деления частоты XTAL для получения необходимой тактовой частоты АЦП (см. табл. 22). Таблица 22. Выбор коэффициента предварительного деления
В блоке управления лабораторного комплекса канал РА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. Регистры микроконтроллера для обмена информацией с ПЭВМ
Рис.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 + Мт)*Влево. Пример программы микроконтроллера с использованием логических уравнений представлен ниже.
|