Aula de programação C – 20

20. PRÁTICA 20: COMUNICAÇÃO SERIAL ENTRE PLACAS – LEITURA (SEM PONTE)

Referencial Teórico: Comunicação Serial – USART; Registadores USART.

Objetivo: Preparar um dispositivo para comunicação no barramento e protocolo SERIAL RS-232.

Materiais: Utilizar botão e led presentes na placa. A prática necessita da ligação física entre placas.

20.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();
	configura_serial();

	while(1){
		ler_serial();
	}
}

20.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

// definicoes

// tx - rc6 - p25 - md41 - h10
// rx - rc7 - p26 - md42 - h15

//#define PIN_C6 PIN_A3 //6 // TX // MD41 // h10
//#define PIN_C7 PIN_A5 //7 // RX // MD42 // h15
//#define TX PIN_A3
//#define RX PIN_A5

unsigned char dado_recebido[] = {"        "};

unsigned char n_dado;

void configura_serial(){
	OpenUSART(USART_TX_INT_OFF		//desabilita interrupção de transmissão
				& USART_RX_INT_OFF	//desabilita interrupção de recepção
				& USART_ASYNCH_MODE	//modo assíncrono
				& USART_EIGHT_BIT		//transmissão e recepção em 8 bits
				& USART_BRGH_HIGH,	//Baud Rate em alta velocidade
				156);					//SPBRG p/ 19200 bps
}

void ler_serial(){
	for (n_dado=0; n_dado<=5;n_dado++)
		{
			while(!DataRdyUSART());
			dado_recebido[n_dado] = getcUSART();
		}
		putsUSART(dado_recebido);
}

Aula de programação C – 19

19. PRÁTICA 19: COMUNICAÇÃO SERIAL ENTRE PLACAS – ESCRITA (SEM PONTE)

Referencial Teórico: Comunicação Serial – USART.

Objetivo: Preparar um dispositivo para comunicação no barramento e protocolo SERIAL RS-232.

Materiais: Utilizar botão e led presentes na placa. A prática necessita da ligação física entre placas.

19.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();
	configura_serial();

	while(1){
		escrever_serial();
	}
}

19.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

//#include <sw_uart.h>

// definicoes

// tx - rc6 - p25 - md41 - h10
// rx - rc7 - p26 - md42 - h15

//#define PIN_C6 PIN_A3 //6 // TX // MD41 // h10
//#define PIN_C7 PIN_A5 //7 // RX // MD42 // h15
//#define TX PIN_A3
//#define RX PIN_A5

unsigned char dado_recebido[] = {"        "};

unsigned char n_dado;

void configura_serial(){
	OpenUSART(USART_TX_INT_OFF		//desabilita interrupção de transmissão
				& USART_RX_INT_OFF	//desabilita interrupção de recepção
				& USART_ASYNCH_MODE	//modo assíncrono
				& USART_EIGHT_BIT		//transmissão e recepção em 8 bits
				& USART_BRGH_HIGH,	//Baud Rate em alta velocidade
				156);					//SPBRG p/ 19200 bps
}

//void escrever_serial(char letra){
void escrever_serial(){
	putcUSART("H");			//Envia o caractere H
	while (BusyUSART());	//Aguarda o final da transmissão
	putsUSART("GOGO\r\n");			//Envia o caractere GOGO
	while (BusyUSART());	//Aguarda o final da transmissão
	Delay1KTCYx(250);
}

Aula de programação C – 18

18. PRÁTICA 18: TESTE DO DISPLAY LCD I2C

Referencial Teórico: Modos de Comunicação I2C; Registradores I2C.

Objetivo: Preparar um dispositivo Mestre para comunicação no barramento e protocolo I2C, com dispositivos comerciais.

Materiais: Utilizar Display LCD I2C de 16x2 caracteres e fonte de alimentação externa.

18.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){
	configura_portas();
	configura_i2c_master();
	configura_display();
	bip = 0;

	while(1){
		mostrar();
	}
}

18.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

#include "lcd.h"

unsigned int sensor = 0;
unsigned char buffer[8];
void mostrar();

void mostrar(){
		#define mensagem1 "Recebido:"
		#define mensagem2 "Sensor"

		LCD_putcmd(LCD_LINE1,1);
		LCD_putsRom(mensagem1);

		LCD_putcmd(LCD_LINE2,1);
		itoa(sensor, buffer);
		LCD_puts(buffer);

		Tempo(250000);
    	j++;
    	j=j & 0x00FF;
}

Aula de programação C – 17

