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
É importante lembrar que, embora simples, este programa que iremos usar possui as características de uma transmissão serial. Neste caso, quando definimos que o byte que iremos transmitir para sinalizar o acendimento do LED é o byte 0x55, estamos definindo nosso próprio protocolo (que irá estar posicionado dentro de outro protocolo, que é o RS232). Ao final da aula, existe uma atividade que irá incrementar este protocolo, fazendo com que existam mais LEDs e mais botões.
Como explicamos anteriormente, este programa inicial é super simples. Ele apenas irá verificar o estado de uma chave e caso esta chave seja pressionada um byte será enviado para a porta serial.
A seguir está a listagem. Iremos comentar passo a passo as partes do código para entendermos o que se passa.
// inclui a biblioteca do compilador do MPLAB
#include <xc.h>
// desliga as configurações watchdog time e programação em baixa tensão
#pragma config WDTEN = OFF, LVP = OFF
#include "p18f45k20.h"
// "PBADEN = OFF" define que os bits 1, 2, 3 e 4 da porta B
// devem ser configurados como pinos I/O digitais.
#pragma config PBADEN = OFF
// define a frequência utilizada pelo microcontrolador
#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()
{
// variável que verificará o estado da chave
unsigned char chave;
// configura a porta B como entrada
TRISB = 0xff;
// chama a função para configurar a serial
configura_serial();
// Configura o PORTD, como saída para sinalizar envio
TRISD = 0x00;
// repete para sempre
while(1){
// ler o estado da chave
chave = PORTB;
// se a chave estiver pressionada
if (chave>0) {
// transmite o valor 85 (bits alternados)
TXREG = 0b01010101;
//acende o led indicador de transmissão
PORTD = 0x01;
// espera transmitir o byte
while (!(PIR1&0b00010000));
// aguarda meio segundo
__delay_ms(500);
// apaga o led indicador de transmissão
PORTD = 0x00;
}
}
}
#include "p18f45k20.h"
Essa linha inclui no programa o arquivo com as funções que o PIC possui e define as variáveis que serão nomes dos registradores. Observe que ela tem o nome exato do PIC que iremos usar, pois os registradores e funções variam de PIC para PIC.
void configura_serial()
{
// configura o transmissor
TXSTA = 0b00100000;
// configura o receptor
RCSTA = 0b10010000;
// velocidade = Fosc/(64*(SPBRG+1))
SPBRG = 12; // 1200 bps
}
Nesse block, estamos definindo uma função que configura os parâmetros da porta serial. A primeira coisa a fazer é configurar a transmissão (ver datasheet do PIC) no registrador TXSTA. É aí que definimos que não vai haver bit de paridade e que teremos apenas um stop bit. Em uma transmissão serial, temos que configurar também o registrador de recepção (embora não seja utilizado aqui) e isso é feito no registrador RCSTA. Após isso, temos que ajustar o divisor de clock que fará com que a taxa de transmissão seja a que desejamos. Isso é feito no registrador SPBRG.
Para calcular o valor a ser colocado no registrador SPBRG, temos que ter a frequência de clock do PIC e a taxa de transferência desejada. Dessa forma, fazemos o seguinte:
SPBRG=Fclock64⋅BPS−1No caso do nosso exemplo, como queremos 1200bps e iremos usar um cristal de 1MHz (na verdade é a frequência do oscilador interno do microcontrolador), temos:
SPBRG=100000064⋅1200−1=12void main()
{
// variável que verificará o estado da chave
unsigned char chave;
// configura a porta B como entrada
TRISB = 0xff;
// chama a função para configurar a serial
configura_serial();
// Configura o PORTD, como saída para sinalizar envio
TRISD = 0x00;
Aqui começa a execução. Definimos uma variável para receber o estado da chave (que iremos pressionar para enviar o byte), definimos a porta que a chave está ligada (no caso a porta B do PIC) como entrada, chamamos a função que configura a porta serial (que comentamos há pouco) e por fim, configuramos a porta D (onde o led de indicação de transmissão está conectado) como saída para podermos acendê-lo quando realizar uma transmissão.
// repete para sempre
while(1){
// ler o estado da chave
chave = PORTB;
Aqui é o laço principal do programa. Ele repetirá para sempre e a primeira coisa que faz é ler o estado da porta B (e, consequentemente, da chave).
// se a chave estiver pressionada
if (chave>0) {
// transmite o valor 85 (bits alternados)
TXREG = 0b01010101;
//acende o led indicador de transmissão
PORTD = 0x01;
// espera transmitir o byte
while (!(PIR1&0b00010000));
// aguarda meio segundo
__delay_ms(500);
// apaga o led indicador de transmissão
PORTD = 0x00;
}
}
}
Caso a chave seja pressionada, um valor que não é zero (e que depende de qual bit a chave esteja conectada) irá aparecer na variável chave. Então, nós acendemos o led para indicar a transmissão, transmitimos o byte (bastando escrever no registrador TXREG) e depois esperamos a transmissão terminar (testando o 5º bit do registrador PIR1), além de esperar meio segundo para então apagar o led.
Versão 5.3 - Todos os Direitos reservados