Ir ao conteúdo
  • Cadastre-se

TUTORIAL: Projeto PicUSB quase pronto PIC<-->RF<-->PIC<-->USB<-->PC


Posts recomendados

Para o pessoal nao ficar perdido, postarei o código do transmissor e explicarei:

Código transmissor:

//Código de exemplo para transmissão de temperatura por RF
//Feito por MatheusLPS - [email protected]

#include <18f4550.h>

#define WireTX PIN_C6
#define WireRX PIN_C7


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

int8 i, flag=0;
int16 q;

int8 envio[7]={1,2,3,4,5,6,0x00};

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
if (q == 30)
{
flag=1;
q=0;
}
set_timer1 (3036); //Preload do Timer1
}


void main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while(1)
{
if(flag == 1) //Só enviar quando o botão for precionado.
{
output_high (PIN_C2); //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,"Dave "); // Vou enviar isso ao recptor e ele vai procurar por Dave como sendo a senha, se for correta, manda os dados
for (i=0;i<8;i++)
{
fprintf(Wireless,"%d",envio[i]);
}
output_low (PIN_C2); //Desligo o tnsmissor (MAIS IMPORTANTE AINDA)
flag = 0;
}
}
}

Explicação:

#include <18f4550.h>          

#define WireTX PIN_C6
#define WireRX PIN_C7


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

Bem, começamos dizendo qual PIC estamos utilizando, definindo uma variável para os pinos C6 e C7 . Sendo os mesmos, os pinos de comunicação serial. Dessa forma essa comunicação não é por software, é por hardware!

int8 i, flag=0;
int16 q;

int8 envio[7]={1,2,3,4,5,6,0x00};

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
if (q == 30)
{
flag=1;
q=0;
}
set_timer1 (3036); //Preload do Timer1
}

Nessa parte, crio umas variáveis e logo em seguida cria uma interrupção de tempo com o TIMER1.

Como estou utilizando um cristal de 12Mhz, essa interrupção está gerando um tempo de 5 segundos. Ou seja, minha variável chamada flag recebe o vaor 1 a cada 5 segundos.

void main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

Configurações básicas do TIMER1. Apenas isso na rotina principal.

while(1)
{
if(flag == 1) //Só enviar quando o botão for precionado.
{
output_high (PIN_C2); //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,"Dave "); // Vou enviar isso ao recptor e ele vai procurar por Dave como sendo a senha, se for correta, manda os dados
for (i=0;i<8;i++)
{
fprintf(Wireless,"%d",envio[i]);
}
output_low (PIN_C2); //Desligo o tnsmissor (MAIS IMPORTANTE AINDA)
flag = 0;
}
}
}

Bem, funciona assim: Meu códifo começa com a variável flag em 0, ou seja, o que está dentro do loop nao será executado. Passados os 5 segundos, a flag recebe 1 e deixa o loop fluir.

Dentro do loop tenho um comando para colocar o PINO C2 em nível alto. Isso serve para ligar meu transmissor. Logo em seguida, espero um pouquinho com o delay.

Logo em seguida vem vários printf's que servem para enviarem dados "lixo" para o receptor. Isso fará com que o receptor foque no transmissor.

Em seguida, mandamos nossa senha, nesse caso a senha é "Dave ". É interessante enviar sempre uma senha ou antes de enviar os dados para certificar que estamos enviando dados corretos e nao lixo.

Logo depois da senha, enviamos os dados que queremos. Nesse exemplo, enviamos a variável envio que é um vetor que foi declarado lá no início com dígitos aleatórios.

Logo depois disso desligamos o trasnsmissor. Muito importante. E em seguida colocamos a falag em 0 novamente e o ciclo recomeça.

Bem, é isso!

O reeptor é bem mais chatinho! hauhauhaahua

Falou

Link para o comentário
Compartilhar em outros sites

Uai.. eu quero enviar os dados a cada 5 segundos. Então, dessa form, nada melho que o timer para calcular o tempo pra mim né?

ERRORS, STREAM=Wireless é o nome "padrão" de toda conunicação serial. Sendo o errors obrigatório e o wireless o nome da conexão.

Dessa forma posso ter mais uma conexão em um mesmo PIC. Apenas devo colocar nomes diferentes.

