Programació en mpasm del PIC 16F690

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

Exemple SL - Mode d'espera

En aquest exemple farem que el microcontrolador entri en mode d'espera i que després en pugui retornar. Mentre no entrem en el mode d'espera el microcontrolador farà una rotació de LED. Farem servir una variable Bloqueig que quan s'activi ens portarà a entrar en el mode d'espera. L'activació del mode d'espera la farem amb el polsador RA3. Quan s'activi prepararem la interrupció externa per poder-lo despertar i desactivarem els LED per estalviar energia. És molt important desactivar la variable Bloqueig just després de la instrucció sleep si no volem que es torni a posar immediatament en mode d'espera. La interrupció externa correspon a RA2, caldrà activar aquesta entrada per despertar el microcontrolador. Si fem servir la placa de la matriu de vuit per vuit LED podem emprar els polsadors BTN1 o BTN2 per a aquesta aplicació. Recordem, però, que cal tenir l'entrada analògica desactivada per tal que funcioni la interrupció.

En aquest cas no fem res a la funció d'interrupció (per tant no cal guardar W ni STATUS) ja que la interrupció només la fem servir per despertar el microcontrolador.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Retard1				; Definim dues variables de comptatge
Retard2
Visualit			; Variable on guardem el que mostraran els LED
Bloqueig			; Variable que farà el bloqueig del programa
				; Si no val 0 es bloqueja
	endc
	org 0
	goto	Inici		; Saltem al lloc on hi ha el programa principal
	nop			; Zona de memòria de programa que no utilitzem
	nop
	nop
Inici
	bsf	STATUS,RP0	; Tria el banc 1
	movlw	0xFF		; Posa l'acumulador a FFh (tot uns)
	movwf	TRISA		; Posa tots els bits del port A com a entrada
	clrf	TRISC		; Posa tots els bits del port C com a sortida
	movlw	b'11000000'	; Interrupció a l'activació
				; I resistències de pull-up desactivades (valor per defecte)
	movwf	OPTION_REG	; Ho guarda al registre de configuració
	bcf	STATUS,RP0	; Tria el banc 0
	bsf	STATUS,RP1	; Tria el banc 2
	clrf	ANSEL		; Desactiva entrades analògiques
	bcf	STATUS,RP1	; Tria el banc 0
	call	RetM		; Fa un retard per evitar una mala lectura del polsador
	clrf	Bloqueig	; Inicialment el bloqueig està desactivat	
	movlw	b'00001000'	; Activa el bit 3 al registre W
	movwf	Visualit	; Copia el valor de W a la variable Visualit
	movlw	b'00010000'	; Activem INTE, interrupció externa
	movwf	INTCON		; per poder despertar
Bucle
	movf	Visualit,w	; Copia la variable Visualit sobre el registre W
	movwf	PORTC		; Copia el valor de W al port C
	call	RetM		; Fa un retard
	bcf	STATUS,C	; posa a zero el bit d'arrossegament
	rrf	Visualit,f	; Fa rodar els bits cap a la dreta
				; el bit d'arrossegament entra per l'esquerra
				; i el bit de la dreta passa a l'arrossegament
	btfsc	STATUS,C	; Comprova si s'ha activat l'arrossegament
				; Si no s'ha activat, salta una instrucció
	bsf	Visualit,3	; Si s'ha activat, torna a posar un 1
	btfss	PORTA,3		; Mira si s'ha premut el polsador
	incf	Bloqueig,f	; Si s'ha premut incrementa i, per tant, força el bloqueig
	movf	Bloqueig,f	; Copiem sobre ella mateixa per veure si és zero
	btfsc	STATUS,Z	; És zero?
	goto	Seguim		; Si ho és, continua
	clrf	PORTC		; Estalviem energia
	sleep			; Passa a mode espera
	clrf	Bloqueig	; Desactivem el bloqueig	
Seguim
	goto	Bucle		; Repetim
				;
				; Funció de retard de 0,2 s
				;
RetM
	decfsz		Retard1,f		
	goto		RetM		
	decfsz		Retard2,f	
	goto		RetM
	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.