-
Разработка управляющей программы
Алгоритм программирования по последовательному каналу:
Для программирования и проверки микроконтроллера AT89С52 в последовательном режиме рекомендуется следующий алгоритм.
- Выполнить последовательность включения питания: Подать на выводы VCC и GND напряжение питания, причем выводы RESET и SCK во время подачи питания должны быть на уровне 0. Если к выводам XTAL1 и XTAL2 не подсоединен кварцевый кристалл, то тактовый сигнал подается на вывод XTAL1. В ряде систем программирующий не может гарантировать нахождение вывода SCK на низком уровне в течение всего периода подачи питания. В этом случае на вывод RESET должен быть подан положительный импульс длительностью не менее двух циклов XTAL1 после того как на SCK будет установлен уровень 0.
- Сделать выдержку не менее 20 мс и разрешить программирование в последовательном режиме посылкой на вывод PE0 (PDI/RXD).последовательной команды «Разрешить программирование».
- При выдаче третьего байта команды «Разрешить программирование»., значение, установленное как вторым байтом ($ 53), будет возвращено в течение передачи третьего байта. Если значение $53 не будет возвращено необходимо подать на вывод SCK положительный импульс и вновь послать команду «Разрешить программирование». Если возврат значения $53 не будет получен в течение 32 попыток, то связь устанавливалась с неработающим устройством.
- Если была выполнена очистка кристалла (выполняется если необходимо очистить Flash память) делается выдержка 10 мс, подается положительный импульс на вывод RESET и начинается выполнение алгоритма с пункта 2.
- Flash память программируется сразу по одной странице. Страница загружается по одному байту подачей 7 младших битов адреса и байта данных вместе с командой «Загрузить страницу памяти программ». Страница памяти программ сохраняется загрузкой команды «Записать страницу памяти программ» вместе с 9 старшими битами адреса.
- Матрица EEPROM программируется по одному байту загрузкой адреса и данных вместе с с соответствующей командой «Записать». Соответствующие ячейки памяти EEPROM, перед записью новых данных, автоматически очищаются. Следующий байт может быть записан через 4 мс (при напряжении питания 2,7 В) или через 1 мс мс (при напряжении питания 5,0 В).
- Любой байт в области памяти может быть проверен командой «Читать», которая возвращает содержимое по заданному адресу через последовательный выход вывода PE1(PDO/TXD).
- По полном завершении сеанса программирования, для перехода к нормальной работе, вывод RESET должен быть установлен на высокий уровень.
- Выполнить последовательность отключения питания (при необходимости). Установить низкий уровень на выводе XTAL1 (если не использовался кварцевый кристалл). Установить высокий уровень на выводе RESET. Отключить напряжение питания VCC.
При последовательном чтении данных из микроконтроллеров AT89С52 данные тактируются по падающему фронту на SCK.
Программирование Flash и EEPROM памяти
Микроконтроллеры AT89С52 оснащены внутрисистемно программируемой Flash памятью, емкостью 64/128 Кбайт, и 2/4 Кбайтами EEPROM памяти данных. При поставке микроконтроллеров и встроенная Flash память программ и EEPROM память данных находятся в очищеном состоянии (т.е. содержимое в состоянии $FF) и они готовы к программированию. Приборы поддерживают режим высоковольтного (12 В) параллельного программирования и режим низковольтного последовательного программирования. Напряжение программирования 12 В используется только если программирование разрешено, в ином случае ток по этому выводу не потребляется. Режим последовательного программирования является обычным способом загрузки программ и данных в микроконтроллеры, находящиеся непосредственно в системе пользователя.
Матрица памяти программ микроконтроллеров AT89С52 организована из 256/512 страниц по 256 байт каждая. При программировании Flash памяти данные программы фиксируются в буфере страницы, что позволяет программировать сразу целую страницу данных программы в любом из режимов программирования.
Матрица EEPROM памяти данных микроконтроллеров программируется по-байтово (байт - за - байтом) во всех режимах программирования. В последовательном режиме программирования встроенная функция самотактирования EEPROM выполняет автоматическую предварительную очистку каждого программируемого байта.
Программирование Flash памяти
Flash память микроконтроллеров AT89С52 организован из 256/512 страниц по 256 байт каждая. При программировании Flash памяти данные программы фиксируются в буфере страницы, что позволяет единовременно программировать целую страницу. Ниже приведена процедура, описывающая программирование всего объема Flash памяти.
A: Загрузка команды программирования Flash памяти (Program Flash)
- Установить биты XA1 и XA0 в состояние 1 и 0, соответственно. Эта установка разрешает загрузку команды.
- Установить бит BS1 в состояние 0.
- Установить биты PB(7 - 0) в состояние 0001 0000. Это команда программирования Flash памяти.
- Подать на вывод XTAL1 положительный импульс. Этим импульсом загружается команда.
B: Загрузка младшего байта адреса - Установить биты XA1 и XA0 в состояние 0 и 0. Эта установка разрешает загрузку адреса
- Установить бит BS1 в состояние 0.
- Установить в битах PB(7 - 0) младший байт адреса ($00 - $FF).
- Подать на вывод XTAL1 положительный импульс. Этим импульсом загружается младший байт адреса.
C: Загрузка байта данных
- Установить биты XA1 и XA0 в состояние 0 и 1, соответственно. Эта установка разрешает загрузку данных.
- Установить в битах PB(7 - 0) младший байт данных ($00 - $FF).
- Подать на вывод XTAL1 положительный импульс. Этим импульсом загружается байт данных.
D: Фиксация младшего байта данных - Установить бит BS1 в состояние 0. Эта установка выбирает младший байт данных.
- Подать на вывод PAGEL положительный импульс. Этим импульсом загружается байт данных.
E: Загрузка байта данных - Установить биты XA1 и XA0 в состояние 0 и 1, соответственно. Эта установка разрешает загрузку данных.
- Установить в битах PB(7 - 0) старший байт данных ($00 - $FF).
- Подать на вывод XTAL1 положительный импульс. Этим импульсом загружается байт данных.
F: Фиксация старшего байта данных - Установить бит BS1 в состояние 1. Эта установка выбирает старший байт данных.
- Подать на вывод PAGEL положительный импульс. Этим импульсом загружается байт данных.
G: Пункты с B по F повторяются 128 раз до полного заполнения буфера страницы.
H: Загрузка старшего байта адреса - Установить биты XA1 и XA0 в состояние 0 и 0, соответственно. Эта установка разрешает загрузку адреса.
- Установить бит BS1 в состояние 1. Эта установка выбирает старший байт адреса.
- Установить в битах PB(7 - 0) старший байт адреса Подать на вывод XTAL1 положительный импульс. Этим импульсом загружается старший байт адреса.
I: Программирование страницы
- Подать на вывод WR отрицательный импульс. Этим импульсом запускается программирование страницы данных. Вывод переходит RDY/BSY на низкий уровень.
- Ожидать перехода вывода RDY/BSY на высокий уровень.
J: Завершение программирования страницы.
- Установить биты XA1 и XA0 в состояние 1 и 0. Эта установка разрешает загрузку команды.
- Установить биты PB(7 - 0) в состояние 0000 0000. Это команда «Нет операции».
- Подать на вывод XTAL1 положительный импульс. Этим импульсом загружается команда и сбрасываются все внутренние сигналы записи.
K: Пункты с A по J повторяются 256/512 раз, или до тех пор, пока все данные не будут запрограммированы. Блок схема разрабатываемой программы приведена в приложении 4.
Она состоит из блока начальных установок, в который входят процедуры обнуления еременных используемых в программе, установки направления портов, установки нужного коэффициента предделителя, тест работоспособности индикаторов. Блока вывода на индикацию, в котором осуществляется преобразование двоичного кода в код семисегментных индикаторов, формируются необходимые задержки времени для динамической индикации, также контроль вывода выбранного пользователем режима индикации. Самая ответственная часть программы это обработка прерывания полученного от встроенного таймера микроконтроллера от неё зависит точность срабатывания устройства.
Для нормальной и эффективной работы устройства в системе видеонаблюдения необходимо правильно ввести программу в память. Рассмотрим пример. Допустим по звонку в дверь требуется включить телевизор на 15 с, после чего выключить, а видеомагнитофон включить на запись в течение 30 с и затем тоже выключить. Поскольку некоторые телевизоры не сразу после включения способны воспринять команду с пульта ДУ, надо выдержать паузу в 5 с перед включением видеовхода телевизора, к которому подключен видеоглазок. Текст программы на языке программирования «Ассемблер» приведен в приложении А.
Приложение
Приложение А – Схема электрическая принципиальная
Приложение Б – Структурная схема микроконтроллера
Приложение В – Блок-схема алгоритма управляющей программы
Приложение Г – Текст управляющей программы на языке «Ассемблер»
LIST p=16F84A ; указатель процессора
include <p16F84A.inc>
org 0x00 ; Вектор сброса
Goto Start
;***************************************************************
org 004 ;Начало процедуры обработки прерывания
movwf temp ; Сохранение рабочего регистра W в регистре temp
clrwdt ;Очистка сторожевого таймера для предотврашения
call Int1 ; сброса процессора каждый 18мс
movlw b'10100000' ; Разрешаем прерывания от таймера
movwf INTCON ;
movf temp,w ;Востанавливаем значение рабочего регистра
clrwdt ;Очистка сторожевого таймера
return ;Выход из процедуры обработки прерывания
;****************************************************************
org 0x10
segment ; Таблица преобразования DEC -> семисегментный код.
CLRF PCLATH
ADDWF PCL, F
dt 07E, b'00001100', 0B6, 09E, 0CC, 0DA, 0FA, 00E, 0FE, 0DE
Data1 ;*************десятки
CLRF PCLATH
ADDWF PCL, F
;0 1 2 3 4 5 6 7 8 9
dt 0,0,0,0,0,0,0,0,0,0
dt 1,1,1,1,1,1,1,1,1,1
dt 2,2,2,2,2,2,2,2,2,2
dt 3,3,3,3,3,3,3,3,3,3
dt 4,4,4,4,4,4,4,4,4,4
dt 5,5,5,5,5,5,5,5,5,5
Data2 ;***********единицы
CLRF PCLATH
ADDWF PCL, F
;0 1 2 3 4 5 6 7 8 9
dt 0,1,2,3,4,5,6,7,8,9 ;0
dt 0,1,2,3,4,5,6,7,8,9 ;10
dt 0,1,2,3,4,5,6,7,8,9 ;20
dt 0,1,2,3,4,5,6,7,8,9 ;30
dt 0,1,2,3,4,5,6,7,8,9 ;40
dt 0,1,2,3,4,5,6,7,8,9 ;50
; Программные регистры:
skan1 equ 20 ;рег хранения RB1,2
clok1 equ 21 ; хранение часов
sek equ 22 ;регистр хранения секунд
min equ 23 ;регистр хранения минут
cl_k equ 24
Dig_x equ 25 ; Значение X0:00 для индикации.
Dig_y equ 26 ; Значение 0X:00 для индикации.
Dig_z equ 27 ; Значение 00:X0 для индикации.
Dig_exp equ 28 ; Значение 00:0X для индикации.
cnt1 equ 29 ;переменная исп для задержки времени
cnt2 equ 2A ;переменная исп для задержки времени
cnt_r equ 2B ;переменная исп для задержки времени
temp equ 2C
clok2 equ 2D
temp1 equ 2E
n1 equ 2f
n2 equ 30
Start ; Начальная инициализация.
clrw
bsf STATUS,RP0 ; Обращение к банку 1.
clrf PORTA ; Обнулить порт А.
clrf PORTB ; Обнулить порт В.
movlw b'00010000'
movwf TRISA ; RA0 - RA3 выходы, RA4 вход.
movlw b'00000001'
movwf TRISB ; RB1 - RB7 выходы.RB0 вход
movlw b'00000101' ;коэффициен предделителя 64
movwf OPTION_REG
bcf STATUS,RP0 ; Обращение к банку 0.
movlw b'10100000'
movwf INTCON
clrf min
clrf sek
clrf cl_k
movlw 0
movwf TMR0
movlw 01 ; Для контроля дисплея
movwf Dig_x
movlw 02 ; загрузить во все регистры индикации 8.
movwf Dig_y
movlw 03
movwf Dig_z
movlw 04
movwf Dig_exp
movlw .131
movwf clok1
movwf TMR0
movlw .1
movwf temp1
Start1 ; Основной цикл программы.
movlw 19 ; Установить счетчик циклов индикации.
movwf cnt_r
loop1 clrwdt
call refresh ;индикаторы.
decfsz cnt_r, f
goto loop1
;***присвоение значения регистрам индикации в зависимости от режима ;индикации******
clrwdt
btfss temp1,0
call Temp_min
btfsc temp1,0
call Temp_clk
;******присвоение значения регистрам индикации
movf n1,0
call Data1
movwf Dig_x
movf n1,0
call Data2
movwf Dig_y
movf n2,0
call Data1
movwf Dig_z
clrwdt
movf n2,0
call Data2
movwf Dig_exp
;********клавишы установки режима индикации и времени*******
call Delay
btfss PORTA,4 ;сканируем клавишу установки режима RA4 вывод 3
incf temp1,1 ;прибавляем к темпу 1
btfss PORTB,0 ;клавиша установки времени RB0 вывод 6
call Min_clk
goto Start1
;************************************************************
Temp_min
movf min,0
movwf n1
movf sek,0
movwf n2
return
;************************************************************
Temp_clk
movf cl_k,0
movwf n1
movf min,0
movwf n2
return
;****************выбор прибавить минуты(0) или часы(1)***********
Min_clk
clrwdt
btfss temp1,0
incf min,1
btfsc temp1,0
incf cl_k
;*******проверка 60 мин 24 часа*****************
movf min,0
sublw .60
btfsc STATUS,Z
clrf min
movf cl_k,0
sublw .24
btfsc STATUS,Z
clrf cl_k
clrwdt
return
Sek ;*****************деление на125
movlw .131 ;записываем 131 т.к 256-125=131
movwf clok1
incfsz sek
movf sek,0
sublw .60
btfsc STATUS,Z
call Min
return
Min
clrf sek
incfsz min
movf min,0
sublw .60
btfsc STATUS,Z
call Clok
retfie
Clok
clrf min
incfsz cl_k
movf cl_k,0
sublw .24
btfsc STATUS,Z
clrf cl_k
retfie
Int1 ;процедура обработки прерывания
movlw .131 ;записываем 131 т.к 256-125=131
addwf TMR0,1 ;256(максимальное значение таймера)
incfsz clok1 ;125(нужный коэффициен деления)
return
call Sek
return
;***********************Вывод на индикатор*************
refresh ; Процедура сканирования индикации.
movf Dig_x, W ; Значение деситых.часов для индикации.
call segment ; Преобразование DEC -> семисегментный код.
movwf PORTB ; Вывод цифры на индикатор.
bcf PORTA, 0 ; Активизировать индикатор.
call Delay ; Задержка времени для сканирования.
bsf PORTA, 0 ; Отключить индикатор.
movf Dig_y, W ; Значение ед.часов для индикации.
call segment ; Преобразование DEC -> семисегментный код.
movwf PORTB ; Вывод цифры на индикатор.
bcf PORTA,1 ; Активизировать индикатор.
call Delay ; Задержка времени для сканирования.
bsf PORTA,1 ; Отключить индикатор.
movf Dig_z, W ; Значение десят.минут для индикации.
call segment; Преобразование DEC -> семисегментный код.
movwf PORTB ; Вывод цифры на индикатор.
bcf PORTA,2 ; Активизировать индикатор.
call Delay ; Задержка времени для сканирования.
bsf PORTA,2 ; Отключить индикатор.
movf Dig_exp, W ; Значение ед.минут.
call segment; Преобразование DEC -> семисегментный код.
movwf PORTB ; Вывод цифры на индикатор.
bcf PORTA,3 ; Активизировать индикатор.
call Delay ; Задержка времени для сканирования.
bsf PORTA,3 ; Отключить индикатор.
return
; ************************************************************
Delay ; Подпрограмма задержки времени
clrwdt
movlw .5 ; для сканирования индикации.
movwf cnt1
nop
beta movlw .150
movwf cnt2
Alfa nop
nop
decfsz cnt2, f
goto Alfa
nop
nop
decfsz cnt1, f
goto beta
nop
return
; *******************************************************
end