Ir ao conteúdo
  • Cadastre-se

Transmissão e recepção com PIC 16F628A


fonsecaricardo

Posts recomendados

Amigo... esses códigos:

#include <16F628A.h>
#device *=16
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(baud=1200, xmit=PIN_B2, rcv=PIN_B1, stream=PC)

São do CCS, no MikroC não precisa de nada disso....

Fiz umas alterações e aqui chegou a compilar, isso quer dizer que não tem erros "Ortográficos" no programa... Bom ta ai (A logica permanece a mesma, apenas acertei uns pontos e virgulas, apenas no código do emissor... O do receptor... Bom... Analise os dois e perceba as diferenças, assim você vai saber o que esta errado XD).. Testa ai e posta o resultado OK...?

void RF_Init()
{
UART1_Init (1200);
Delay_ms(100);
}
void RF_Receive_Init()
{
RCIE_bit = 1;
GIE_Bit = 1;
PEIE_Bit = 1;
}
void RF_Send(char comando, char valor)
{
char checksum;
checksum = ~(char)(comando + valor);
UART1_Write(0xFF); //Start
delay_ms(10);
UART1_Write(comando); //Comando
delay_ms(10);
UART1_Write(valor); //Valor
delay_ms(10);
UART1_Write(checksum); //Checksum
delay_ms(10);
}
char started, count;
void RF_Read(char *Cmd, char *Val, char *Ok)
{
char buffer;
char checksum_byte;
*Ok = 0;
if(PIR1.RCIF)
{
buffer = Uart1_Read();
if(started)
{
count++;
if(count == 1)
{
*Cmd = buffer;
}
if(count == 2)
{
*Val = buffer;
}
if(count == 3)
{
checksum_byte = buffer;
started = 0;
if(checksum_byte == ~(char)(*Cmd + *Val))
{
*Ok = 1;
}
}
}
else
{
if(buffer == 0xFF)
{
started = 1;
count = 0;
}
}
}
}


void main()
{
CMCON=0x07; //Desativa as portas analógicas(PORTA e PORTB)
TRISB = 3;
RF_Init();
while(1)
{
if(PORTB.F0 == 1)
{
RF_Send( 'A', 1 );
}
else if(PORTB.F1 == 1)
{
RF_Send( 'A', 0 );
}
}
}

Link para o comentário
Compartilhar em outros sites

Boa noite pessoal!

Venho informar que consegui hahaha

Encontrei algo mais simples, mas que funcionou e estou muito feliz, vou mostrar o esquema e o código que usei.

Sério que alegria quando acendeu o led na recepção HEUIHUIEHIUEHIUHEUIHEUIHEIUHEUIHEIUHEUIHEUIHEHEUIHEIU

pojeto.jpg

Até mesmo nem sei em qual linguagem ao certo está, mas como funcionou, por hoje quero só aproveitar heuiheuiheuiheui

Mas quero ver se entendo bem e consiga aprimorar melhor e fazer algo mais elaborado, aqui vai:

inicio:

HIGH PortB.0

GOSUB timer

LOW PortB.0

GOSUB timer

GOTO inicio

timer

PAUSE 1000

RETURN

Retirei de um livro, que é espanhol, mas é bem acessível, exatamente o que eu estava precisando.

Sei que vocês pedem para não postar o link, mas como é um livro vou postar o link:

Electrónica Práctica Con Microcontroladores Pic

http://www.4sync.com/rar/ASC5dPGG/Electrnica_Prctica_Con_Microco.html

Obrigado pela ajuda de todos, mas segue a luta, mas por hoje vou dar um tempinho, mente cansou hoje heuiheiuehu

Abraços

Link para o comentário
Compartilhar em outros sites

Pessoal, pretendo fazer um projeto utilizando RF também, mas é apenas pra aprender mesmo .

Fui atrás do módulos e dos HTs e dei uma estudada na codificação Manchester, mas não encontrei nada que desse uma explicação um pouco mas sólida, achei a explicação muito por cima ..

Mas tentando fazer pelo que entendi, fiz um código me basendo no que dizia no microcontrolandos ( que o fonsericardo postou ) .. A parte da transmissão consegui fazer, mas a parte de recepção não entendi muito bem como funcionava o código, então tentei a partir daquele pdf que o Aphawk recomendou. O programa de lá funcionou sem problemas, apenas mudei o microcontrolador que estou usando e funcionou :D

Agora estou tentando entender o código ..

Transmissor :

'---------------------------------------------------------------

' Compiler Directives (these tell Bascom things about our hardware)

$crystal = 8000000 ' internal clock

$regfile = "m328pdef.dat"

