Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple ME - Guardem dades a la memòria EEPROM

En aquest exemple tindrem un programa que anirà incrementant (o decrementant) un valor del 0 al 15 i aquest valor es mostrarà en els LED. Prement el polsador podrem canviar el sentit (incrementar o decrementar). A l'inici de cada cicle de programa el valor i el sentit actuals es guardaran a la memòria EEPROM (adreces 0 i 1, respectivament), d'altra banda, en la inicialització del programa es llegiran aquests valors a la memòria EEPROM per tal que el programa pugui continuar a partir del punt on s'havia quedat.

A l'hora de provar el programa, podem fer-ho desconnectant l'alimentació i tornant-la a connectar o bé tornant a enviar el programa. En aquest segon cas, cal assegurar-se que la casella EEPROM del menú Memories to Program està desactivada ja que en cas contrari ens hi escriurà al damunt. Si ho provem desconnectant l'alimentació no cal prendre cap precaució especial.

Memories to Program

En el següent programa hem marcat en color les línies que corresponen a la gestió de la memòria EEPROM, si les esborrem el programa també funcionarà però no recordarà on s'havia quedat.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Retard EQU 0x20  ; Definim tres variables per controlar els retards (3 bytes)
Visualit EQU 0x23  ; I una variable on guardem el que mostraran els LED
Sentit EQU 0x24  ; Si és 0 suma, si és 1 resta
; Zona de memòria de dades que no depèn del banc triat
Adre EQU 0x70  ; Adreça de la memòria EEPROM en la que volem escriure
Valor EQU 0x71  ; Valor que volem escriure a la memòria EEPROM
PSECT code, class=CODE, delta=2, abs
main:
  bsf RP0  ; Tria el banc 1
  clrf TRISC  ; Posa tots els bits del port C com a sortida
  bcf RP0  ; Tria el banc 0
  clrf Adre  ; Posició on hi ha el valor a visualitzar
  call LecEE  ; Llegim de la memòria EEPROM
  movf Valor,w  ; Valor llegit
  movwf Visualit ; El guarda
  movlw 1  ; Posició on hi ha el sentit
  movwf Adre
  call LecEE  ; Llegim de la memòria EEPROM
  movf Valor,w  ; Valor llegit
  movwf Sentit  ; El guarda
Bucle:  ; Primer copiem el valor als LED
  movf Visualit,w  ; Anem a guardar el valor a la memòria EEPROM
  movwf Valor
  clrf Adre  ; El guardem a la posició 0
  call EscEE  ; Ho escriu
  movf Sentit,w  ; Anem a guardar el sentit a la memòria EEPROM
  movwf Valor
  movlw 1  ; Posició on guardarem el sentit
  movwf Adre
  call EscEE  ; Ho escriu
  movf Visualit,w  ; Copia la variable Visualit sobre el registre W
  movwf PORTC  ; Copia el valor de W al port C
  btfsc PORTA,3  ; Mirem l'estat del polsador
  goto NoCanvi  ; Si no està premut, no canvia res
  movlw 1  ; Volem canviar el bit 0
  xorwf Sentit,f  ; Canviem el sentit de l'operació
NoCanvi:
  btfss PORTA,3  ; Mirem l'estat del polsador
  goto $-1  ; Esperem que es deixi anar el polsador
  movlw 5  ; Retard d'un segon
  movwf Retard+2
Ret:
  decfsz Retard,f  ; Decrementa la variable 1
                   ; si dona zero, no es fa la instrucció següent
  goto Ret  ; Salta, excepte si el resultat ha estat zero
  decfsz Retard+1,f  ; Decrementa la variable 2
  goto Ret  ; Salta, excepte si el resultat ha estat zero
  decfsz Retard+2,f  ; Decrementa la variable 2
  goto Ret  ; Salta, excepte si el resultat ha estat zero
            ; Acabat el retard, canviem el valor de Visualit
  btfss Sentit,0  ; Mirem el sentit actual
  goto Suma
  decf Visualit,f  ; Decrementa Visualit
  movlw 15  ; Prepara l'acumulador per si cal reiniciar la variable
  btfsc Visualit,7  ; Mira si hem decrementat un zero
  movwf Visualit  ; Posa 15 a la variable Visualit
  goto Bucle  ; Repetim-ho...
Suma:
  incf Visualit,f  ; Incrementa Visualit
  btfsc Visualit,4  ; Mira si ja hem arribat al bit 4
  clrf Visualit  ; Si hi hem arribat, posa a zero la variable Visualit
  goto Bucle  ; Repetim-ho...
;
; Llegeix la memòria EEPROM
;
LecEE:
  bsf RP1  ; Tria el banc 2
  movf Adre,w  ; Adreça que volem llegir
  movwf EEADR  ; Adreça EEPROM
  bsf RP0  ; Tria el banc 3
  bcf EEPGD  ; Accés a EEPROM
  bsf RD  ; Lectura
  bcf RP0  ; Tria el banc 2
  movf EEDAT,w  ; Llegim, el valor està a W
  movwf Valor  ; El guardem
  bcf RP1  ; Tria el banc 0
  return
;
; Escriu la memòria EEPROM
;
EscEE:
  bsf RP1  ; Tria el banc 2
  movf Valor,w  ; Valor que volem guardar
  movwf EEDAT  ; Guarda el valor de l'acumulador al registre EEDAT
  movf Adre,w  ; Adreça on volem escriure
  movwf EEADR  ; Adreça EEPROM
  bsf RP0  ; Tria el banc 3
  bcf EEPGD  ; Accés a EEPROM
  bsf WREN  ; Activa la possibilitat d'escriptura
  bcf GIE  ; Desactiva les interrupcions
  btfsc GIE  ; Comprova si el bit s'ha desactivat
  goto	$-2
  movlw 0x55  ; Valor necessari
  movwf EECON2  ; Escriu 55h
  movlw 0xAA  ; Valor necessari
  movwf EECON2  ; Escriu AAh
  bsf WR  ; Inicia l'escriptura
  btfsc WR  ; Ha acabat l'escriptura?
  goto $-1  ; No, doncs esperem
  bsf GIE  ; Torna a activar les interrupcions
  bcf WREN  ; Desactiva la possibilitat d'escriptura
  bcf RP0
  bcf RP1  ; Tria el banc 0
  return
END main

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.