17. PRÁTICA 17: COMUNICAÇÃO I2C SLAVE

Referencial Teórico: Modos de Comunicação I2C; Módulo MSSP.

Objetivo: Preparar um dispositivo Escravo para comunicação no barramento e protocolo I2C.

Materiais: Utilizar botão e led presentes na placa. A prática necessita da ligação física entre placas.

17.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();
	led_vermelho = 1;

	configura_i2c_slave();

	while(1)
	{
		recebe_i2c();
		if (data == 64) led = 1;
		if (data == 68) led = 0;
	}
}

17.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h
//http://bradthx.blogspot.com.br/2011/11/pic18f-c18-implemented-i2c-slave.html

int addr;
int data;

void configura_i2c_slave(){
	OpenI2C( SLAVE_7, SLEW_OFF);
	SSPADD = 0xB0; //SSPADD contains I2C device address in SLAVE mode
}

//SSPBUF : Serial TX/RX data buffer.
//PIR1bits.SSPIF : Interrupt flag bit. This will be 1 when data is received into SSPBUF
//SSPSTATbits.BF : SSPBUF buffer full status bit. 1 = full, 0 = empty.
//SSPSTATbits.D_A : Data / Address bit. When receiving it indicates what the data received was. 0 = address, 1 = data.

void recebe_i2c(void) {
	if ( PIR1bits.SSPIF == 1 && SSPSTATbits.BF == 1 && SSPSTATbits.D_A == 0 )
	PIR1bits.SSPIF = 0;
	addr = SSPBUF;
	SSPSTATbits.BF = 0;
	
	if ( PIR1bits.SSPIF == 0 && SSPSTATbits.BF == 0 && SSPSTATbits.D_A == 1 )
	data = SSPBUF;
	PIR1bits.SSPIF = 0; //clear interrupt
	SSPSTATbits.D_A = 0; //set D_A bit to 0 so that we can check if the subsequent byte is more data.
}

Aula de programação C – 16

16. PRÁTICA 16: COMUNICAÇÃO I2C MASTER

Referencial Teórico: Modos de Comunicação I2C; Módulo MSSP.

Objetivo: Preparar um dispositivo Mestre para comunicação no barramento e protocolo I2C.

Materiais: Utilizar botão e led presentes na placa. A prática necessita da ligação física entre placas.

16.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){
	configura_portas();
	led_vermelho = 1;
	configura_i2c_master();

	while(1){
		if (botao == 1) {
			escrever_i2c(64);
			led = 1;
		}
		if (botao == 0) {
			escrever_i2c(68);
			led = 0;
		}
		espere_por(250); // 100ms
	}
}

16.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void configura_i2c_master(){
	OpenI2C( MASTER, SLEW_OFF);
	SSPADD = 27; //SSPADD Baud Register – 100Khz
	ADCON1 = 0x0F; // desabilita conversão a/d
}

void escrever_i2c(int databyte){
	StartI2C();
	IdleI2C();
	putcI2C(0xB0); //send address
	IdleI2C();
	putcI2C(databyte); //send data
	IdleI2C();
	StopI2C();
}

Aula de programação C – 16

16. PRÁTICA 16: COMUNICAÇÃO I2C MASTER

Referencial Teórico: Modos de Comunicação I2C; Módulo MSSP.

Objetivo: Preparar um dispositivo Mestre para comunicação no barramento e protocolo I2C.

Materiais: Utilizar botão e led presentes na placa. A prática necessita da ligação física entre placas.

16.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){
	configura_portas();
	led_vermelho = 1;
	configura_i2c_master();

	while(1){
		if (botao == 1) {
			escrever_i2c(64);
			led = 1;
		}
		if (botao == 0) {
			escrever_i2c(68);
			led = 0;
		}
		espere_por(250); // 100ms
	}
}

16.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void configura_i2c_master(){
	OpenI2C( MASTER, SLEW_OFF);
	SSPADD = 27; //SSPADD Baud Register – 100Khz
	ADCON1 = 0x0F; // desabilita conversão a/d
}

void escrever_i2c(int databyte){
	StartI2C();
	IdleI2C();
	putcI2C(0xB0); //send address
	IdleI2C();
	putcI2C(databyte); //send data
	IdleI2C();
	StopI2C();
}

Aula de programação C – 01

1. PRÁTICA 01: PISCA LED COM TEMPORIZAÇÃO

Referencial Teórico: Operadores de atribuição; Laço While; Funções de atraso.

Objetivo: Alternar o estado do LED por meio de temporização por DELAY.

Materiais: Utilizar led presente na placa.