'---------------------------------------------------------------

' Hardware Setups

' setup direction of all ports

Config Portb = Output

Config Portc = Output

Config Portd = Output

' Hardware Aliases

Tx_data Alias Portd.2

Tx_led Alias Portc.0

' initialise ports so hardware starts correctly Porta = &H00

Set Tx_data

Set Tx_led

Set Portc.1

'------------------------------------------------------------------

' Declare Constants

Const Tx_del = 230 'micro seconds

' Declare Variables

Dim I As Byte 'temporary variable

Dim J As Byte 'temporary variable

Dim Addr As Byte

Dim Dat As Byte 'the 4 bits of data to send

' Initialise Variables

Addr = &B01101111 'the address for this system

'------------------------------------------------------------------

' Program starts here

' the main program is just a test routine to test the subroutine

' that does the actual work

' Continuously transmit the values 0 to 15

For I = 1 To 4 ' ?

Toggle Tx_led ' Troca estado do Led

Waitms 500

Next

Do

For Dat = 0 To 15 ' Envia ao receptor valores de 0 a 15

Gosub Transmit ' Allow the data to be transmitted

Waitms 1000 ' Delay apenas para visualização

Next I

Loop

'------------------------------------------------------------------

' Subroutines

Transmit:

Reset Tx_led ' Acende o led que sinaliza quando cada tranmissão é feita

For J = 1 To 6 'send full word 6 times

'send the start bit first

Set Tx_data

Waitus Tx_del ' Indica início da tranmissão dos bytes

Reset Tx_data ' ?

'send the address

For I = 7 To 0 Step -1 'send most significant bit(7) first ' ?

Waitus Tx_del 'start with 1 period of no carrier

If Addr.i = 1 Then

Waitus Tx_del 'extra low time for 1

Set Tx_data 'carrier on

Waitus Tx_del

Reset Tx_data 'carrier off

Else

Set Tx_data 'carrier on

Waitus Tx_del 'extra carrier on time for 1

Waitus Tx_del

Reset Tx_data 'carrier off

End If

Next

'send the data

For I = 3 To 0 Step -1 'send most significant bit(3) first

Waitus Tx_del 'start with 1 period of no carrier

If Dat.i = 1 Then

Waitus Tx_del 'extra low time for 1

Set Tx_data 'carrier on

Waitus Tx_del

Reset Tx_data 'off

Else

Set Tx_data 'on

Waitus Tx_del 'extra carrier on time for 0

Waitus Tx_del

Reset Tx_data 'off

End If

Reset Tx_led

Next

Waitus 9000 'pause between words

Next

Set Tx_led 'TX LED off

Return

O código do receptor é simples, então não tive problemas de entender, mas se alguém quiser dar uma olhada ..

'------------------------------------------------------------------

' Compiler Directives (these tell Bascom things about our hardware)

$crystal = 8000000 ' internal clock

$regfile = "m16def.dat" ' ATMEGA16

'------------------------------------------------------------------

' Hardware Setups

' setup direction of all ports

Config Porta = Output '4 leds on PortA.0to A.3

Config Portb = Input ' Valid data is input on this port

Config Portc = Output ' Used for LED's and LCD

Config Portd = Input ' PortD.2 is used for Data Valid

'-------------------------------------------------------------------------------

Config Lcd = 16 * 2

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2

'-------------------------------------------------------------------------------

' Hardware Aliases

Ht12d_dv Alias Pind.2

'------------------------------------------------------------------

' Declare Constants

Const True = 1

Const False = 0

' Declare Variables

Dim Rcvd_value As Byte

' Initialise Variables

'------------------------------------------------------------------

' Program starts here

Cls

Cursor Off

Locate 1 , 1

Lcd " RF teste "

Do

If Ht12d_dv = True Then ' If signal present

Gosub Get_data ' Wait until a valid value

Porta = Not Rcvd_value 'display on leds - inverse

Locate 2 , 1

Lcd "Valor Rec. = "

Lcd Rcvd_value ; " " ' display value

End If

Loop '

End 'end program

'------------------------------------------------------------------

Get_data:

Rcvd_value = Pinb And &H0F ' get value from lower nibble PortB

While Ht12d_dv = True ' wait until data no longer valid

Wend

Return

Não entendi muito bem a subrotina Transmit do código do transmissor ...

Pelo que entendi, acho que esses Delays fazem parte da codificação Manchester, certo ? Mas não entendi bem a função do I e nem do Tx_data ..

Alguém poderia me explicar como funciona essa subrotina ?

Se alguém tiver também um link que de uma explicação mais abrangente na Manchester vai ser bastante útil !

