Programació en C del PIC 16F690 amb PICkit 2

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

Exemple TA - Comunicació sèrie asíncrona per cable

En aquest exemple volem comunicar dos microcontroladors mitjançant una comunicació sèrie asíncrona.

Ens basarem en l'exemple EA. A l'emissor hi tindrem el programa d'aquest exemple però, addicionalment, enviarem per cable el mateix valor que enviem als LED. En el receptor, rebrem el valor i el mostrarem als LED. Així doncs, els LED de les dues plaques tindran la mateixa combinació que podrem variar amb el potenciòmetre de la targeta emissora.

Per estalviar energia, esperarem 0,6 s entre una lectura i la següent. Atès, doncs, que només hem d'enviar un caràcter cada cop i que els microcontroladors estaran desocupats quan s'enviï o es rebi no farem servir interrupcions.

Emissor

#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
char Leds;					// Valor que cal posar als LED
void main (void) {
	ANSEL = 0b00000101;			// Configura AN0 i AN2 com entrada analògica
	ANSELH = 0;				// Desactiva les altres entrades analògiques
	TRISC = 0;				// Tot el port C és de sortida
	TRISB = 0;				// Tot el port B és de sortida
	TRISA = 0xFF;				// Tot el port A és d'entrada
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	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ó
	ADCON0 = 0b00000001;			// Activa el conversor A/D connectat a AN0
						// amb el resultat justificat per l'esquerra
	while (1) {
		ADCON0bits.GO = 1;		// Posa en marxa el conversor
		while (ADCON0bits.GO == 1)	// Mentre no acabi
			;    			// ens esperem
		Leds = ADRESH/16;		// Copiem el resultat, dividit per 16 a Leds
		EnviaL(Leds);			// Ho envia
		PORTC = Leds;			// I ho posa als LED
		_delay(200000);	    		// Retard per permetre la visualització
	}
}
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
}

Receptor

#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
void main (void) {
	ANSEL = 0b00000101;			// Configura AN0 i AN2 com entrada analògica
	ANSELH = 0;				// Desactiva les altres entrades analògiques
	TRISC = 0;				// Tot el port C és de sortida
	TRISB = 0;				// Tot el port B és de sortida
	TRISA = 0xFF;				// Tot el port A és d'entrada
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	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
	RCSTAbits.RX9 = 0;			// Comunicació de 8 bits
	RCSTAbits.SPEN = 1;			// Activa comunicació sèrie
	RCSTAbits.CREN = 1;			// Activa comunicació
	while (1) {
		while (PIR1bits.RCIF == 0)	// Ha arribat un caràcter?
			;    			// No, doncs esperem
		if (RCSTAbits.FERR == 0) {	// Si no hi ha hagut error
			PORTC = RCREG;		// Llegeix el que s'ha rebut i ho posa als LED
		}
	}
}

 

 

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