1.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	while(1){
		led = 1;
		espere_por(250); // 100ms
		led = 0;
		espere_por(250); // 100ms
	}
}

1.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

Aula de programação C – 15

15. PRÁTICA 15: CONTROLE DE SERVO MOTOR COM BOTÃO – FOR/DELAY

Referencial Teórico: PWM por Sofware; Laço FOR, Variáveis.

Objetivo: Controlar o funcionamento de um servo motor, utilizando técnica de interrupção por tempo.

Materiais: Utilizar botão presente na placa, servo motor ligado à saída A e fonte de alimentação.

15.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();
	habilita_ponteh();
	MTR1_CW = 1;
	MTR2_CW = 1;

	configura_relogio();

	while(1){
		if (botao == 1) servo180();
		if (botao == 0) servo0();
	}
}

15.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void servo0();
void servo90();
void servo180();

int t = 0;

void servo0(){
	MTR1_CC = 1;
        //1,0ms
        for (t = 0; t < 800; t++)
        {
		MTR1_CC = 1;
        }
        for (t = 0; t < 15600; t++)
        {
		MTR1_CC = 0;
        }
}

void servo90(){
	MTR1_CC = 1;
        //1,5ms
        for (t = 0; t < 1200; t++)
        {
		MTR1_CC = 1;
        }
        for (t = 0; t < 15200; t++)
        {
		MTR1_CC = 0;
        }
}

void servo180(){
	MTR1_CC = 1;
        //2,0ms
        for (t = 0; t < 1600; t++)
        {
		MTR1_CC = 1;
        }
        for (t = 0; t < 15100; t++)
        {
		MTR1_CC = 0;
        }
}

Aula de programação C – 14

14. PRÁTICA 14: CONTROLE DE SERVO MOTOR COM BOTÃO – INTERRUPÇÃO

Referencial Teórico: PWM por Sofware; Laço FOR, Variáveis.

Objetivo: Controlar o funcionamento de um servo motor, utilizando técnica de interrupção por tempo.

Materiais: Utilizar botão presente na placa, servo motor ligado à saída A e fonte de alimentação.

14.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();
	habilita_ponteh();
	MTR1_CW = 1;
	MTR2_CW = 1;

	configura_relogio();

	while(1){
		if (botao == 1) servo = 180;
		if (botao == 0) servo = 0;
	}
}

14.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void servo0();
void servo90();
void servo180();

int t = 0;
int servo = 1;

void servo0()
{
	//1,0ms
	for (t = 0; t < 425; t++)
	{
		led = 1;
		MTR1_CC = 1;
		MTR2_CC = 1;
	}
}

void servo90()
{
	//1,5ms
	for (t = 0; t < 600; t++)
	{
		led = 1;
		MTR1_CC = 1;
		MTR2_CC = 1;
	}
}

void servo180()
{
	//2,0ms
	for (t = 0; t < 818; t++)
	{
		led = 1;
		MTR1_CC = 1;
		MTR2_CC = 1;
	}
}

void configura_relogio(){
	T0CON = 0x80; //20s
	INTCON = 0b10100000;
	TMR0H = 0x15; //20ms
	TMR0L = 0xA0; //20ms
}

#pragma code int_pr = 0x1848
#pragma interrupt trata_timer0

void trata_timer0(void)
{
	if (servo == 0 ) servo0();
	if (servo == 90 ) servo90();
	if (servo == 180 ) servo180();
	INTCONbits.TMR0IF = 0;
	TMR0H = 0x15; //20ms
	TMR0L = 0xA0; //20ms
	led = 0;
	MTR1_CC = 0;
	MTR2_CC = 0;
}

Aula de programação C – 13

13. PRÁTICA 13: CONTROLE DE FREQUÊNCIA DO BEEP

Referencial Teórico: Interrupção Timer 2; Modulação por Largura de Pulso.

Objetivo: Controlar a frequência de acionamento de um buzzer, por meio da modulação por largura de pulso disponível no microcontrolador.

Materiais: Utilizar buzzer presente na placa.

13.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	configura_pwm();

	while(1){
		periodo++;
		if (periodo >= 125) periodo = 0;
		define_periodo(periodo);
		espere_por(20);
	}
}

13.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

unsigned periodo = 0;

void define_periodo(unsigned periodo){
	SetDCPWM1(periodo);
}

void configura_pwm(){
	OpenTimer2(TIMER_INT_OFF &T2_PS_1_16);
	OpenPWM1(125); // 1ms = 1Khz
	define_periodo(periodo);
}