Link para o comentário
Compartilhar em outros sites

Opa, um modem usando modulação bifásica ( Manchester ) foi o meu trabalho de graduação na facvuldade....

É bem simples :

- Cada bit de informaçào é transmitido em um certo tempo fixo ( período ) .

- O valor 0 é transmitido como uma variação de baixo para alto, e o valor 1 é uma vartiação de alto para baixo.

- Essas transiçoes de 1 para 0 ou de 0 para 1 tem de ocorrer sempre exatamente no meio do período !

- Uma transição no início do período não significa dados !

Ou seja, imagine um clock , de onda quadrada, que quando o bit a ser enviado não muda, é um clock normal. Porém, se o bit a ser enviado muda, equivale a DOBRAR o período desse clock !

É complicado de explicar em palavras, mas uma imagem vale mais do que mil palavras, então :

manchester_coding1.jpg

O sinal que voce quer é o que está na linha b !

Veja se conseguiu entender...

Paulo

Link para o comentário
Compartilhar em outros sites

Certo, entendi a estrutura agora ...

Mas como isso é capaz de codificar dados ?

Veja se estou pensando certo ..

Em um programa, uso essa codificação para transmitir meus dados .. Devo usar sequências de 1 e 0 diferentes para cada dado que quero enviar ? E o receptor tem que ser capaz de entender cada uma dessas sequências ?

Por exemplo ali no programa do transmissor que postei .. como ele é capaz de hora enviar ao transmissor o valor 0, hora enviar o valor, 1, hora 2 ... até o 15 ? Seria possível somente escrever esses valores em binário, dar o delay necessário entre cada bit que compõe o número enviá-los assim ?

Link para o comentário
Compartilhar em outros sites

É simples, não se assuste hehehe !

Por exemplo , imagine que voce quer enviar um determinado byte, vamos supor que tem o valor 110 decimal, ok ?

É um byte, portanto composto de 8 bits, correto ?

Esta é a representação binária desses bits : 0110 1110

Basta voce pegar cada um desses bits, e manter ele na saída de acordo com a temporização que voce mesmo determinar !

Depois, envia o outro bit, e assim até o último. voce pode escolher se começa pelo bit mais significativo ou pelo menos significativo, desde que na recepção voce monte da mesma maneira.

Por exemplo, supondo que o período que iremos usar é de 50 milisegundos, temos de manter a saída em nível alto ou baixo por 25 milisegundos, assim o tempo para enviar um byte completo seria de 8 x 50 = 400 milisegundos.

Por causa da característica do Manchester, se o perído escolhido é de 50 milisegundos, voce tem de trabalhar com tempos sempre multiplos de 25 milisegundos, assim voce sempre sabe se tem de manter o nivel em mais 25 milisegundos, ou trocar de nível. Olhe a figura e veja se entende os 25 milisegundos !

Parece difícil, mas não é ! É só uma maneira diferente de transmissão serial de dados....

Paulo

Link para o comentário
Compartilhar em outros sites

Poxa, então é simples mesmo ...

Então por exemplo, tenho quero enviar o valor 23 para meu receptor ...

Uma rotina simples para fazer isso seria assim :

' Número 23 : 0 0 0 1 0 1 1 1

' Zerando variáveis

Bit0 = 0

Bit1 = 0

Bit2 = 0

Bit3 = 0

Bit4 = 0

Bit5 = 0

Bit6 = 0

Bit7 = 0

' 1 Alto -> Baixo

' 0 Baixo -> Alto

Manchester:

Set Bit0

waitms 25

Reset Bit0

waitms 25 ' bit menos significativo enviado

Set Bit1

waitms 25

Reset Bit1

waitms 25

Set Bit2

waitms 25

Reset Bit2

waitms 25

Reset Bit3

waitms 25

Set Bit3

waitms 25

Set Bit4

waitms 25

Reset Bit4

waitms 25

Reset Bit5

waitms 25

Set Bit5

waitms 25

Reset Bit6

waitms 25

Set Bit6

waitms 25

Reset Bit7

waitms 25

Set Bit7

waitms 25 ' bit mais significativo enviado

Return

E no receptor devo fazer um joguinho com os Ifs e delay para entender isso, que é mole ..

Pensei certo ?

Link para o comentário
Compartilhar em outros sites

Não heheheh ....

Não adianta voce ficar setando e resetando os bits .... voce tem de fazer uma rotina que isola os bits um a um, e toda vez que muda o bit isolado em relação ao valor anterior, voce mantem o nível da saída do sinal manchester. Caso o bit seja igual ao anterior, voce inverte o valor da saída..... Entendeu ?

Paulo

Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!