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);
}