Разработка программного обеспечения
В соответствии с составленной блок-схемой алгоритма работы кодового замка написано программное обеспечение для микроконтроллера MB90F591G. Разработка программного обеспечения производилась в интегрированной среде разработки SOFTUNE WORKBENCH на языке Ассемблер. Отладка исходного кода и проверка значений регистров в заданных точках работы программы, показала работоспособность и устойчивость алгоритма. Исходный код программы был скомпилирован и собран с использованием среды SOFTUNE WORKBENCH. Полученный исполняемый модуль готов к загрузке в микроконтроллер MB90F591G. Ниже приведён исходный код программы:
// main.asm
// software to control electronic lock based on MB90F591G MCU
.PROGRAM Lock
#include C:\SoftUne\Mb90V590.h
.EXPORT _main
// variables
.SECTION DATA_MAIN, DATA, ALIGN=2
KodZ .RES.W 1 // predefined code
KodV .RES.W 1 // user input code
Nr .RES.B 1 // index of current digit (left to right)
Nn .RES.B 1 // number of times the button was pressed
alarmMode .RES.B 1 // alarm mode flag
isAwake .RES.B 1 // is awake flag, active during the code input
counter .RES.B 1
timerCounter .RES.B 1 // timer 0 interrupt counter
out .RES.B 1
// ----------------------------
// Timer 0 interrupt processing
// ----------------------------
.SECTION INTR, CODE, ALIGN=2
intTmr:
INC timerCounter
// if alarmMode active wait until 10s
BBC alarmMode:0, _skipAlarm
// if 10s, turn of the alarm
MOV A, timerCounter
CMP A, #100
BEQ _turnOffAlarm
RETI
_skipAlarm:
// if 6s, go to the next digit
MOV A, timerCounter
CMP A, #60
BEQ _nextDigit
RETI
_turnOffAlarm
CLRB alarmMode:0
// turn off the LED
SETB PDR8:2
// set base interval of timer 1 to 0.5 s
MOVW TMRLR1, #62500
RETI
_nextDigit:
// turn off the LED
CLRB PDR8:1
// start the timer 1
CLRB TMCSR1:2
SETB TMCSR1:0
// wait for 0.5s
WBTS TMCSR1:2
// reset the timer counter
MOV timerCounter, #0
MOV A, Nr
MOV counter, A
MOVW RW0, #10
MOVW A, Nn
// A = Nn * pow(10, Nr)
powerLoop:
CBNE counter, #0, powerContinue
JMP powerBreak
powerContinue:
MULW A, RW0
DEC counter
JMP powerLoop
powerBreak:
// A = KodV + Nn * pow(10, Nr)
ADDW A, KodV
MOVW KodV, A
// if user entered the whole code, check the code
MOV A, #0
CMP A, Nr
BEQ _checkTheCode
DEC Nr
MOV Nn, #0
RETI
_checkTheCode:
// we are not in code input mode
CLRB isAwake:0
// if KodZ == KodV, open the lock
MOV A, KodZ
CMP A, KodV
BEQ _openTheLock
// if KodZ != KodV, turn on the alarm
CALL _turnOnAlarm
RETI
_openTheLock:
// turn on the magnet
SETB PDR8:0
// start the timer 1
CLRB TMCSR1:2
SETB TMCSR1:0
// wait for 0.5s
WBTS TMCSR1:2
// turn off the magnet
CLRB PDR8:0
// turn off the LED
CLRB PDR8:2
RETI
// ----------------------------
// ----------------------------
// button INT0 interrupt processing
// ----------------------------
.SECTION INTR, CODE, ALIGN=2
intINT0:
// if in code input mode jump to code input
BBS isAwake:0, _pressCounter
SETB isAwake:0
MOV Nr, #2
MOV Nn, #0
MOVW KodV, #0
// turn on the LED
SETB PDR8:2
// reset the timer counter
MOV timerCounter, #0
RETI
_pressCounter:
INC Nn
RETI
// button INT0 interrupt vector setup
.SECTION INTVECTMR0, CONST, LOCATE=H'FFFFCC
.DATA.L intINT0
// Timer 0 interrupt vector setup
.SECTION INTVECINT0, CONST, LOCATE=H'FFFFA0
.DATA.L intTmr
// ----------------------------
// ----------------------------
.SECTION CODE_MAIN, CODE, ALIGN=2
// turn on alarm
_turnOnAlarm:
SETB alarmMode:0
// turn on the LED
SETB PDR8:2
// set base interval of timer 1 to 3.52 ms => 440 Hz
MOVW TMRLR1, #284
RET
// init ports and variables
_init:
MOV DDR2, #0 // set port 2 to input
MOV DDR8, #H'FF // set port 8 to output
MOV PDR8, #0
// set Timer 0 interrupt level t0 4
MOV H'0000B6, #4
// set INT0 interrupt level t0 3
MOV H'0000B0, #3
// set max interrupt level to 7 (all interrupts active)
MOV ILM, #7
// enable interrupts
OR CCR, #B'01000000
// set the predfined code
MOVW KodZ, #566
// set the input code to 0
MOVW KodV, #0
MOV Nr, #2
MOV Nn, #0
MOV alarmMode, #0
MOV isAwake, #0
// set base interval of timer 0 to 0.1 s
MOVW TMRLR0, #12500
// turn on the timer 0 and setup it to F = 1/32 * 4 MHz = 125 kHz
MOVW TMCSR0, #H'81A
// set base interval of timer 1 to 0.5 s
MOVW TMRLR1, #62500
// turn on the timer 1 and setup it to F = 1/32 * 4 MHz = 125 kHz
MOVW TMCSR1, #H'80A
// reset the timer counter
MOV timerCounter, #0
RET
_main:
// setup variables and interrupts
CALL _init
_loop:
BBS alarmMode:0, _alarmLoop
JMP _loop
// play alarm tone
_alarmLoop:
MOV A, PDR8
XOR A, #2
MOV PDR8, A
// start the timer 1
CLRB TMCSR1:2
SETB TMCSR1:0
// wait for 3.25 ms
WBTS TMCSR1:2
BBC alarmMode:0, _loop
JMP _alarmLoop
.END
Выводы
Микроконтроллеры семейства F2MC-16LX предоставляют широкие возможности для создания электронных систем безопасности и ограничения доступа в помещение. Универсальные порты ввода/вывода микроконтроллера обеспечивают возможность управления разнообразными периферийными устройствами. Подключение мощной нагрузки осуществляется путём использования электронных ключей на биполярных и полевых транзисторах. Встроенный механизм прерываний микроконтроллера позволяет сохранить ясную и логичную структуру кода программы при реализации интерфейса взаимодействия с пользователем.
Спроектирован кодовый замок, ограничивающий доступ в помещение, на базе микроконтроллера MB90F591G. Управление замком осуществляется с помощью одной кнопки, подключённой к универсальному порту ввода/вывода микроконтроллера. Для информирования пользователя о текущем состоянии замка используется светодиод. Предусмотрена вывод звукового сигала тревоги через низкоомный динамик, управление которым, осуществляется с помощью биполярного транзистора, работающего в режиме электронного ключа.
Разработана принципиальная схема и рассчитаны параметры её элементов. На основе технического задания создан алгоритм работы кодового замка, обеспечивающий ввод трёхзначного кода и проверку его на соответствие заданному коду. На языке программирования FASM907S написана программа, реализующая разработанный алгоритм. В среде SOFTUNE WORKBENCH произведена сбора и компиляция программы, а также тестирование c помощью отладчика среды разработки. Проверка работы программы с использованием имитации запросов прерывания показало работоспособность и устойчивость алгоритма.
