Биты RBPU – включение подтягивающих резисторов на входах порта B.
INTEDG – выбор активного фронта на входе внешнего прерывания.
TOCS, TOSE, PSA – виды управления таймером ноль.
PS2, PS1, PS0 – задают коэффициент деления предделителя.
Программирование.
Сложить регистр 30 и 31 и поместить в регистр 32.
list p=16f628
#include <p16f628.inc>
REG1 equ30
REG2 equ31
org 00
movf 30,w
addwf 31,w
movwf 32
end
Согласно основной теореме структуры программирования, алгоритм любой сложности может быть построен с помощью трех управляющих конструкций:
- следования;
- цикла;
- альтернативы.
Следование - команды выполняется одна за другой. Все процессоры имеют поддержку следования (декодеры и счетчики).
Цикл - для удобства программирования используются несколько типов циклов:
- цикл с предпроверкой;
- цикл с постпроверкой (если количество проходов заданно равным «0», то тело цикла выполняется один раз);
- цикл с параметром - цикл повторяется неопределенное количество раз, если не выполняется условие;
- цикл с выходом из середины.
Альтернативы:
- полная;
- не полная;
- множественное ветвление.
Подпрограмма
Пример программы с арифметическими действиями:
Сложить два регистра 20 и 21,добавить число 3 и результат поместить в 22.
list p=16f628
#include <p16f628.inc>
RE1 equ20
RE2 equ21
SUM equ22
const set.3
const2 setconst+.5
_ _ CONFIG
org 00
movf 20,w
addwf 21,w
addlw .3
movwf 22
sleep
end
cblock 20
RE1
RE2
sum
endc
#define growth
addlw con
movf RE1,w
addwf RE2,w
growth
movwf sum
sleep
end
LEDS_PORT equPORTB
MY_LED equ5
#define zaz bsf LEDS.PORT,MY_LED
#define pot bsf LEDS.PORT,MY_LED
bsf LEDS.PORT,MY_LED
bcf LEDS.PORT,MY_LED
btfss - пропустить следующую команду, если такой бит в таком реестре отсутствует
btfsr- пропустить следующую команду, если такой бит в таком реестре установлен
btfss REG.BIT
Достоинства:
1. возможность ветвления по любому биту любого регистра, а не только по арифметическому признаку.
2. условным можно сделать не только ветвление, но и другую команду
movlw CONST
movwf COUNT
Loop:
: тело цикла
:
decfsz COUNT,F
goto Loop
IF A<B THEN A→ C ELSE B→C
1. Ассемблер не делает логических операций над высказываниями, как язык высокого уровня, поэтому
IF (A>10)&(B>15)
необходимо заменять вложенными альтернативами
2. Нет возможности сравнивать два числа, как в языке высокого уровня. Можно выполнять с числами арифметические действия и можно проверять результат на 0, заем, перенос.
Пример: IF A<B THEN A→C ELSE B→C
movf REG_B,W; взяли B
subwf REG_A,w ;A-B
btfsc STATUS,C;при вычитании C/B
goto ELSE
THEN
movf REG_A,w
movwf REG_C
goto IF_END
ELSE
movf REG_B,w
movwf REG_C
goto IF_END
IF_END; продолжение программы.
Разработать программу «магнитный пускатель».
RB0 – пуск;
RB1 – стоп;
RB2 – выход.
#define START PORTB,0
#define STOP PORTB,1
#define OUT PORTB,2
START_BEGIN
bsf OUT
START_LOOP
btfsc STOP
goto STOP_BEGIN
goto SART_LOOP
STOP_BEGIN
bcf OUT
STOP_LOOP
btfsc STOP
goto STOP_LOOP
btfsc START
goto STOP_LOOP
goto STOP_LOOP
Обнулить 10 ячеек памяти начиная с 40.
COUNT equ 20
movlw 40
movwf FSR
movlw 10
movwf COUNT
Loop clrf INDF
incf FSR,F
decfsz COUNT,F
goto Loop
Эти регистры предназначены для временного хранения данных, для сохранения и восстановления контекста при работе с прерываниями.
Адресное пространство памяти составляет 512 байт(4 банка по 128 байт). Адреса 1F заняты регистрами специального функций. Некоторые регистры продублированы в некоторых банках.
С адреса 20 по 7F находятся регистры общего назначения.
Косвенная адресация - такой режим адресации регистров, при которой в команде не указывается адрес памяти данных.
Регистры специального назначения FSR используются в качестве указателей в памяти данных. В командах для обращения к памяти данных используется неявный регистр INDF.
Формирование физического адреса при прямой и косвенной адресации.
При прямой из кода команды берется 7 бит адреса, т.е. одновременно можно работать в регистрах только одного банка.
Для переключений между банками используется PR0, PR1 в регистре статус.
Абсолютный физический адрес формируется из адреса находящегося в коде команды(7бит) и битов PR0, PR1(регистра STATUS).
При косвенной адресации из регистра FSR берется 8 бит адреса. Так при косвенной адресации можно работать с парой банков 0,1 или 2,3. Для переключения между банками используют регистр статус.
|
Пример. Переслать содержимое из 20 регистра «0» банка в 21 регистр «2» банка, а из 22 регистра «3» банка в 23 регистр «1» банка.
bcf STATUS,RP0
bcf STATUS,RP1
movf 20,w
bsf STATUS,RP1
movwf 21
bsf STATUS,RP0
movf 22,w
bcf STATUS,RP1
Макрос - определенный пользователем набор инструментов и директив, которые будут подставлены в исходный текст программы, при каждом его вызове.
Макрос состоит из команд Ассемблера и директив с возможностью указания аргументов, что делает написание программ более гибким.
<метка> macro <ap21>,<ap22>
local metka1
metka2 <команда1>
<команда2>
…..
endm
bank0 macro
bcf STATUS,PRO
bcf STATUS,PRO
endm
__
bank1 macro
bcf STATUS,PRO
bcf STATUS,PRO
__ endm
my_macro.inc
# include < my_macro.inc>
movff macro REG1,REG2
movf REG1,W
movwf REG2
endm
movff PORTA,PORTB
movff PORTC,PORTD
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
banksel <регистр>
banksel PORTA – банк 0
banksel TRISA – банк 1
bankisel<регистр>-используется при косвенной адресации.
Если необходимо работать с двумя банками удобно комбинировать способы адресации.
Пример: Переслать из 20,21,22 регистров 0-го банка в 20,21,22 регистры 2-го банка.
bcf STATUS,PRO
bcf STATUS,PR1
bsf STATUS,IRP
movlw 20
movwf FSR
movf 20,w
movwf INDF
incf FSR,F
movf 21,w
movwf INDF
incf FSR,F
movf 22,w
movf INDF
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.