ENCODER HT6P20

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

ENCODER HT6P20

Mensagempor Andre Rasminio » 19 Abr 2007 18:59

Olá, estou precisando de algumas informações sobre o encoder HT6P20D, alguém já trabalhou com ele?

Preciso decodificar o sinal enviado pelo encoder com um PIC.

Este Encoder, possui 20 bits de endereços e 4 de dados, e também gera um pulso inicial quando inicia a transmissão, e além disso, gera alguns pulsos chamados de anti-code no final da transmissão.

Gostaria de saber se alguém já fez algum firmware com PIC para decodificar este sinal.
Andre Rasminio
Bit
 
Mensagens: 26
Registrado em: 14 Abr 2007 17:30
Localização: Vale da Eletrônica

Mensagempor fabim » 20 Abr 2007 08:11

sim sinhôzim..

Fiz em asm para o 12F629.

O firmware que eu fiz trabalha com clock interno do pic podendo variar entre 3,2 e 4,8mhz.

Ta prontinho ele grava até 40 controles na eeprom e apaga tambem.

Abraços

Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Andre Rasminio » 20 Abr 2007 12:01

legal cara, 40 controles... e como você esta registrando os endereços dos controles, por alguma sequencia especifica?
Andre Rasminio
Bit
 
Mensagens: 26
Registrado em: 14 Abr 2007 17:30
Localização: Vale da Eletrônica

Mensagempor fabim » 20 Abr 2007 13:40

bom.
basicamente o que vc precisa ?

Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Andre Rasminio » 20 Abr 2007 18:06

Preciso decodificar os dados do HT6P20D que são enviados através de um controle remoto, por RF, em 433MHz.

Estou pensando em como irei validar os bits de endereços e de dados que são transmitidos.

Coloquei a saída do receptor em um pino que tem Interrupção por mudança de estado, então, quando o estado da saída do receptor mudar, gera a interrupção e analiso os bits.

Mas como analisar, esta é a questão.
Andre Rasminio
Bit
 
Mensagens: 26
Registrado em: 14 Abr 2007 17:30
Localização: Vale da Eletrônica

Mensagempor fabim » 23 Abr 2007 11:07

bom basicamente eu trabalho da seguinte forma..

Lembrando que os dados ja estão na eeprom.

interrupção RB0..
Int.
Recebeu e são do ht6p20 ?

Sim.

O codigo ocupa 3 bytes.

leio byte um da eeprom casa por casa..
Bateu ?
Leio bayte 2 da eeprom.
Bateu ?
Não
Apartir do endereço do byte 2 que eu tinha comparado..

Até os 3 bytes baterem..

Retorno desta função com 1 flaG OK
E com o byte 3..
Neste byte 3, 3 bits são dos botões pressionados.
executo o que eu ja previ pra cada botão.
Ligo a interrupção e fico em um
NOP
Goto $-1

Abraços

Fabim

Obs.. em qual uC vc esta querendo implementar esse codigo de decodificação ?
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Andre Rasminio » 25 Abr 2007 19:09

Ok, entendi seu algoritmo

Eu to implementando do 16F676, em C.

É isso mesmo que estou fazendo, toda vez gera a interrupção analiso os dados, porém o tempo dos bits podem variar, depende do controle remoto do usuário.

No manual do HT, diz que é 3KHz a fosc, para um R=1.4M, mas se tiver algum controle que não está com este resistor entre os pinos do oscilador, a fosc muda, daí não é mais 3KHz. Então o algoritmo tem que descobrir o tempo de bit do controle, isto que esta dando trabalho. Eu estou medindo o tom piloto que é igual à um tempo de bit, para descobrir antes qual é o tempo de bit, daí analiso os dados de acordo com este tempo.

Se tiver alguma outra sugestão agradeço.
Valeuww
Andre Rasminio
Bit
 
Mensagens: 26
Registrado em: 14 Abr 2007 17:30
Localização: Vale da Eletrônica

Mensagempor Fabio_Jerena » 30 Mai 2007 14:08

