Programació en C del PIC 16F690 amb PICkit 2

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

Exemple MT - Visualitzem la temperatura a la pantalla sèrie

En aquest exemple farem servir un sensor de temperatura i mostrarem la temperatura llegida a una pantalla sèrie.

#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
						// Definició de les funcions que farem servir 
void EnviaL(char Caracter);			// Envia un caràcter
void Cursor(char Filera, char Columna);		// Posiciona el cursor (filera 1 a 2 i columna 1 a 32, segons pantalla)
unsigned int Lectura;				// Valor llegit
char Digits[4];					// Variable amb el número dígit a dígit
						// Digits[0] és el decimal
bit Negatiu;					// Guarda si el valor és negatiu o positiu
void main (void) {
	ANSEL = 0b00000101;			// Configura AN0 i AN2 com entrada analògica
	ANSELH = 0;				// Desactiva les altres entrades analògiques
	TRISA = 0xFF;				// Tot el port A és d'entrada
	TRISC = 0;				// Tot el port C és de sortida
	TRISB = 0;				// Tot el port B és de sortida
	TXSTAbits.BRGH = 1;			// Configuració de velocitat
	BAUDCTLbits.BRG16 = 0;			// Paràmetre de velocitat de 8 bits
	SPBRG = 25;				// Velocitat de 9600 baud
	TXSTAbits.SYNC = 0;			// Comunicació asíncrona
	TXSTAbits.TX9 = 0;			// Comunicació de 8 bits
	RCSTAbits.SPEN = 1;			// Activa comunicació sèrie
	TXSTAbits.TXEN = 1;			// Activa comunicació
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	ADCON0 = 0b10001001;			// Activa el conversor A/D connectat a AN2
						// amb el resultat justificat per la dreta
	while (1) {				// Inici del bucle de programa
		ADCON0bits.GO = 1;		// Posa en marxa el conversor
		while (ADCON0bits.GO == 1)	// Mentre no acabi
			;    			// ens esperem
		Cursor(1, 1);			// Posició
		Lectura = 256 * ADRESH + ADRESL;		// Valor llegit
						// T = (125 * Lectura - 12800) / 256 
		Lectura = 125 * Lectura;	// Primer pas del càlcul
		if (Lectura >= 12800) {		// És positiu?
			Negatiu = 0;		// Sí
			Lectura = Lectura - 12800;		// Segon pas del càlcul
		} else {
			Negatiu = 1;		// És negatiu
			Lectura = 12800 - Lectura;	 	// Segon pas del càlcul
		}
		Lectura = Lectura / 128;	// Lectura té el doble de la temperatura
						// En valor absolut
		if (Lectura == 2 * (Lectura / 2)) {		// Mirem si el decimal és 0 o 5
			Digits[0] = 0;
		} else {
			Digits[0] = 5;
		}
						// Separem els dígits
		Lectura = Lectura / 2;		// Lectura té la temperatura en valor absolut
		Digits[1] = Lectura % 10;	// Unitats
		Lectura = Lectura / 10;
		Digits[2] = Lectura % 10;	// Desenes
		Digits[3] = Lectura / 10;	// Centenes
						// Convertim a ASCII i posem el signe
		for (int j = 0; j <= 4; j++){	// 4 dígits
			Digits[j] = Digits[j] + '0';		// Li sumem el codi ASCII de 0
		}
		if (Digits[3] == '0') {		// Mirem si el primer dígit és 0
			Digits[3] = ' ';			// Si ho és, hi posem un espai
			if (Digits[2] == '0') {			// I mirem si ho és el segon
				Digits[2] = ' ';		// Si ho és, hi posem un espai
			}
		}
		if (Negatiu) {			// Ara mirem si és negatiu
			Digits[3] = '-';	// Si ho és, hi posem el signe -
		}
						// Ho enviem a la pantalla
		EnviaL('T');			// Lletra
		EnviaL(' ');			// Espai
		EnviaL('=');			// Igual
		EnviaL(' ');			// Espai
		for (int j = 3; j > 0; j--){	// 3 dígits
			EnviaL(Digits[j]);	// Número
		}
		EnviaL(',');			// Coma
		EnviaL(Digits[0]);		// Número
		EnviaL(' ');			// Espai
		EnviaL(0b11011111);		// Graus
		EnviaL('C');			// Lletra
        _delay(1000000);	    		// Retard
	}
}						
void EnviaL(char Caracter) {
	TXREG = Caracter;			// Agafa el caràcter i l'envia
	_delay(5);				// Donem temps
	while (PIR1bits.TXIF == 0)		// Esperem que s'acabi d'enviar
		;				// No fem res
}
void Cursor(char Filera, char Columna) {
	char Posicio = 0;			// Variable per a calcular la posició
	if (Filera == 2) {
		Posicio = 64;			// La primera columna de la segona fila és 64;
	}
	if (Columna > 0 && Columna < 33) {	// Comprovem que sigui un valor raonable
		Posicio = Posicio + Columna;	// Sumem les adreces
		Posicio = Posicio - 1;		// Restem 1 perquè numera des de 0
	}
	Posicio = Posicio + 128;		// Posa el bit de posicionat a 1
	EnviaL(254);				// Control de la posició del cursor
	EnviaL(Posicio);			// Canvia el cursor de lloc
}

 

 

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