Falou

Link para o comentário
Compartilhar em outros sites

Pronto peguei o seu programa e modifquei algumas coisa, poucas na vdd, agora surgiram novas dúvidas.

1º: como você fez com o descriptor pra gerar o vid e pid, pois com o mikro eu utilizava um programa qe vem com o mesmo pra gerar esse arquivo. E pude notar que no programa você inclui alguns arquivos, que parecem ter relação com isso:

#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h> //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports

2º Estou utilizando um cristal de 8Mhz, nos fusíveis eu teria que trocar o PLL?

3º Ainda nos Fusiveis, não estou utilizando o conversor analogico, eu tenho que retirar o Vregen, ou não tem nada a ver?

Segue o programa abaixo

#include <18f4550.h>          

#define WireTX PIN_C6
#define WireRX PIN_C7


#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay (clock = 48000000)
#use rs232(baud=9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=Wireless)

#define USB_HID_DEVICE FALSE //Desabilitamos as diretivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 4 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 8 //size to allocate for the rx endpoint 1 buffer


#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h> //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports

#define LED_OK PIN_B6
#define LED_FAIL PIN_B7
#define LED_ON output_high
#define LED_OFF output_low

#define modo recebe[0]
#define param1 recebe[1]
#define param2 recebe[2]
#define param3 recebe[3]
#define param4 recebe[4]


void main(void) {

int8 recebe[5];

LED_OFF(LED_OK); //acendemos o led vermelho
LED_ON(LED_FAIL);

usb_init(); //inicializa a USB
usb_task(); //habilita periférico usb e interrupções
usb_wait_for_enumeration(); //esperamos até que o periférico PicUSB seja configurado pelo host

LED_OFF(LED_FAIL);
LED_ON(LED_OK); //acendemos o led Verde

while (TRUE)
{
if(usb_enumerated()) //Se o PicUSB está configurado
{
if (usb_kbhit(1)) //Se o endpoint de saída contem dados do host
{

usb_get_packet(1, recebe, 5);// Pegamos o pacote do tamanho de 5bytes e o alocamos no recebe

if (modo == 0) // Modo Pan e Tilt
{
if (param1 == 0)
{
fputc('P',Wireless); //Parâmetro Para
delay_ms(20);

}

if (param1 == 1)
{
fputc('E',Wireless); //Parâmetro Esquerda
delay_ms(20);

}

if (param1 == 2)
{
fputc('D',Wireless); //Parâmetro Direita
delay_ms(20);

}

if (param1 == 3)
{
fputc('C',Wireless); //Parâmetro Cima
delay_ms(20);
}

if (param1 == 4)
{
fputc ('B',Wireless); //Parâmetro Baixo
}
}
}
}
}
}

Link para o comentário
Compartilhar em outros sites

você fez quase correto mesmo.

Deixe do jeito que está que ele gera o VID e o PID automático.

Para cristal de 8Mhz utilize PLL2. Não retire nenhum fuse!

No meu projeto utilizei extamente como você está afzedno no transmissor que tinha USB também.

No entanto, só funcionou dessa forma utilziando cabo no TX e no RX. Com RF não!

Para o RF funcionar, você deve utilizar o código de exemplo que postei. você q você não está usando.

Falou

Link para o comentário
Compartilhar em outros sites

Além disso que você disse, que eu ligo e desligo o transmissor envio também isso:

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,"Dave "); // Vou enviar isso ao recptor e ele vai procurar por Dave como sendo a senha, se for correta, manda os dados

Essa primeira parte aí é um lixo que você envia para o receptor "captar a presença" do transmissor e focar nele.

Depois envio uma senha para verificar que os dados q estão chegando são verdadeiros.

você quando terminar de enviar os dados deve deligar o transmissor, ou então ele vai ficar interferindo n receptor e o mesmo fica doido. Demorei p descobrir isso! Só funcionou comigo depois disso!

Falou

Link para o comentário
Compartilhar em outros sites

hum entendi, eu tenho que habilitar as interrupções globais também?

?

Olha como ficou agora:


#include <18f4550.h>

#define WireTX PIN_C6
#define WireRX PIN_C7


#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay (clock = 48000000)
#use rs232(baud=9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=Wireless)

