Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовой проект / Микропроцессоры чистовик.doc
Скачиваний:
24
Добавлен:
21.02.2014
Размер:
378.88 Кб
Скачать
  1. Разработка управляющей программы

Алгоритм программирования по последовательному каналу:

Для программирования и проверки микроконтроллера 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

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.