← Декабрь 2006 → | ||||||
1
|
2
|
3
|
||||
---|---|---|---|---|---|---|
4
|
6
|
7
|
8
|
9
|
10
|
|
11
|
13
|
14
|
15
|
16
|
17
|
|
18
|
20
|
21
|
22
|
23
|
24
|
|
25
|
27
|
28
|
29
|
30
|
31
|
За последние 60 дней ни разу не выходила
Сайт рассылки:
http://2aplusa.ru
Открыта:
15-11-2006
Статистика
0 за неделю
Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №5
РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих Доброго времени суток, дамы и господа!!
Сегодня в выпуске мы продолжим рассмотрение инструкций ассемблерного кода микроконтроллеров серии PIC18! С праздником Вас – днем Конституции Российской Федерации!
В прошлом выпуске мы остановились на байт-ориентированных командах. Сегодня завершим рассмотрение оставшихся команд! Потом, для закрепления этой темы, я дам несколько примеров! Итак, продолжим: Данная таблица с описанием параметров команд уже фигурировала в предыдущем выпуске, но, для вновь подписавшихся, она будет кстати.
Открываем в datasheet пункт 20.0 INSTRUCTION SET SUMMARY и продолжаем по порядку рассмотрение инструкций. Следующими идут бит-ориентированные команды:
Микроконтроллер PIC18F452 не имеет расширенного ядра. Наиболее близки по структуре нашему, но с расширенным ядром, микроконтроллеры: PIC18F4620, PIC18F4520. Следующие команды поддерживаются только микроконтроллерами, у которых расширенное (extended) ядро и оно разрешено в битах конфигурации:
На этом с описанием команд закончим! Теперь рассмотрим небольшие простые конструкции на языке ассемблера для закрепления материала! Для начала запомним основные директивы ассемблера: EQU – с помощью этой директивы объявляются константы и адреса переменных в памяти данных. ORG – с помощью этой директивы указывается адрес программной памяти. Весь код, который расположен после этой инструкции, будет расположен с заданного директивой адреса. END – директива, указывающая на конец кода. Основное правило! При объявлении переменных, констант, макросов, меток определитесь сразу, как их лучше Вам именовать. Т.е. необходимо выработать свой стиль. Иначе, потом, в больших программах будет путаница и потерянное впустую время на выяснение типа! Также, пытайтесь называть переменные, макросы, константы и метки в соответствии с их назначением. Например: uart_point – переменная, указатель буфера приемника/передатчика периферийного модуля UART. Например, я делаю так:
Теперь примеры: Объявим несколько переменных и констант. tempa equ 0x00 ; переменная tempa расположена в access bank по адресу 0x00 tempb equ 0x80 ; переменная tempb расположена не в access bank, все зависит от значения BSR IO_PORTB equ 0xFF ; константа для определения направления пинов порта В count equ 0x01 ; переменная count расположена в access bank по адресу 0x01 ab equ 0 ; признак, что переменная находиться в access bank bb equ 1 ; признак, что адрес необходимо считать с использованием регистра BSR rw equ ab ; rw=0. Результат размещается в регистр-аккумулятор WREG rf equ bb ; rf=1. Результат размещается в регистр FREG
Пример организации цикла: MOVLW 0x08 ; WREG=0x08, цикл будет выполняться 8 раз MOVWF count, ab ; count=WREG, адрес count вычисляется без регистра BSR Loop_met: ; метка (адрес) перехода. После метки всегда ставится « : » ; тело цикла DECFSZ count, rf, ab ; count=count-1. если count=0, то пропускаем следующую команду BRA Loop_met ; если count не 0, то переходим на метку
Пример чтения двух байт подряд из программной памяти: Байты расположены по адресам: 0х002000, 0х002001 P_DATA equ 0x2000 ; 3-ий старший байт всегда равен 0, т.к. у нас 0x8000 программной памяти
Первый вариант: CLRF TBLPTRU, ab ; TBLPTRU - специальный регистр, поэтому BSR не используем MOVLW HIGH(P_DATA) ; WREG=0x20 MOVWF TBLPTRH, ab ; TBLPTRH=WREG MOVLW LOW(P_DATA) ; WREG=0x00 MOVWF TBLPTRL, ab ; TBLPTRL=WREG TBLRD* ; читаем из FLASH байт по адресу 0x002000 MOVFF TABLAT, temp ; прочтенный байт помещаем в переменную temp INCF TBLPTRL, rf, ab ; переходим на адрес 0х002001, в флаг С заносится перенос. CLRF WREG, ab ; WREG может адресоваться и как специальный регистр ADDWFC TBLPTRH, rf, ab ; если был перенос, то прибавляем его к старшему регистру TBLRD* ; читаем из FLASH байт по адресу 0x002001 MOVFF TABLAT, count ; прочтенный байт помещаем в переменную count
Второй вариант (более оптимизированный): CLRF TBLPTRU, ab ; TBLPTRU - специальный регистр, поэтому BSR не используем MOVLW HIGH(P_DATA) ; WREG=0x20 MOVWF TBLPTRH, ab ; TBLPTRH=WREG MOVLW LOW(P_DATA) ; WREG=0x00 MOVWF TBLPTRL, ab ; TBLPTRL=WREG TBLRD*+ ; читаем из FLASH байт по адресу 0x002000 TBLPTR++ MOVFF TABLAT, temp ; прочтенный байт помещаем в переменную temp TBLRD* ; читаем из FLASH байт по адресу 0x002001 MOVFF TABLAT, count ; прочтенный байт помещаем в переменную count
В следующем выпуске будем рассматривать биты конфигурации!
Полный архив рассылки Вы можете прочитать на нашем сайте! Желаю Вам удачи! До скорой встречи!
С уважением, Алексей pont_a@mail.ru Cайт разработчиков 2AplusA http://2aplusa.ru |
В избранное | ||