Programació en C 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 funció 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ó, ja que la interrupció només la fem servir per despertar el microcontrolador; però sí cal desactivar el bit corresponent.

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include <xc.h>					// Carrega el fitxer de funcions necessari per al compilador XC8
unsigned char Visualit;  			// Variable on guardem el que mostraran els LED
char Bloqueig;					// Variable que farà el bloqueig del programa
						// Si no val 0 es bloqueja
void main (void){
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	TRISA = 0b11111111; 			// Posa el port A com a entrada
	OPTION_REG = 0b11000000;		// Interrupció a l'activació
						// I resistències de pull-up desactivades (valor per defecte)
	ANSEL = 0;				// Desactiva entrades analògiques
	_delay(200000);	    			// Fa un retard per evitar una mala lectura del polsador
	Bloqueig = 0;				// Inicialment el bloqueig està desactivat
	Visualit = 	0b00001000;		// Activa el bit 3
	INTCON = 0b00010000;			// Activa la interrupció externa
						// per poder despertar
	while (1) {				// Inici del bucle de programa
		PORTC = Visualit;		// Copiem el valor al port (als LED)
		_delay(200000);	   		// Retard
		Visualit = (unsigned char) ((Visualit >> 1)|(Visualit << 7));		// Desplacem els bits a la dreta
		if (Visualit == 128){		// Si hem rodat massa
			Visualit = 0b00001000;	// Activa el bit 3
		}
		if (RA3 == 0){	// Si es prem el polsador
			Bloqueig = 1;		// Activa el bloqueig
		}
		if (Bloqueig == 1){		// Si hi ha bloqueig
			PORTC = 0;		// Estalviem energia
			SLEEP();		// Passa a mode espera
			Bloqueig = 0;		// Desactivem el bloqueig
			INTCONbits.INTF = 0;	// Desactivem l'indicador d'interrupció
		}
	}
}

 

 

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