Programació en C del PIC 16F690 amb PICkit 2

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

Exemple VV - Rotació de LED a velocitat variable

En aquest exemple es combinen coses dels exemples TM i EA.

Com en l'exemple anterior, en aquest cas llegirem el potenciòmetre utilitzant una entrada analògica. Ara el que farem serà utilitzar els 8 bits superiors del valor llegit per modificar l'inici del temporitzador i així variar la velocitat.

El programa serà el següent:

#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
#define Polsador   PORTAbits.RA3		// Li assigna un nom a l'adreça del polsador
#define FiTimer0 INTCONbits.T0IF		// Li assigna un nom al bit que indica el final del Timer 0
unsigned char Valor;  				// Variable de 8 bits sense signe (0 a 255)
unsigned char Compta;  				// Variable de 8 bits sense signe (0 a 255)
bit Premut;					// Estat del polsador
bit Adreta;					// Sentit de gir
void main (void)
{
						// Inicialització de variables
	Adreta = 0;				// Iniciem girant a l'esquerra
	Premut = 0;				// Suposem el polsador no premut
	Valor = 1;          			// Inicialment posem 1 (activem LED 0)
	Compta = 0;				// Compta el nombre de cops que ha acabat el Timer
						// Configuració d'entrades i sortides
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	TRISAbits.TRISA0 = 1;			// La pota RA0 és d'entrada
	ANSEL = 0;				// Desactiva totes les entrades analògiques
	ANSELH = 0;	
	ANSELbits.ANS0 = 1;			// I ara activa la del potenciòmetre (AN0)
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	ADCON0 = 0b00000001;			// Activa el conversor connectat a AN0
						// amb el resultat justificat per l'esquerra
						// Configuració del Timer 0
	FiTimer0 = 0;       			// Aquest bit es posarà a 1 quan el temporitzador acabi
						// cal desactivar-lo des del programa
	OPTION_REG = 0b10000110;       		// Configuració de Timer0
						// Com a temporitzador basat en rellotge
						// 111 - Factor d'escala de 256
						// I resistències de pull-up desactivades (valor per defecte)
	while (1)				// Inici del bucle de programa
	{	
		ADCON0bits.GO = 1;		// Posa en marxa el conversor
		while (ADCON0bits.GO == 1)	// Mentre no acabi
			;    			// ens esperem
		Compta++;			// Incrementa Compta
		if (Compta == 30) {		// Si ha acabat trenta vegades
			PORTC = Valor;		// Copiem el valor al port (als LED)
			Compta = 0;		// Reinicialitza Compta
			if (Adreta == 0) {
				Valor = (Valor << 1)|(Valor >> 7);	// Desplacem els bits a l'esquerra
				if (Valor == 16)			// Si ja estem al LED 5,
					Valor = 1;    			// tornem al LED 0
			}
			if (Adreta == 1) {
				Valor = (Valor >> 1)|(Valor << 7);	// Desplacem els bits a la dreta
				if (Valor == 128)			// Ja hem sortit fora,
					Valor = 8;    			// tornem al LED 4
			}
		}
		do				// Bucle que repetim mentre esperem que el temporitzador acabi
		{ 				// En el bucle mirem si s'ha premut el polsador i, si és així, 
						// canviem el sentit de gir
			if (Polsador == 1)	// Si el polsador no està premut (1 és no premut)
				Premut = 0;	// Memoritzem l'estat del polsador
			else if (Premut == 0)	// Si el polsador està premut però fa un moment no ho estava
			{ 
				Adreta = ~Adreta;			// Invertim el sentit de gir
				Premut = 1;	// Memoritzem el nou estat del polsador
			}
		} while (FiTimer0 == 0);	// Sortirà del bucle quan el bit es posi a 1
						// és a dir, quan Timer 0 acabi
		FiTimer0 = 0;          		// Tornem a posar el bit a zero
		TMR0 = ADRESH;			// Inicialitza el Timer0
	}
}

 

 

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