Приклад програми для послідовного збереження заданої змінної в ОЗУ(RAM) і подальшого збереження цих даних (по команді) в ППЗУ(Flash)


 

А ось і сам код:

   LIST             p=16F628

   #include "P16F628.INC"

 

;        __CONFIG 3F61h 

        radix DEC

 

 

w       equ     0

f       equ     1

 

Sample             equ             2Dh             ; Эту переменную мы будем сохранять

Counter             equ             2Dh             ; Счетчик

 

 

RAMaddr           equ             0A0h             ; Банк 1

 

   org             0

;*********************************************************************************

; Пример программы последовательного сохранения значения заданной ячейки памяти во

; временную память и последующий перенос  (по команде) этих данных во Flash память

;*********************************************************************************

   goto             Test

 

  

 

;********************************************************************************

; тестовая процедура. Она просто гененрирует последовательность от 1 до 256

; в тестовой ячейке памяти

;********************************************************************************

Test

;-------------------------------; Первичная подготовка

   bcf             STATUS,RP0  ; Банк 0

   bcf             STATUS,RP1  ; Банк 0

   clrf             INTCON                       ; Запрет всех прерываний

 

;-------------------------------; готовим переменные

   clrf             Sample                          ; Сбрасываем в ноль переменную Sample

   movlw             10h

   movwf             Counter                        ;

 

 

;-------------------------------; Главный цикл

   call             SampInit

   bcf             STATUS,RP0  ; Банк 0

Cykle

   call             SampToRAM ; Вызываем процедуру SampToRAM

   bcf             STATUS,RP0  ; Банк 0

   incfsz             Sample,1

 

   bsf             STATUS,RP0  ; Банк 1

   ;if RAMaddr=0EFh

   movlw             0EFh

   xorwf   RAMaddr,W

   bcf             STATUS,RP0  ; Банк 0

   btfsc   STATUS,Z

   goto             $+2

   goto             Cykle

 

   call             RAMToFlash ; Вызываем процедуру RAMToFlash

 

   goto             $                       ; Зависаем

 

 

 

;********************************************************************************

; Подготовка к записи

;********************************************************************************

SampInit

   bsf             STATUS,RP0  ; Банк 1

   bcf             STATUS,IRP   ; Косвенная адресация. Банк 0 или 1.

   movlw             0A9h

   movwf             RAMaddr

   movwf             FSR

SampNext

   movlw             0FFh

   movwf             INDF

   incfsz             FSR,1

  

   ;if FSR=0EFh

   movlw             0EFh

   xorwf   FSR,W

   btfsc   STATUS,Z

   return

 

   goto             SampNext

 

;********************************************************************************

; Сохраняем переменную Sample в ОЗУ. Используем косвенную адресацию.

;********************************************************************************

SampToRAM

   bsf             STATUS,RP0  ; Банк 1

  

   ;if RAMaddr=0EFh

   movlw             0EFh

   xorwf   RAMaddr,W

   btfsc   STATUS,Z

   return

 

   movf             RAMaddr,w

   movwf             FSR

   bcf             STATUS,RP0  ; Банк 0

   movf             Sample,w

   bsf             STATUS,RP0  ; Банк 1

   movwf             INDF

   incfsz             RAMaddr,1

  

   return

 

;********************************************************************************

; Сохраняем значения из ОЗУ во ППЗУ

;********************************************************************************

RAMToFlash

   bsf             STATUS,RP0  ; Банк 1

   bcf             STATUS,IRP

   movlw             0A9h

   movwf             FSR

   clrf             EEADR                       ; Адрес ячейки для записи

RAMToFlashNext

   movf             INDF,w

   movwf             EEDATA                     ; Байт для записи

 

   bsf             EECON1,WREN             ; Разрешить запись

  

;  bcf             INTCON,GIE  ; Запретить прерывания

   movlw             55h                   ;

   movwf             EECON2                    ; запись 55h

   movlw             0AAh                ;

   movwf             EECON2                    ; Запись ААh

   bsf             EECON1,WR             ; Установить бит WR для

                                         ; начала записи

 

W_1

   btfsc             EECON1,      WR             ; Ждем окончания записи

   goto             W_1

   bcf             EECON1,      WREN             ; Запретить запись

 

;  bsf             INTCON,GIE  ; разрешить прерывания

 

   incfsz             EEADR,1

   nop

   incfsz             FSR,1

 

   ;if RAMaddr=0EFh

   movlw             0EFh

   xorwf   FSR,W

   btfsc   STATUS,Z

   return

 

   goto             RAMToFlashNext

 

 

   END

05.01.2009