Лабораторная работа № 1
Исследование архитектуры однокристального RISC-микроконтроллера PIC16C58A
Цель работы: Знакомство с организацией, программно-доступными элементами и системой команд однокристального микроконтроллера (ОМК) PIC16C58A, построенного с использованием RISC-архитектуры.
Программа работы:
1. Загрузить интегрированную среду MPLAB и настроить на режим эмуляции однокристальных микроконтроллеров PIC16C58A. Создать проект, реализующий приведенные ниже задания.
2. Освоить основные приемы написания программы для PIC-контроллера, а также ее ввода и отладки с использованием пакета MPLAB, на примере тестовой программы.
3. Задания варианта 2:
· Переслать значение таймера в ячейку 34Н без потери содержимого регистра W.
· Вычесть число, находящееся в ячейки 10Н, из числа, находящегося в ячейке 11Н, результат поместить ячейку 12Н.
· Инвертировать 4 младших бита порта А (В).
· Если бит 0 (1,2,3,4,5,6,7) порта В установлен, то инвертировать значение ячейки 35Н.
Ход выполнения работы.
Настройка MPLAB.
Создаём новый проект: Project->New, задаем имя проекта. Создаем новый файл, в котором пишем код программы, сохраняем его под своим именем под расширением asm, добавляем в проект во вкладку Source. В Header добавляем файл с константами определёнными под данный тип микропроцессора, для нашего микроконтроллера это будет P16C5X.INC.
Определим для данного проекта микроконтроллер, для этого зайдем в пункт меню Configure->Select Dives укажем наш тип микроконтроллера PIC16C58A. Также необходимо включить среду эмулирования работы МК для этого выберем MPLAB SIM в меню Debugger->Select Tool.
Для просмотра состояния регистров и памяти выберем в меню View окна File Registers и Special Function Registers
|
Рисунок 1. Главное окно MPLAB с настроенным проектом.
Освоение базовых принципов написания и отладки программы в MPLAB.
Прокомментировать каждую строчку программы для полного понимания работы программы.
; Тестовая программа для ОМК PIC16C58A. Располагается в памяти,
; начиная с адреса 50H.
; Цикл Loop выполняется 7 раз, после этого программа
; запускается с начала. В каждом цикле выполняются вложенные
; процедуры ReduceA и DoubleB.
;Задание типа PIC-;контроллера и формата
;выходного файла ассемблера(НЕХ-формат)
list p=16c58a, f=inhx8m
ScratchPadRam equ 0x10; Нач. адрес размещения переменных в ОЗУ
AA equ ScratchPadRam+0; Переменная AA размещается в 0x10
BB equ ScratchPadRam+1; Переменная BB размещается в 0x11
CC equ ScratchPadRam+2; Переменная BB размещается в 0x12
W equ 0; w присваивается 0
Org 0;Начальный адрес 0
Goto start; безусловный переход к процедуре start
Org 0x50;Начальный адрес 50Н
Start; процедура start
Movlw.255;Пересылка числа 255 в регистр W
movwf AA;AA=255
Movlw.1;Пересылка числа 1 в регистр W
movwf BB;BB=1
Movlw.7;Пересылка числа 7 в регистр W
movwf CC;CC=7
Loop; процедура loop
Call ReduceA; Выполнять 7 циклов
decfsz CC;CC=CC-1
Goto loop; переход в начало подпрограммы
Goto start; переход на начало программы
ReduceA; процедура ReduceA
Swapf BB; обмен местами полу-байт регистра BB сохранение в BB
Swapf BB,w; обмен местами полу-байт регистра BB результат сохранён в W
Swapf BB; обмен местами полу-байт регистра BB сохранение в BB
subwf AA; AA=AA-BB
Call DoubleB; вызов процедуры DoubleB
Retlw 0;возврат из процедуры с записью литерой в W
DoubleB; процедура DoubleB
Swapf BB; обмен местами полу-байт регистра BB сохранение в BB
|
Swapf BB,w; обмен местами полу-байт регистра BB результат сохранён в W
Swapf BB; обмен местами полу-байт регистра BB сохранение в BB
addwf BB;BB=BB+BB
Retlw 0;возврат из процедуры с записью литерой в W
End; конец программы
Выполнение задания.
Задание 1. Переслать значение таймера в ячейку 34Н без потери содержимого регистра W.
include <P16C5X.INC>; подключаем константы
Org 0; начальный адрес программы
MOVLW 20h;записать число 20h в регистр W
MOVWF FSR;перенести из W в FSR
;6-5 бит 01 позволяет использовать второй банк памяти
MOVF TMR0, 0; перемещаем значение счётчика в W
MOVWF 34h; перенос из W в адрес памяти 34h
End; конец программы
Задание 2. Вычесть число, находящееся в ячейки 10Н, из числа, находящегося в ячейке 11Н, результат поместить ячейку 12Н.
Org 0; начальный адрес программы
MOVLW.9;записать число 9 в регистр W
MOVWF 10h;перенести из W в 10h
MOVLW.12;записать число 12 в регистр W
MOVWF 11h;перенести из W в 11h