Programació en C del PIC 18F45K20

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 = INTIO67, FCMEN = OFF, IESO = OFF				// CONFIG1H
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30				// CONFIG2L
#pragma config WDTEN = OFF, WDTPS = 32768					// CONFIG2H
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC		// CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF				// CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF			// CONFIG5L
#pragma config CPB = OFF, CPD = OFF						// CONFIG5H
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF			// CONFIG6L
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF				// CONFIG6H
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF		// CONFIG7L
#pragma config EBTRB = OFF							// CONFIG7H
#include "p18f45k20.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 18F45K20
#define Polsador PORTBbits.RB0			// Li assigna un nom a l'adreça del polsador
#define FiTimer0 INTCONbits.TMR0IF		// 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)
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)
						// Configuració d'entrades i sortides
	TRISD = 0b00000000;     		// El port D és de 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 = 0;				// Les tensions de referència són les d'alimentació
	ADCON2 = 0b00111000;			// Configuració típica amb justificat per l'esquerra
	ADCON0 = 0b00000001;			// Activa el conversor connectat a AN0
	INTCON2bits.RBPU = 0;			// Habilita el control de resistències de pull-up al port B
	WPUBbits.WPUB0 = 1;			// Activa la resistència de pull-up a RB0
	TRISBbits.TRISB0 = 1;      		// RB0 és entrada
						// Configuració del Timer 0
	FiTimer0 = 0;       			// Aquest bit es posarà a 1 quan el temporitzador acabi
						// cal desactivar-lo des del programa
	T0CON = 0b00000001; 	     		// El timer 0 és de 16 bits i compta temps amb pre-escalat de 1/4
	TMR0H = 0;                 		// Fem la precàrrega a zero per començar, primer el registre H
	TMR0L = 0;				// i després el registre L
	T0CONbits.TMR0ON = 1;          		// Fem que Timer 0 comenci a comptar
	while (1)				// Inici del bucle de programa
	{
		LATD = Valor;			// Copiem el valor al port (als LED)
		if (Adreta == 0)
			Valor = (Valor << 1)|(Valor >> 7);		// Desplacem els bits a l'esquerra
		if (Adreta == 1)
			Valor = (Valor >> 1)|(Valor << 7);		// Desplacem els bits a la dreta
		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
		ADCON0bits.GO_DONE = 1;         // Posa en marxa el conversor
		while (ADCON0bits.GO_DONE == 1)	// Mentre no acabi
			;    			// ens esperem
		TMR0H = ADRESH;                	// Copiem el resultat llegit com a precàrrega del Timer
		TMR0L = 0;			// El TMR0L segueix a 0 però cal escriure-ho per recarregar TMR0H
	}
}

 

 

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