Programació en C del PIC 16F690 amb PICkit 2

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.

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF, CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
unsigned char Visualit;  			// Variable on guardem el que mostraran els LED
bit 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
	Bloqueig = 0;				// Inicialment el bloqueig està desactivat
	Visualit = 	0b00001000;		// Activa el bit 3
	_delay(200000);	    			// Fa un retard per evitar una mala lectura del polsador
	while (1) {				// Inici del bucle de programa
		PORTC = Visualit;		// Copiem el valor al port (als LED)
		_delay(200000);	   		// Retard
		Visualit = (Visualit >> 1)|(Visualit << 7);		// Desplacem els bits a la dreta
		if (Visualit == 128){		// Si hem rodat massa
			Visualit = 0b00001000;	// Activa el bit 3
		}
		if (PORTAbits.RA3 == 0){	// Si es prem el polsador
			Bloqueig = 1;		// Activa el bloqueig
		}
		if (Bloqueig == 1){		// Si hi ha bloqueig
			INTCON = 0b00010000;	// Activa la interrupció externa
						// per poder despertar
			PORTC = 0;		// Estalviem energia
			SLEEP();		// Passa a mode espera
			Bloqueig = 0;		// Desactivem el bloqueig
		}
	}
}
void interrupt temporit(void){			// funció d'interrupcions
// void __interrupt() temporit(void){		// Línia alternativa
}

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.