ПП записи в Flash память программ.

Автор: Super User Просмотров: 977

 

Вызов ПП  "W_DATA " результат в памяти данных.

 

 

 

;***************************************************************************
;***************************************************************************
; В ПП необходимо указать количество блоков по 8 байт, начальный адрес в ОЗУ,
; выделено красным цветом. Не забыть в начале программы своего приложения 
; сбросить флаг ошибки.
;***************************************************************************
;***************************************************************************
;-----------------------------------
; Регистры общ. назначения
;-----------------------------------
            cblock             00h ;
            Flag                   ; Флаг ошибки.
            R_Bute_L               ; Младший байт кол-ва данных таблицы.  
            R_Bute_H               ; Старший байт кол-ва данных таблицы.
            ProvEE_L               ; Младший байт кол-ва данных проверки записи.
            ProvEE_H               ; Старший байт кол-ва данных проверки записи.
            Temp                   ;
            Counter                ; Количество байт (всегда 8)
            Count_Blok             ; Количество блоков по 8 байт
            endc                   ;

;-----------------------------------
; ПП записи в память программ.           
;-----------------------------------
W_DATA      movlw               .8 ;
            movwf       Count_Blok ; Количество байт (всегда 8)
            call            Ukaz_1 ; TBLPTR на начало таблицы
            movlw               .8 ; Количество блоков по 8 байт
            MULWF       Count_Blok ; Высчитаваем общее количество байт
            movff   PRODH,R_Bute_H ; Кол-во байт (старший, для коп. в ОЗУ
            movff   PRODL,R_Bute_L ; Кол-во байт (младший),для коп. в ОЗУ
            movff   PRODH,ProvEE_H ; Кол-во байт (старший) для проверки записи
            movff   PRODL,ProvEE_L ; Кол-во байт (младший) для проверки записи
            incf          R_Bute_H ; Коррекция.
            incf          ProvEE_H ; Коррекция.
            call            Ukaz_1 ; TBLPTR на начало таблицы
            call            R_DATA ; Вызов ПП чтения.
            call          ZAP_data ; Тестовая - для демонстрации (удалить)
            call            Ukaz_1 ; TBLPTR на начало таблицы
            movlw               .8 ; =Коррекция
            subwf        TBLPTRL,F ; =
            movlw                0 ; =
            subwfb       TBLPTRH,F ; =
            call         Counter_8 ; Запись новых данных
            call            Ukaz_1 ; TBLPTR на начало таблицы
            call           PROV_EE ; Проверка записи
            return

;-----------------------------------
; проверка записи
;-----------------------------------
PROV_EE    TBLRD*+                 ; Чтение байта +1 адрес
           movf         POSTINC0,0 ;
           CPFSEQ           TABLAT ;
          bsf              Flag,0 ; Флаг ошибки.
           decfsz         ProvEE_L ; Все прочитаны?
           bra             PROV_EE ; нет,следующий
           decfsz         ProvEE_H ; Все прочитаны?
           bra             PROV_EE ; нет,следующий   
           return                  ; Да, возврат из ПП  

;-----------------------------------
; Короткая запись  8 байт
;-----------------------------------
Counter_8  movlw                 8 ; Задание количества
           movwf           Counter ; байтов в одном блоке.
           nop
           movf         POSTINC0,0 ; =Копируем в W значение регистра.    
           movwf            TABLAT ;  в регистр TABLAT=
           tblwt*+                 ; Запись в защелку
           decfsz          Counter ; Все байты блока записаны?
           bra                $-.8 ; нет,следующий.
;-----------------------------------
; Длинная запись
;-----------------------------------
           bsf        EECON1,EEPGD ; Работа с Flash-памятью программ.
           bcf         EECON1,CFGS ; Обращение к Flash памяти программ
           bsf         EECON1,WREN ; Разрешение записи.
           bcf          INTCON,GIE ; Запрет прерывания
           movlw              055h ; =
           movwf            EECON2 ; Обязательная
           movlw              0AAh ; процедура.
           movwf            EECON2 ; =
           bsf           EECON1,WR ; Инициализация цикла записи.
           nop                     ; 
           bsf          INTCON,GIE ; Разрешение прерывания.
           decfsz       Count_Blok ; Кол-во блоков по 8 байт
           call          Counter_8 ;  
           bcf         EECON1,WREN ; Запрет записи.
           return                  ; Возврат из прерывания                       
;-------------------------------------
; Указаталь TBLPTR на начало таблицы
; FSR0,0x0100 ; Начальный адрес В ОЗУ
;-------------------------------------
Ukaz_1      clrf           TBLPTRU ; Cбрасываем верхний байт
            movlw       high (TEST); =Задание адреса "TEST"
            movwf          TBLPTRH ;  старшего байта=
            movlw        low (TEST); =Задание адреса "TEST"
            movwf          TBLPTRL ;  младшего байта=
            lfsr       FSR0,0x0100 ; Начальный адрес В ОЗУ
            return
;-------------------------------------
; ПП чтения данных из памяти программ
;-------------------------------------
R_DATA     TBLRD*+                 ; Чтение байта +1 адрес
           movff      TABLAT,INDF0 ; Результат в ОЗУ
           movf           POSTINC0 ; Увеличиваем адрес FSR0L на 1
           decfsz         R_Bute_L ; Все прочитаны?
           bra              R_DATA ; нет,следующий
           decfsz         R_Bute_H ; Все прочитаны?
           bra              R_DATA ; нет,следующий   
           return                  ; Да, возврат из ПП
;-------------------------------------
; ПП предварительной записи в ОЗУ необходимых
; данных, 15 байт. ПРИМЕР !!!
;-------------------------------------
 ZAP_data  lfsr        FSR0,0x0107 ; Адрес первого регистра для изменения.
           movlw               .14 ; Всего 14 байт
           movwf              Temp ;
           clrf              INDF0 ; Очистить регистр
           movf           POSTINC0 ; Увеличиваем адрес FSR0L на 1
           decfsz             Temp ; Все очищены?
           bra                $-.6 ; нет,следующий
           lfsr        FSR0,0x013C ; Адрес  регистра для изменения.
           clrf              INDF0 ; Очистить регистр
           return                  ; Да, возврат из ПП
;--------------------------------------------------------
;ТАБЛИЦА ДАННЫХ 64 БАЙТА (ПРИМЕР)
;--------------------------------------------------------
          org                0100h ; размещение таблицы начиная с 0100h

TEST
    db     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,  
    db     0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x06, 0x0F, 0x10,  
    db     0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,  
    db     0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,  
    db     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,  
    db     0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x06, 0x0F, 0x10,  
    db     0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,  
    db     0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru