radix decima1
__config _CPD_OFF & _WRT_ENABLE_OFF
org h’300’; Таблица начинается с адреса h’300’ памяти программ.
; **************
; * ФУНКЦИЯ: Возвращает квадрат целого числа *
; * РЕСУРСЫ: Подпрограмма FLASH_GET *
; * ВХОД: Целое в W (от 0 до 100) *
; * ВЫХОД: 14-битное значение квадрата в SQRH:SQRL. *
; * Рабочий банк памяти — 0-й *
; **************
TABLE_QF_SQUARES; Таблица десятичных констант
dw 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225
dw 256,289,324,361,400,441,484,529,576,625,696,729,784,841
dw 900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681
dw 1764,1849,1936,2025,2116,2209,2304,2401,2500,2601,2704
dw 2809,2916,3025,3136,3249,3364,3481,3600,3721,3844,3969
dw 4049,4225,4356,4489,4624,4761,4900,5041,5184,5329,5476
dw 5625,5776,5929,6084,6241,6400,6561,6724,6889,7056,7225
dw 7396,7569,7744,7921,8100,8281,8464,8649,8836,9025,9216
dw 9409,9604,9801,10000
SQUARE bsf STATUS,RP1; Переключаемся во 2-й банк
bcf STATUS,RP0
movwf EEADR; Формируем адрес
movlw 3
movwf EEADRH
call FLASH_GET; Считываем n-й элемент таблицы
bsf STATUS,RP1; Снова идем во 2-й банк
bcf STATUS,RP0
movf EEDATA,w; Берем младший байт результата
bcf STATUS,RP1; 0-й банк
movwf SQRL; Копируем в SQRL (0-й банк)
bsf STATUS,RP1; Снова идем во 2-й банк
movf EEDATH,w; Берем старший байт результата
bcf STATUS,RP1; 0-й банк
movwf SQRH; Копируем в SQRH (0-й банк)
return
Адрес
После занесения программы в FLASH-память микроконтроллера внешним программатором содержимое памяти программ начиная с адреса h’300’ будет выглядеть так, как показано на Рис. 15.5.
Рис. 15.5.
Несмотря на то что в данном примере положение таблицы было выровнено по 256-байтной границе, на практике она может быть размещена в любом месте памяти. В общем случае для адресации
Процесс записи FLASH-памяти в микроконтроллерах линейки PIC16F87X также практически идентичен процессу записи в EEPROM, отличаясь, как и в случае операции чтения, только двумя командами пор. Правда, после запуска цикла записи выполнение программы приостанавливается примерно на 4 мс. В течение этого времени производится стирание и последующая запись нового значения в адресованную ячейку памяти программ. Затем программа возобновляет работу в нормальном режиме. Итак, запись в FLASH-память осуществляется по следующему алгоритму:
1. Загрузить адрес конечной ячейки в регистры EEADR: EEADRH.
2. Установить бит EEPGD, показывая, что мы обращаемся к памяти программ.
3. Установить бит WREN в EECON[2] для разрешения операции записи.
4. Запретить все прерывания, если они используются.