Programació en mpasm 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.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Retard:3			; Definim tres variables per controlar els retards
Visualit			; I una variable on guardem el que mostraran els LED
Sentit				; Si és 0 suma, si és 1 resta
	endc
	cblock 0x70		; Zona de memòria de dades que no depèn del banc triat
Adre				; Adreça de la memòria EEPROM en la que volem escriure
Valor				; Valor que volem escriure a la memòria EEPROM
	endc
	org 0
Inici
	bsf	STATUS,RP0	; Tria el banc 1
	clrf	TRISC		; Posa tots els bits del port C com a sortida
	bcf	STATUS,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	STATUS,RP1	; Tria el banc 2
	movf	Adre,w		; Adreça que volem llegir
	movwf	EEADR		; Adreça EEPROM
	bsf	STATUS,RP0	; Tria el banc 3
	bcf	EECON1,EEPGD	; Accés a EEPROM
	bsf	EECON1,RD	; Lectura
	bcf	STATUS,RP0	; Tria el banc 2
	movf	EEDAT,w 	; Llegim, el valor està a W
	movwf	Valor		; El guardem
	bcf	STATUS,RP1	; Tria el banc 0
	return
				;
				; Escriu la memòria EEPROM
				;
EscEE
	bsf	STATUS,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	STATUS,RP0	; Tria el banc 3
	bcf	EECON1,EEPGD	; Accés a EEPROM
	bsf	EECON1,WREN	; Activa la possibilitat d'escriptura
	bcf	INTCON,GIE	; Desactiva les interrupcions
	btfsc	INTCON,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	EECON1,WR	; Inicia l'escriptura
	btfsc	EECON1,WR	; Ha acabat l'escriptura?
	goto	$-1		; No, doncs esperem
	bsf	INTCON,GIE	; Torna a activar les interrupcions
	bcf	EECON1,WREN	; Desactiva la possibilitat d'escriptura
	bcf	STATUS,RP0
	bcf	STATUS,RP1	; Tria el banc 0
	return
	end

 

 

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