Ввод информации в микроконтроллерную систему

К задачам ввода относятся как задачи получения от оператора информации о требуемых режимах и настройках системы, так и задачи выделения информации, поступающей в виде сигналов (амплитудных, частотных и других) с датчиков объекта управления.

Часто для переключения каналов используются двоичные ключи. На рис. 3.2 показана схема подключения контакта двоичного датчика ко входу PTD0 порта ввода-вывода PTD MC68HC908GP32. Если в разряд 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НС908GP32 показана на рис. 3.5.

PTA 4   PTA 5   PTA 6   PTA 7  
PTA 1 PTA 2 PTA 3
*
#

Рис. 3.5. Схема подключения клавиатуры к выводам МС68НС908GP32

Если контроль состояния клавиатуры осуществляется по опросу, то необходимо сконфигурировать выводы управления строками РТА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.

Наши рекомендации