Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Основные теоретические сведения




Микроконтроллер имеет три независимых адресных пространства с линейной организацией: память программ, ОЗУ и ППЗУ.

Поскольку каждая машинная команда имеет длину два байта, память программ (рис.1.а) организована в виде линейной последовательности шестнадцатиразрядных слов. Учитывая организацию памяти программ, адрес может принимать значение от 0 до 4095 ($FFF в шестнадцатеричной записи).

 

а) б) в)

Рис.1 – Распределение памяти микроконтроллера AT90S8535

 

Изменение содержимого памяти программ в изучаемом микроконтроллере возможно только внешним устройством (программатором). При этом допускается до 1000 циклов перепрограммирования.

Адресное пространство ОЗУ (рис.1 б) имеет сложную структуру, поскольку включает в себя адреса регистров общего назначения, адреса периферийных устройств и адреса ячеек оперативной памяти. Поскольку ОЗУ является статическим, доступ к нему происходит с высокой скоростью.

ППЗУ (рис.1 в) представляет собой постоянную память данных с возможностью электрического перепрограммирования. Изменение ППЗУ возможно как внешним программатором, так и самим контроллером в процессе выполнения программы. Доступ к ППЗУ осуществляется сравнительно медленно. Допускается до 10000 циклов перепрограммирования ППЗУ.

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

Рис.2. – Относительная адресация РОН и периферийных устройств.

 

Поскольку микроконтроллеры архитектуры AVR построены на основе RISС–архитектуры, доступ к различным областям памяти осуществляется посредством различных команд.

Для пересылки данных между регистрами общего назначения используется команда MOV. Загрузка значения в регистр общего назначения выполняется командой LDI. Для обмена данными между регистрами общего назначения и регистрами управления периферийными устройствами принято использовать команды IN (считывание данных из регистра периферийного устройства) и OUT (пересылка данных в регистр периферийного устройства). Для доступа к ячейкам ОЗУ используются команды LD (загрузить данные из ячейки ОЗУ) и ST (сохранить данные в ячейке ОЗУ).

Для доступа к ячейкам ППЗУ используется специальная процедура.

;***************************************************************

.include "8535def.inc"

 

.def tflags = R15                ;регистр временного хранения флагов

.def temp1 = R16              ;рабочий регистр основной программы

.def temp2 = R17              ;рабочий регистр в подпрограммах

.def symvol = R18                      ;регистр для данных

.def counter = R19                      ;счетчик индексов

.def tempr = R25               ;дополнительный временный регистр

 

;------------------------сегмент данных - описание переменных

.Dseg

varD:     .BYTE 8 ;резервируем массив данных в ОЗУ

;------------------------завершение сегмента данных

;------------------------сегмент кода - начало программы

.Cseg

;-----------------------описание векторов прерываний

.org 0x000

    rjmp H_RESET                ;Reset Handler

;-----------------------завершение описания векторов прерываний

;------------------------начало секции основной программы

.org 0x16

H_RESET:

;------------------------начало инициализации стека

    ldi temp1,low(RAMEND)

    out SPL,temp1                   

    ldi temp1,high(RAMEND)

    out SPH,temp1                            

;------------------------окончание инициализации стека

;------------------------обрабатываем массив данных из памяти программ

    clr counter                     ;обнуляем счетчик

    ldi ZH,high(message1<<1) ;загружаем начальный адрес

    ldi ZL,low(message1<<1) ;массива в памяти программ

    sei                                      ;запрещаем прерывания

mess1:

    lpm symvol,Z+                ;загружаем байт из массива в памяти

    rcall obr_sym                   ;обрабатываем в подпрограмме

    inc counter                     ;увеличиваем счетчик на единицу

    cpi counter,17                ;проверяем количество        

    brlo mess1                          ;если не все, то повторяем цикл

;------------------------завершение обработки массива данных из памяти программ

;------------------------запись данных в ОЗУ

    ldi tempr,0x01              ;загружаем значение для первой ячейки ОЗУ

    ldi temp2,0x03

    clr counter                     ;обнуляем счетчик

    ldi ZH,high (varD)        ;загружаем начальный адрес ОЗУ с данными

    ldi ZL,low (varD)

bz:    

    st  Z+,tempr                  ;сохраняем данные в ОЗУ с указанным адресом

    add tempr,temp2                      ;увеличиваем значение, загружаемое в ОЗУ

    inc counter                     ;увеличиваем значение счетчика

    cpi counter,8                  ;проверяем количество записанных разрядов

    brlo bz                       ;если записаны не все, то повторяем цикл записи

;--------------------- завершение записи данных в ОЗУ

    rcall ppzu                         ;вызываем программу для переписывания

                                                   ;данных из ОЗУ в ППЗУ      

 

;------------------------начало подпрограммы обработки символа

obr_sym:

    nop

ret                                               ;obr_sym

;------------------------завершение подпрограммы обработки символа

 

;------------------------подпрограмма сохранения данных из ОЗУ в ППЗУ

ppzu:

    cli                                      ;запрещаем прерывания

    ldi YL,0x00                   ;загружаем начальный адрес ППЗУ

    ldi YH,0x00

    ldi ZH,high (varD)        ;загружаем начальный адрес ОЗУ с данными

    ldi ZL,low (varD)

bgn:

    sbic eecr,EEWE

    rjmp bgn                           ;ожидаем готовность ППЗУ

    out EEARL,YL              ;устанавливаем адрес ППЗУ

    out EEARH,YH

    ld tempr,Z+                  ;загружаем данные из ОЗУ с указанным адресом

    out EEDR,tempr                     ;после чего увеличиваем значение адреса ОЗУ

    sbi EECR,EEMWE           

    sbi EECR,EEWE

    inc YL                            ;увеличиваем значение адреса ППЗУ

    cpi YL,8                         ;проверяем количество записанных разрядов

    brlo bgn                       ;если записаны не все, то повторяем цикл записи

    sei                                      ;разрешаем прерывания      

ret ; ppzu                                         ;выходим из подпрограммы

;------------------------завершение подпрограммы сохранения данных из ОЗУ в ППЗУ

 

message1:

.db 0x50,0x65,0xB6,0xB8,0xBC,0x20,0x63,0xC0,0xB5,0xBF,0x61,0x20,0x20,0x20,0x20,0x20,0x20;

;***************************************************************

Команда Описание Время в тактах Время в микросек.
rjmp Относительный переход 2 0.50
ldi Загрузить константу 1 0.25
out Запись в порт 1 0.25
clr Очистить регистр 1 0.25
sei Установить флаг прерываний 1 0.25
lpm Загрузка из программной памяти 3 0.75
rcall Относительный вызов подпрограммы 3/4* 0.75/1
inc Инкрементировать значение регистра 1 0.25
cpi Сравнить с константой 1 0.25
brlo Перейти если меньше 1/2 0.25/0.50
st      
add Суммирование без переноса 1 0.25
nop Нет операции 1 0.25
ret Возврат из подпрограммы 4/5* 1/1.25
cli Очистить флаг прерываний 1 0.25
sbic Пропустить если бит в порту очищен 1/2/3 0.25/0.50

 

 










Последнее изменение этой страницы: 2018-05-29; просмотров: 161.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...