К задачам ввода относятся как задачи получения от оператора информации о требуемых режимах и настройках системы, так и задачи выделения информации, поступающей в виде сигналов (амплитудных, частотных и других) с датчиков объекта управления.
Часто для переключения каналов используются двоичные ключи. На рис. 3.2 показана схема подключения контакта двоичного датчика ко входу PTD0 порта ввода-вывода PTD MC 68 HC 908 GP 32. Если в разряд PTD0 предварительно записать логическую 1, то при разомкнутом ключе К на входе PTD0 присутствует напряжение, соответствующее логической 1 (все выводы порта PTD внутри микросхемы через резистор подключены к напряжению +5 В), при замкнутом – логическому 0.
Блок-схема программы реализации контроля переключения ключа, подключенного к выводу PTD0 порта ввода–вывода PTD, представлена на рис. 3.3.
K |
МС |
PTD D0 D1 D2 D3 D4 D5 D6 D7 |
Рис. 3.2. Подключение двоичного датчика к МКУ
Начало |
ДА |
НЕТ |
Проверка PTD0 |
(PTD0) = 0? |
Ввод из порта D |
Программа с меткой metka1 |
Программа с меткой prog |
Рис. 3.3. Блок-схема программы реализации контроля переключения ключа
Программа реализации контроля переключения ключа, подключенного к выводу PTD0 порта ввода-вывода PTD, представлена ниже.
ramstart | equ | $0040 | ;команды присвоения переменным символьных |
romstart | equ | $8000 | ;имен |
vectorstart | equ | $FFDC | |
PTD | equ | $0003 | |
DDRD | equ | $0007 | |
org | romstart | ;директива установки записи команд в блок Flash-;памяти | |
mov | $00,DDRD | ;конфигурирование вывода PTD0 порта D на ввод;информации | |
main | bclr | 0,PTD,metka1 | ;переход по метке при наличии низкого потенциала на входе вывода порта D |
prog: | … | … | ;программа с меткой prog |
metka 1: | … | … | ;организация цикла опроса на наличие низкого;потенциала |
end |
Для того чтобы программа могла начать работу, должны быть определены через команды присвоения EQU все спецификации аппаратных средств, такие как имена регистров и области памяти. С помощью объявлений определяются все переменные.
RamStart EQU $0040
Здесь команда присвоения EQU назначает адрес первой ячейки памяти ОЗУ МК, которая будет использована Вами в программе. Обозначенная ячейка $0040 должна соответствовать карте памяти используемого МК.
RоmStart EQU $8000
Назначается начальный адрес прикладной программы. Начиная с этого адреса, программа ассемблера разместит коды программы после ассемблирования. Выбранный адрес должен соответствовать карте памяти используемого МК.
VectorStart EQU $FFDC
Назначается адрес двух ячеек памяти, в которые необходимо поместить адрес начала прикладной программы. Этот адрес называют вектором начальной загрузки, поскольку при включении питания МК он автоматически загружается в программный счетчик РС центрального процессора.
Каждый параллельный порт ввода-вывода имеет регистр данных РТх и регистр направления DDRx, где х = А, В, С, D или Е. В данной программе используется PTD. Поэтому необходимо присвоить абсолютным адресам символьные значения.
PTD EQU $0003
DDRD EQU $0007
Таким образом, в дальнейшем при необходимости обращения к этим ячейкам будут использоваться их символьные имена PTD или DDRD.
Команда ORG сообщает ассемблеру адрес начала оперативной памяти. При ассемблировании первая команда будет размещена в ячейки памяти $8000.
Команда mov $00, DDRD загружает в регистр направления DDRD, определяющий направление передачи данных порта РТD код $0016 (00000002). В результате этого все выводы порта D конфигурируются как входные.
main – начало главной программы, которая вызывается после аппаратного сброса МК или команды RESET отладчика (команды Power-on для некоторых отладчиков).
Команда «brclr 0,PTD,metka1» является командой условного перехода. Она обеспечивает переход на «metka1», при наличии логического нуля на нулевом бите PTD, т.е. переход по метке при наличии низкого потенциала на входе вывода порта D. В противном случае осуществляется выполнение программы prog.
В большинстве встраиваемых систем управления необходимо организовывать связь с оператором для указания параметров работы системы.
Контроллеры технологических объектов работают в реальном масштабе времени, и, следовательно, их функционирование должно определяться событиями, происходящими в объекте управления. Чаще всего событие в объекте управления фиксируется с использованием двоичных датчиков («да – нет»).
Пусть требуется по ходу выполнения управляющей программы приостановить продвижение по программе до тех пор, пока в результате процессов, происходящих в объекте управления, не замкнется контакт К некоторого двоичного датчика (рис.3.3).
Программа будет практически аналогична рассмотренной выше программе. Из схемы алгоритма видно, что программа должна постоянна опрашивать значение сигнала на входе PTD0 порта D до тех пор, пока оно не станет равным нулю (контакт датчика события замкнут), и в этом случае продолжить выполнение основной управляющей программы.
Блок схема данной программы представлена на рис. 3.4.
ДА |
НЕТ |
Начало |
Ввод из PTD |
Проверка PTD0 |
PTD0 = 0? |
Очередная команда управляющей программы |
Рис. 3.4. Блок-схема программы реализации контроля переключения ключа
Текст данной программы представлен ниже
ramstart | equ | $0040 | ;команды присвоения переменным символьных |
romstart | equ | $8000 | ;имен |
vectorstart | equ | $FFDC | |
PTD | equ | $0003 | |
DDRD | equ | $0007 | |
org | romStart | ;директива установки записи команд в блок Flash-;памяти | |
mov | $00, DDRD | ;конфигурирование вывода PTD0 порта D на ввод;информации | |
main: | bclr | 0,PTD,metka1 | ;переход по метке при наличии низкого потенциала;на входе вывода порта D |
bra | main | ;безусловный переход на метку main | |
metka 1: | … | ;организация цикла опроса на наличие низкого;потенциала | |
end |
Необходимо рассмотреть задачу определения нажатой клавиши на 12- кнопочной клавиатуре (4 ряда по 3 кнопки), схема подключения которой к микроконтроллеру МС 68 НС 908 GP 32 показана на рис. 3.5.
PTA 4 PTA 5 PTA 6 PTA 7 |
PTA 1 PTA 2 PTA 3 |
* |
# |
Рис. 3.5. Схема подключения клавиатуры к выводам МС 68 НС 908 GP 32
Если контроль состояния клавиатуры осуществляется по опросу, то необходимо сконфигурировать выводы управления строками РТА4 – РТА7 на ввод данных, а выводы управления столбцами РТА1 – РТА3 сконфигурировать на вывод данных. Тогда, если кнопки не нажаты, на выводах РТА4 – РТА7 будет присутствовать высокий потенциал, что соответствует состоянию логической 1.
В процессе опроса клавиатуры на выводы управления столбцами РТА1–РТА3 следует последовательно подавать низкий потенциал (логический 0) и считывать состояния клавиатуры с выводов управления строками РТА4 – РТА7. В случае нажатия клавиши на соответствующем выводе РТАi установится состояние логического 0, а на остальных выводах сохранится состояние логической 1.
На рис. 3.6 представлена блок-схема программы опроса 12-кнопочной клавиатуры. Эта программа необходима для определения той клавиши, которая в данный момент замкнута. Рассмотрим подробно выполнение этой программы.
Для того чтобы программа могла начать работу, должны быть определены через команды присвоения EQU все спецификации аппаратных средств, такие как имена регистров и области памяти. С помощью объявлений определяются все переменные. Команда ORG сообщает ассемблеру адрес начала оперативной памяти. Программа MAIN – начало главной программы, которая вызывается после аппаратного сброса МК или команды RESET отладчика (команды Power-on для некоторых отладчиков).
В регистр DDRA порта PTA загружается число в двоичном коде %00001110, тем самым первый, второй, третий биты PТА устанавливаются на вывод информации, а нулевой, четвертый, пятый, шестой и седьмой – на ввод информации.
Вначале производится сканирование первого столбца клавиатуры. В основной программе обнуляется первый бит РТА и устанавливаются высокие уровни на втором и третьем битах. Иначе говоря, на выводах РТА в данный момент времени будет следующий код %00001100. Затем через небольшой промежуток времени установившиеся значения на выводах РТА записываются в аккумулятор (А). Это значение сравнивается с числами $ed (%11101101), $dd (%11011101), $bd (%10111101), $7d (%01111101). Если число, которое хранится в аккумуляторе, равно числу $ed, то это означает, что замкнута кнопка на пересечении первой строки и первого столбца. В этом случае осуществляется переход на metka1, где в специально отведенную ячейку сохраняется число, соответствующее нажатой клавише. Далее микропроцессор переходит по метке MAIN и начинает заново сканировать клавиатуру. Если число, хранящееся в аккумуляторе, не равно $ed, то оно сравнивается со вторым числом. При равенстве этих чисел микропроцессор переходит по соответствующей метке, и выполняются операции, описанные выше. Если же содержимое аккумулятора не равно ни второму, ни третьему, ни четвертому числам, то это означает, что на первом столбце матричной клавиатуры нет нажатой клавиши.
Начинает сканироваться второй столбец. В этом случае обнуляется второй бит РТА и подаются логические 1 на первый и третий бит РТА. В данный момент времени на битах РТА будет следующий код: %00001010. Так же, как и при сканировании первого столбца, через некоторый небольшой промежуток времени в аккумулятор записываются установившиеся значения битов РТА. Происходит сравнение содержимого аккумулятора со следующими числами: $eb (%11101011), $db (%11011011), $bb (%10111011), $7b (%01111011). При равенстве содержимого аккумулятора с одним из этих чисел контроллер переходит по соответствующей метке, где сохраняет соответствующее число, после которого возвращается к метке MAIN. В случае же, если оно не равно ни одному из этих чисел, то начинается сканирование третьего столбца.
При сканировании третьего столбца вначале обнуляется третий бит РТА, а логические 1 подаются на первый и второй биты. Таким образом, на РТА будет следующий код: %00000110. Аналогично сканированию первого и третьего столбцов, через некоторый интервал времени в аккумулятор записываются установившиеся значения битов РТА, которое затем сравниваются с числами $e7 (%11100111), $d7 (%11010111), $b7 (%10110111), $77 (%01110111). Если содержимое аккумулятора равно одному из этих чисел, то процессор переходит по соответствующей метке, где сохраняет соответствующее число, после чего возвращается к метке MAIN. Если же содержимое аккумулятора не равно ни одному из этих чисел, то начинается сканирование первого столбца, будут повторяться все процедуры, описанные выше.
ДА |
Определение номера, сохранение |
НАЧАЛО |
Установка битов PTA1…PTA3 на вывод, PTA0,PTA4…PTA7 на ввод |
Сканирование 1 го столбца клавиатуры |
вывод кода 00001100 |
ввод |
Клавиша нажата? |
НЕТ |
НЕТ |
НЕТ |
ДА |
ДА |
Сканирование 2 го столбца клавиатуры |
вывод кода 00001010 |
ввод |
Клавиша нажата? |
Определение номера, сохранение |
Сканирование 3 го столбца клавиатуры |
вывод кода 00000110 |
ввод |
Клавиша нажата? |
Определение номера, сохранение |
Рис. 3.6. Блок-схема программы опроса 12-ти кнопочной клавиатуры
Программа опроса 12-кнопочной клавиатуры представлена ниже
romstart: | equ | $8000 | ;команды присвоения переменным | ||
ramstart | equ | $0038 | ;символьных имен | ||
PTA: | equ | $0000 | |||
DDRA: | equ | $0004 | |||
PTAPUE: | equ | $000D | |||
org | romstart | ;директива установки записи команд в блок;Flash-;памяти | |||
mov | #%00001110,ddra | ||||
mov | #%11110000,ptapue | ||||
main: | bclr | 1,PTA | ;обнулить первый бит PTA | ||
bset | 2,PTA | ;установить 1 на втором бите РТА | |||
bset | 3,PTA | ;установить 1 на третьем бите РТА | |||
lda | PTA | ;сохранить в А установившееся значение;битов РТА | |||
cbeqa | #$ed,metka1 | ;сравнить содержимое А с константой, | |||
cbeqa | $dd,metka4 | ;перейти по метке если они равны | |||
cbeqa | #$bd,metka7 | ||||
cbeqa | #$7d,metka10 | ||||
bset | 1,PTA | ;установить 1 на первом бите РТА | |||
bclr | 2,PTA | ;обнулить второй бит PTA | |||
bset | 3,PTA | ;установить 1 на третьем бите РТА | |||
lda | PTA | ||||
cbeqa | #$eb,metka2 | ||||
cbeqa | #$db,metka5 | ||||
cbeqa | #bb,metka8 | ||||
cbeqa | #$7b,metka11 | ||||
bset | 1,PTA | ;установить 1 на первом бите РТА | |||
bset | 2,PTA | ;установить 1 на втором бите РТА | |||
bclr | 3,PTA | ;обнулить третий бит PTA | |||
lda | PTA | ||||
cbeqa | #$e7,metka3 | ||||
cbeqa | #$d7,metka6 | ||||
cbeqa | #$b7,metka9 | ||||
cbeqa | #$77,metka12 | ||||
jmp | main | ||||
metka1: | mov | #1,$0040 | ;записать 1 в $0040 | ||
jmp | main | ||||
metka2: | mov | #2,$0040 | ;записать 2 в $0040 | ||
jmp | main | ||||
metka3: | mov | #3,$0040 | ;записать 3 в $0040 | ||
jmp | main | ||||
metka4: | mov | #4,$0040 | ;записать 4 в $0040 | ||
jmp | main | ||||
metka5: | mov | #5,$0040 | ;записать 5 в $0040 | ||
jmp | main | ||||
metka6: | mov | #6,$0040 | ;записать 6 в $0040 | ||
jmp | main | ||||
metka7: | mov | #7,$0040 | ;записать 7 в $0040 | ||
jmp | main | ||||
metka8: | mov | #8,$0040 | ;записать 8 в $0040 | ||
jmp | main | ||||
metka9: | mov | #9,$0040 | ; записать 9 в $0040 | ||
jmp | main | ||||
metka10: | mov | #10,$0040 | ;записать 10 в $0040 | ||
jmp | main | ||||
metka11: | mov | #11,$0040 | ;записать 11 в $0040 | ||
jmp | main | ||||
metka12: | mov | #12,$0040 | ;записать 12 в $0040 | ||
jmp | main | ||||
end |
В системах управления одной из типовых задач является задача определения показаний датчиков объекта, представляющих информацию в виде аналогового сигнала – уровня напряжения.
Перед разработчиком в данном случае возникает две задачи: масштабирования сигналов и аналогово-цифрового преобразования.
Первая задача решается применением схемотехнических решений (внешних по отношению к микроконтроллеру узлов масштабирования, выполненных, например, на базе операционных усилителей). Вторая задача решается либо схемотехнически (в случае отсутствия встроенного в микроконтроллер АЦП), либо программно (при наличии данного периферийного модуля, как в нашем случае).
Блок-схема программы для измерения напряжения с использованием АЦП представлена на рис. 3.7.
Для того чтобы программа могла начать работу, должны быть определены через команды присвоения EQU все спецификации аппаратных средств, такие как имена регистров и области памяти. С помощью объявлений определяются все переменные. Команда ORG сообщает ассемблеру адрес начала оперативной памяти. Программа MAIN – начало главной программы, которая вызывается после аппаратного сброса МК или команды RESET отладчика (команды Power-on для некоторых отладчиков).
Программа начинается с очистки тех битов и регистров, которые понадобятся при работе. Далее происходит инициализация встроенного аналогово-цифрового преобразователя. Загружается 16-разрядное число 4016 (%1000000) в регистр управления АЦП ADCLK, тем самым устанавливаем коэффициент деления частоты тактирования АЦП = 4. Рассмотрим подробнее биты регистра ADCLK.
Очистка необходимых регистров и ячеек памяти |
Инициализация встроенного аналогово-цифрового преобразователя (ADCLK) ← $20 |
Начало |
ДА |
НЕТ |
ДА |
Загрузка (clrtof)← 01111111 |
Запуск таймера-счетчика |
Прерывания от TIM08 – 1? |
Запись содержимого T1SC в аккумулятор А, очистка |
Разрешение прерывания по АЦП и установления бита, на который будет подаваться напряжение (ADSCR)← 01000000 |
Установка измеренного напряжения в ячейку napr |
Конец |
НЕТ |
Прерывания по АЦП? |
Рисунок 3.7. Блок-схема программы измерения напряжения
Ниже представлена программа для измерения напряжения с использованием АЦП:
romstart | equ | $8000 | |
ramstart | equ | $0040 | |
adscr | equ | $003с | |
adr | equ | $003d | |
adclk | equ | $003e | |
T1SC | equ | $0020 | |
T1MODh | equ | $0023 | |
T1MODl | equ | $0024 | |
adcin | equ | %01000000 | |
napr | equ | $0042 | |
org | romrtart | ||
adc: | mov | #$40,adclk | ;задание коэффициента деления частоты ;тактирования АЦП, равное 4 |
rts | |||
tim1: | mov | #%01111111,clrtof | ;запуск таймер-счетчик |
mov | #%01000010,T1SC | ||
mov | #$FF,T1MODh | ||
mov | #$FF,T1MODl | ||
rts | |||
main: | clr | a | ;очистка используемые ячейки памяти и |
clr | h | ;регистры | |
clr | x | ||
clr | clrtof | ||
bsr | adc | ;переход на подпрограмму adc | |
bsr | tim1 | ;переход на подпрограмму tim1 | |
clr | napr | ||
cli | ;очистка глобальную маску прерывания | ||
prer 1: | lda | T1SC | ;записываем содержимое T1SC в А |
and | clrtof | ;очищаем | |
sta | T1SC | ||
mov | #adcin,adscr | ;разрешаем прерывания по АЦП и установление;бита, на который будет подаваться напряжение | |
rti | |||
adcprer: | pshh | ||
mov | adr,napr | ;записываем измеренное напряжение в ячейку;napr | |
pulh | |||
rti | |||
dummy_isr: | rti | ||
end |
ADIV2 | ADIV1 | ADIV0 | ADICLK | |||||
Состояние до записи | ||||||||
после записи |
ADIV2-0: флаги включения предварительного делителя для таймера АЦП. Эти флаги управляют коэффициентом деления предварительного делителя таймера. При состоянии флагов ADIV2-0 = 0 1 0 коэффициент деления частоты тактирования АЦП = 4.
ADICLK: флаг выбора таймера для АЦП. С помощью этого флага выбирается источник синхронизации для АЦП. В нашем случае ADICLK = 0, т.е. для синхронизации выбран внешний таймер CGMXCLK.
Таким образом, частота тактирования АЦП = 8МГц/4 = 2МГц. После этого нужно запустить таймер-счетчик. При этом, установить частоту тактирования таймера-счетчика. Для этого нужно выбирать коэффициент деления, равный 4, при помощи записи в биты PS2–PS0 регистра T1SC кода 0 1 0. Частота тактирования в этом случае будет равна 8МГц/4 = 2МГц.
После того как таймер-счетчик остановится, в программе прерывание по таймеру счетчику разрешится АЦП-прерывание. Тут же задается бит PTB0, с которого будет поступать напряжение в микроконтроллер. Для этого в регистр состояния и управления АЦП ADSCR записывается следующий код: %01000000. Рассмотрим подробнее состояния битов регистра ADSCR.
COCO/ IDMAS | AIEN | ADC0 | ADCH4 | ADCH3 | ADCH2 | ADCH1 | ADCH0 | |
Состояние до записи | ||||||||
после записи |
Когда СОСО = 0, флаг СОСО доступен только для чтения. Флаг СОСО устанавливается при завершении преобразования.
AIEN = 1 – прерывание АЦП разрешено. Прерывание разрешается после завершения АЦП.
ADCO = 0 – выполняется однократное преобразование по выбранному каналу.
ADCH4-0: выбор канала. С помощью этих пяти флагов выбирается вход, информация которого будет преобразована. В нашем случае ADCH4-0 = 0 0 0 0 0 соответствует тому, что входом будет нулевой бит порта В PTB0.
В подпрограмме прерывания по АЦП измеренное напряжение записывается в специально отведенную ячейку, которая получила название napr.