Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Eletrônica / Projeto de Sistemas RF / Aula
Como no transmissor, iremos colocar o código aqui e comentar. Basicamente, o que o receptor faz é (em um laço) esperar chegar algum valor na porta serial e, caso chegue, testa se é o valor que estamos esperando. Se for, acende o LED.
#include <xc.h>
#pragma config WDTEN = OFF, LVP = OFF
#include "p18f45k20.h"
#define _XTAL_FREQ 1000000
// esta função serve apenas para organizar o código
// ela configura os registradores da comunicação
// serial. Para este caso, 1200 bps, 8 bits, sem
// bit de paridade e 1 stop bit
void configura_serial()
{
// configura o transmissor
TXSTA = 0b00100000;
// configura o receptor
RCSTA = 0b10010000;
// velocidade = Fosc/(64*(SPBRG+1))
SPBRG = 12; // 1200 bps
}
void main (void)
{
// variável que armazenará o valor recebido da serial
unsigned char valor_recebido;
// chama a função para configurar a serial
configura_serial();
// configura a porta B como saída
TRISB = 0;
// repete para sempre
while(1){
// prepara para receber
RCSTA = 0b10010000;
// espera chegar algum dado na serial
while ((PIR1&32)==0);
// ler o valor recebido
valor_recebido = RCREG;
// reseta a serial para uma nova recepção
RCSTA = 0b10000000;
// compara para ver se é o valor correto
// e então acende o LED
if (valor_recebido == 85)
PORTB = 0xff;
// espera alguns instantes
__delay_ms(500);
// apaga o LED
PORTB=0;
}
}
As linhas do include e da função configura_serial são as mesmas do transmissor, por isso não iremos comentar.
void main (void)
{
// variável que armazenará o valor recebido da serial
unsigned char valor_recebido;
// chama a função para configurar a serial
configura_serial();
// configura a porta B como saída
TRISB = 0;
Aí se inicia a execução do programa. Definimos uma variável para guardar o valor recebido pela serial e configuramos a porta serial. É necessário também configurar a porta B como saída (pois o LED irá conectar-se a ela).
// repete para sempre
while(1){
// prepara para receber
RCSTA = 0b10010000;
// espera chegar algum dado na serial
while ((PIR1&32)==0);
Aqui o laço começa. Precisamos iniciar a recepção colocando o valor de configuração no registrador RCSTA (o mesmo que configuramos na função de configurar a porta). Depois disso prendemos o programa em um laço que só sai quando o 6ª bit do registrador PIR1 é ligado (indicando que chegou um byte na serial).
// ler o valor recebido
valor_recebido = RCREG;
// reseta a serial para uma nova recepção
RCSTA = 0b10000000;
Para ler o byte que chegou, simplesmente, lemos o valor do registrador RCREG. Em seguida, inicializamos o receptor novamente (para que fique pronto novamente para ler outro byte).
// compara para ver se é o valor correto
// e então acende o LED
if (valor_recebido == 85)
PORTB = 0xff;
// espera alguns instantes
__delay_ms(500);
// apaga o LED
PORTB=0;
}
}
Finalmente, testamos se o valor recebido foi o esperado (85) e, se for, ligamos os bits da porta B (acendendo o LED). Após isso, esperamos um tempinho (para o usuário ver que o LED acendeu) e depois o apagamos. O laço volta e todo o processo se repete.
A forma de escrever um byte, usada ainda há pouco (0x55), refere-se a um valor HEXADECIMAL (neste caso o valor 85). Mas porque usamos esse valor?
Bem, poderia ser qualquer valor, mas esse aí em binário é 01010101, o que fica fácil de gerar com um gerador de sinais e testar o receptor sem o transmissor!
Versão 5.3 - Todos os Direitos reservados