Pessoal, ainda estou tentando ler esse encoder mas por enquanto sem sucesso, não sei se eu não entendi direito a carta de tempos dele...
Eu estou fazendo o seguinte, meu PIC 16F628A está trabalhando à 4MHz (período de 1us), quando eu recebo um pulso no pino RB0 (interrupção externa) e configurado para Interrupção Externa por borda de descida eu seto o timer0 para contar até 200 (inicio ele em 55 e com um pré-scaler de 32, contando até 200 ele contará até 6400 que é 80% do tempo que leva entre duas bordas de descida no startbit (24 ciclos para um clock de 3KHz) , então na Interrupção de estouro do timer0 eu seto um flag de ocorrência do startbit, dessa forma quando ocorrer a borda de descida do startbit eu posso iniciar a leitura dos bits pois já sei se o startbit ocorreu ou não.
Para ler os bits logo depois dessa borda de descida zero o timer1 e programo para interromper numa borda de subida, quando ocorrer guardo o valor do timer1 (tempo_low) e zero ele novamente e programo para interromper na borda de descida, quando esta ocorrer leio o valor do timer1 e guardo (tempo_high), comparo esses dois tempos e sei se o bit é 0 ou 1 (se tempo_low maior que tempo_high vale 1 e no inverso vale 0), fazendo isso 28 vezes para ler tb o anti-code que são os últimos 4 bits finais...
Minha dúvida é o seguinte, logo depois do anti-code já se inicia o startbit novamente ou acontece alguma coisa nesse meio tempo (que até agora eu ainda não entendi aquele bendito desenho do datasheet (Transmission Timing), pela carta de tempos eu adotei os ciclos de clock como sendo o período referente à uma freqüência de 3KHz, ou seja, para o número zero são 333 us em low e 666us em high, é isso mesmo?
Eu não tenho oscilosópio para mexer com isso e é um inferno ficar só imaginando as coisas sem poder realmente "ver" o que está acontecendo, alguem sabe algum meio de simular isso no Proteus, eu estou usando ele para conferir meu projeto, mas não tenho muita técnica para debugar e avaliar programas com o próprio Proteus (eu ia tentar usar o Pulso pw (não lembro o nome direitinho) porem devido estilo do gráfico eu não consigo misturar os bits com o startbit devido escala no tempo...)
Obrigado pessoal!!!
Fábio Jerena
Fabio_Jerena
Nibble
 
Mensagens: 52
Registrado em: 08 Mar 2007 08:59

Mensagempor fabim » 30 Mai 2007 14:20

Fabio da uma lida no que vc escreveu.

Ta muito doido essa bagaça. Nada a ver com o que precisa.

Pra começar tem que ser na borda de subida.
Startbit = 1/3 TE.

Depois só pegar a logica de 1 e zero e ir testando e rotacionando os 3 bytes para guardar os dados.

se T = 3 ciclos de clock
Intão 1T = (1/3000) * 3 = +/- 1 ms

Start > 900uS e <1100uS ? Sim
Start OK
1° BIT >>>>>>>>>>>>>>>>>>
intão média base de 1mS.
Conto 1mS 1°T
ainda é Zero ?
sim
conto 1mS 2°T
Ainda é zero?
SIM ( intão lógica binaria igual a 0)
conto 1mS + 100uS é zero ? 3°T
não
codigo errado deveri SER 0 POIS PASSEI DO TEMPO DE UM BIT INTEIRO
Se sim
2° bIT>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mesma logica de cima
só que eu leio 20 + 4 e guardo os 24 bits em 3 bytes
leio mais 4 bits sem guardar......


Abraços

OBS. De uma olhada aqui no forum que eu postei varios fontes em asm para decodificar esse carinha.


Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Fabio_Jerena » 30 Mai 2007 17:03

Fabim, eu já tentei entender os seus programas e não consegui, eu até tenho uma noção de assembly mas não queria simplesmente copiar e nem usar assembly sem dominá-lo (eu podia anexar o seu programa à um programa em C) mas resolvi fazer ele do zero para aprender e praticar C que é meu foco agora, porem estou tendo uma dificuldade danada e vi que vc conseguiu essa tarefa com louvor...
O que é aquele Pilot Period (23 clocks) em 0??? O startbit é só aquele pulso com período de 1/3T depois do pilot period?
O que é TE???
Continuo na dúvida, o que acontece antes do startbit (isso se ele for só aquele pulso) e depois do anti-code, esse sinal só aparece quando se pressiona um botão ou ele está lá a partir do momento que se liga o encoder e só muda os valores dos bits 21, 22, 23 e 24???
Bom, sei que podem encher o saco minhas perguntas mas sozinho tá difícil viu... Muito obrigado!!!
Fábio Jerena
Fabio_Jerena
Nibble
 
Mensagens: 52
Registrado em: 08 Mar 2007 08:59

Mensagempor fabim » 30 Mai 2007 17:30

hehe.. 1 BIT = 3 X T. = TE
Start BIT = 1/3TE..

No momento que vc aperta o botão do controle ele gera o start e manda os 28 bits, no fim dos 28 bits ele fica em low por 23T..start bit 28 bits 23T.

sucessivamente.

OS 23T é simplesmente um espaço sem transmitir entre um codigo e o outro.

Abraços

Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

RESOLVIDO

Mensagempor Andre Rasminio » 30 Mai 2007 18:15

Ok galera, a decodificação foi resolvida. Obrigado a todos.
Andre Rasminio
Bit
 
Mensagens: 26
Registrado em: 14 Abr 2007 17:30
Localização: Vale da Eletrônica

Mensagempor Fabio_Jerena » 30 Mai 2007 21:59

fabim escreveu:hehe.. 1 BIT = 3 X T. = TE
Start BIT = 1/3TE..

No momento que vc aperta o botão do controle ele gera o start e manda os 28 bits, no fim dos 28 bits ele fica em low por 23T..start bit 28 bits 23T.

sucessivamente.

OS 23T é simplesmente um espaço sem transmitir entre um codigo e o outro.

Abraços

Fabim


Cara, então eu acho que a lógica do meu programa está correta (devo estar errando em outras coisas), supondo que ocorra o ultimo bit do anti-code e quando ocorrer a borda de descida do mesmo seto o timer0 para estourar com 6400 us, que é 80% do tempo que se leva da descida do ultimo bit do anti-code até a borda de descida do startbit (como os outros bits levam menor tempo o contador timer0 não estoura até vir o startbit), como a interrupção do timer0 acontece antes da borda de descida do startbit eu já habilito minha rotina para que assim que ocorrer a próxima borda de descida comece a ler os bits...
Se vc analisar só aquele pulso do startbit como vc consegue distingui-lo do bit 1 se não pelo tempo em nível low que antecede o startbit????
Vou matutar mais a respeito, mesmo assim agradeço muito a paciência em querer explicar, valeu mesmo!!!
Fábio Jerena
Fabio_Jerena
Nibble
 
Mensagens: 52
Registrado em: 08 Mar 2007 08:59

Mensagempor fabim » 31 Mai 2007 08:20

cara ta fodfs..

Seguinte.
Na hora que vc apertar o botão do encoder a primeira coisa que acontece é.
O start bit. = 1/3 TE ou 1T que seja. Esse start serve simplesmente para vc saber qual o tempo T dos bits, como havia dito antes cada bit ocupa 3T e um bit é um TE.
Acontecendo o start bit, que não é pra indentificar nada, apesas informa o tempo T do codigo, depois dele vem 28 bits. Acabando de transmitir esses 28bits ele da um death time de 23 bitz. Sabe pra que? Pra vc tomar as decisões como comparar ou gravar os dados no sistema não volatil.
Depois de 23T vem Start bit = 1T e mais 28 bits ou seja 28 TE=3T.

Sabe porque eu não usei o capture simplesmente porque o sistema de PWM dele é ao contratio. ao inves de ele aumentar de 0 para maximo, ele aumenta do máximo para 0.

tendeu esqueça os 23 bits de preambulo nesses 23 bits ele simplesmente não transmite nada é uma zona de silencio.
O start serve para saber o tamanho de T sendo assim cada bit é esse tempo multiplicado por 3. e são 28 bits com esse tempo. depois 23 t mortos .......................................................

Abraços

FAbim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor fabim » 31 Mai 2007 08:22

Andre minhas dicas serviram pra algo ?


FAbim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x