Ir ao conteúdo

Comunicação serial rs 232 com o pic 16f628a


felipealencar16

Posts recomendados

Postado

Bom ! eu sou iniciante na área de programação de pic,tenho um trabalho de comunicação remota , q envia dados via rádio de um computador para outro,utilizei o software matlab,uma antena e o modulo rs232,agora estou pretendendo enviar o sinal de comando de um computador q será recebido na outra antena e passa pelo modulo rs232 e com isso utilizar um microcontrolador para acionar um motor talvez ou mesmo uma lâmpada,o q eu pretendo é controlar alguma coisa de uma certa distância...aguardo a ajuda de vocês

Postado

Tá na mão:

Meu recptor é esse:

receptor_pic.png

Ligo ele parecido com isso, sem esse CI aí debaixo. Apenas ele e o PIC. Nesse caso, pino 2, digital.:

recptor.png

Meu transmissor é igual a esse:

transmissor_pic.png

Ligo ele assim, mais uma vez, sem o CI debaixo, apenas ele e o PIC. A Alimentação é VCC mas coloco em um pino qualquer do PIC para poder ligar e desligar.

transmissor.png

Falou

Código transmissor:


//Feito por MatheusLPS - [email protected]

#include <16F628A.h>

#define WireTX PIN_B2
#define WireRX PIN_B1


#FUSES HS, NOWDT, NOPROTECT,NOLVP,BROWNOUT, PUT
#use delay (clock = 12000000)
#use rs232(baud=2400, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=Wireless)

void main()
{
while(1)
{
if(!input(PIN_B0)) //Só enviar quando o botão for precionado.
{
output_high (PIN_B7); //Ligo o transmissor (IMPORTANTE)
delay_ms (50);
fprintf(Wireless, "%c", 0xBA); // LAM - algo para que o RX's USART "lock onto", algo do tipo, olhe receptor, estoua qui
fprintf(Wireless, "%c", 0xBE); // LAM - algo para que o RX's USART "lock onto", algo do tipo, olhe receptor, estoua qui
fprintf(Wireless, "%c", 0xFA); // LAM - algo para que o RX's USART "lock onto", algo do tipo, olhe receptor, estoua qui
fprintf(Wireless, "%c", 0xCE); // LAM - algo para que o RX's USART "lock onto", algo do tipo, olhe receptor, estoua qui
fprintf(Wireless,"Felipe "); // Vou enviar isso ao recptor e ele vai procurar por Dave como sendo a senha, se for correta, ele interpreta a variável temp_1


output_low (PIN_B7); //Desligo o tnsmissor (MAIS IMPORTANTE AINDA)

do
{
} while (!input(pin_B0));
}
}
}
//Código de exemplo para transmissão de IDs por RF

Código receptor:


//Feito por MatheusLPS

//Comentários em Inglês para facilitar a portabilidade e posterior publicação

#include <16f628a.h>

#define WireTX PIN_b2
#define WireRX PIN_b1

#FUSES HS, NOWDT, NOPROTECT,NOLVP,BROWNOUT, PUT
#use delay(clock = 12000000)
#use rs232(baud=2400, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=Wireless)

#define RX_BUFFER_SIZE 20
#define TX_BUFFER_SIZE 20

int8 rx_wr_index = 0, tx_rd_index = 0, tx_wr_index = 0, tx_counter = 0, received = 0;
int8 lock_state = 0, rxd, i, valid_data_count;
unsigned int8 rx_buffer[RX_BUFFER_SIZE + 1], tx_buffer[TX_BUFFER_SIZE + 1];
int1 data_avail = FALSE, got_id = FALSE;

#int_RDA
void RDA_isr(void)
{
rx_buffer[rx_wr_index] = getc();
rxd = rx_buffer[rx_wr_index];
rx_wr_index++;

if (rx_wr_index > RX_BUFFER_SIZE) {
rx_wr_index = 0;
}

// now look for unique ID: "Dave "
if (rxd == 'F' && lock_state == 0) {
lock_state++;
}
else if (rxd == 'e' && lock_state == 1) {
lock_state++;
}
else if (rxd == 'l' && lock_state == 2) {
lock_state++;
}
else if (rxd == 'i' && lock_state == 3) {
lock_state++;
}

else if (rxd == 'p' && lock_state == 4) {
lock_state++;
}

else if (rxd == 'e' && lock_state == 5) {
lock_state++;
}

else if (rxd == ' ' && lock_state == 6) { // got the entire string "Dave ", in that order
lock_state = 0; // reset our "combination lock"
got_id = TRUE;
valid_data_count = 0xff; // get ready to count the number of data bytes - we know we have to expect 5 (Rocks)
// also going to reset the buffer write index back to 0, so that I know where my valid data will be
rx_wr_index = 0;
}
else { // we didn't receive "Dave ", so reset the lock back to the beginning
lock_state = 0;
}

if (got_id && ++valid_data_count == 10) {
data_avail = TRUE;
got_id = FALSE;
}
}

/*#int_TBE
void TBE_isr(void) {
if (tx_counter != 0) {
putc(tx_buffer[tx_rd_index]);
if (++tx_rd_index > TX_BUFFER_SIZE) {
tx_rd_index = 0;
}
tx_counter--;
if (tx_counter == 0) {
disable_interrupts(INT_TBE);
}
}
}

void bputc(int c) {
int restart = 0;

while (tx_counter > (TX_BUFFER_SIZE - 1));

if (tx_counter == 0) {
restart = 1;
}
tx_buffer[tx_wr_index++] = c;
if (tx_wr_index > TX_BUFFER_SIZE) {
tx_wr_index = 0;
}
tx_counter++;
if (restart == 1) {
enable_interrupts(INT_TBE);
}
}*/

void main()
{
output_low (PIN_B0);
enable_interrupts(INT_RDA);

enable_interrupts(global);

while (TRUE) {
restart_wdt();
if (data_avail)
{
output_toggle(PIN_B0);
data_avail = FALSE;
}
}
}
//Programa teste para recepção de Ids por RF

Testado e funcionando.

A interpretação deixo como exercício! :D

Falou

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...