#define USB_HID_DEVICE FALSE //Desabilitamos as diretivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 4 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 8 //size to allocate for the rx endpoint 1 buffer


#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h> //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports

#define LED_OK PIN_B6
#define LED_FAIL PIN_B7
#define LED_ON output_high
#define LED_OFF output_low

#define modo recebe[0]
#define param1 recebe[1]
#define param2 recebe[2]
#define param3 recebe[3]
#define param4 recebe[4]


void main(void) {

int8 recebe[5];

LED_OFF(LED_OK); //acendemos o led vermelho
LED_ON(LED_FAIL);

usb_init(); //inicializa a USB
usb_task(); //habilita periférico usb e interrupções
usb_wait_for_enumeration(); //esperamos até que o periférico PicUSB seja configurado pelo host

LED_OFF(LED_FAIL);
LED_ON(LED_OK); //acendemos o led Verde

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, manda os dados

while (TRUE)
{
if(usb_enumerated()) //Se o PicUSB está configurado
{
if (usb_kbhit(1)) //Se o endpoint de saída contem dados do host
{

usb_get_packet(1, recebe, 5);// Pegamos o pacote do tamanho de 5bytes e o alocamos no recebe

if (modo == 0) // Modo Pan e Tilt
{
if (param1 == 0)
{
fputc('P',Wireless); //Parâmetro Para
delay_ms(20);

}

if (param1 == 1)
{
fputc('E',Wireless); //Parâmetro Esquerda
delay_ms(20);

}

if (param1 == 2)
{
fputc('D',Wireless); //Parâmetro Direita
delay_ms(20);

}

if (param1 == 3)
{
fputc('C',Wireless); //Parâmetro Cima
delay_ms(20);
}

if (param1 == 4)
{
fputc ('B',Wireless); //Parâmetro Baixo
}
}
}
}
}

Fui testar ele aparecce o nome na tela do dispositivo que foi conectado, mas pede para instalar o driver, qual driver seria esse???

Link para o comentário
Compartilhar em outros sites

Lá na 1ª página, no post nº 2 tem tem um link para download com os arquivos necessaários.

Inclusive o driver.

Essa parte:

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 Felipe como sendo a senha, se for correta, manda os dados

Está no lugar errado. você deve colocar aqui:

if (param1 == 0) 
{
fputc('P',Wireless); //Parâmetro Para
delay_ms(20);

}

Aí logo depois do Felipe, você manda o P.

O código do receptor deverá ser modificado de acordo!

Falou

Link para o comentário
Compartilhar em outros sites

ah parte do driver acabei de resolver, tive que reler os posts... Testei no Proteus e funcionou legal, sem modificar isso que você falou.Mas n esperimentei enviar dados do host pro pic.

Vou partir pro Receptor agora.

Será que você poderia dar uma breve explicação do código do recptor como você fez com o transmissor???

O programa está ficando assim:

#include <16f628a.h>

#fuses HS,EC_IO,NOWDT,MCLR,BROWNOUT,NOPROTECT,NOLVP,NOCPD
#use delay (clock = 12000000)
//------------------------------
#define WireTX PIN_B2
#define WireRX PIN_B1 //<-----
//------------------------------
#use rs232(baud=9600,parity=N,xmit=WireTX , rcv=WireRX ,bits=8,ERRORS , STREAM=Wireless)

unsigned int8 data;
int flag=0;

#define IN1 PIN_A0 //Pinos de controle do L293D
#define IN2 PIN_A1
#define IN3 PIN_A2
#define IN4 PIN_A3

#int_rda
void rd_isr(void)
{
disable_interrupts(INT_RDA); // Disable Serial Recieve Interrupt
disable_interrupts(GLOBAL); // Disable Global Interrupts

data= fgetc(Wireless);
if(data=='P')
{
flag=1;
}

if(data=='E')
{
flag=2;
}

if(data=='D')
{
flag=3;
}

if(data=='C')
{
flag=4;
}

if(data=='B')
{
flag=5;
}

enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
}

void main()
{
enable_interrupts(int_rda);
enable_interrupts(global);

output_high (PIN_D2);

for(;
{
Switch (flag)
{
Case 1:
{

output_low (IN1);
output_low (IN2);

output_low (IN3);
output_low (IN4);
break;
}

Case 2:
{

output_low (IN2);

output_low (IN3);
output_low (IN4);
output_high (IN1);
break;
}

Case 3:
{
output_low (IN1);

output_low (IN3);
output_low (IN4);
output_high (IN2);

break;
}

Case 4:
{
output_low (IN1);

output_low (IN2);

output_low (IN4);
output_high (IN3);
break;
}

Case 5:
{
output_low (IN1);
output_low (IN2);
output_low (IN3);
output_high (IN4);
break;
}

flag=0;
}
}
}

Mas estou com uma dúvida como eu faço pra ele começar a trablhar só quando ele receber inicialmente a string "Felipe "??

Eu vi no outro programa do sensor de temperatura o que você fez mas n entendi muito bem.

Link para o comentário
Compartilhar em outros sites

o que pensei em fazre foi isso, mas n creio que esteja correto

#include <16f628a.h>

#fuses HS,EC_IO,NOWDT,MCLR,BROWNOUT,NOPROTECT,NOLVP,NOCPD

#use delay (clock = 12000000)

//------------------------------

#define WireTX PIN_B2

#define WireRX PIN_B1 //<-----

//------------------------------

#use rs232(baud=9600,parity=N,xmit=WireTX , rcv=WireRX ,bits=8,ERRORS , STREAM=Wireless)

unsigned int8 data;

int flag=0;

#define IN1 PIN_A0 //Pinos de controle dos motores

#define IN2 PIN_A1

#define IN3 PIN_A2

#define IN4 PIN_A3

#int_rda

void rd_isr(void)

{

disable_interrupts(INT_RDA); // Disable Serial Recieve Interrupt

disable_interrupts(GLOBAL); // Disable Global Interrupts

data= fgetc(Wireless);

if(data=='Felipe '){

if(data=='P')

{

flag=1;

}

if(data=='E')

{

flag=2;

}

if(data=='D')

{

flag=3;

}

if(data=='C')

{

flag=4;

}

if(data=='B')

{

flag=5;

}

}

enable_interrupts(GLOBAL);

enable_interrupts(INT_RDA);

}

void main()

{

enable_interrupts(int_rda);

enable_interrupts(global);

output_high (PIN_D2);

for(;;)

{

Switch (flag)

{

Case 1:

{

output_low (IN1);

output_low (IN2);

output_low (IN3);

output_low (IN4);

break;

}

Case 2:

{

output_low (IN2);

output_low (IN3);

output_low (IN4);

output_high (IN1);

break;

}

Case 3:

{

output_low (IN1);

output_low (IN3);

output_low (IN4);

output_high (IN2);

break;

}

Case 4:

{

output_low (IN1);

output_low (IN2);

output_low (IN4);

output_high (IN3);

break;

}

Case 5:

{

output_low (IN1);

output_low (IN2);

output_low (IN3);

output_high (IN4);

break;

}

flag=0;

}

}

}

adiantando já, será que teria como você me explicar também, como fazer um programinha simples para o pc, para enviar dados pela usb, tipo 5 botões e cada um envia um valor para a usb??

Link para o comentário
Compartilhar em outros sites

Opa!

voltei.

Mudei umas coisas no código aqui e coube no 16F68A!!!!!!!!!!!!!!!!!!!!

Teste aí p mim:

Transmissor:


//Feito por MatheusLPS - [email protected]

#include <18f4550.h>

#define WireTX PIN_C6
#define WireRX PIN_C7


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

int8 i;

int8 envio[7]={1,2,3,4,5,6,0x00};
char teste = 123;


void main()
{
while(1)
{
if(!input(PIN_D2)) //Só enviar quando o botão for precionado.
{
output_high (PIN_C2); //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_C2); //Desligo o tnsmissor (MAIS IMPORTANTE AINDA)

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

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 10
#define TX_BUFFER_SIZE 10

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

Falou

Link para o comentário
Compartilhar em outros sites

Isso mesmo!

A única coisa q esses códigos fazem por enquanto é enviar a senha e se ela chegar do outro lado, piscar um led.

O transmissor nao precisa se o 18F4550.

Circuito:

rf_16f628a.png

Experimente esse para o 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

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!