HCS_PROG – PROGRAMADOR DE HCS 200/201/300/301 COM AT89S52 (REF010)

Com o aumento de roubos, a indústria de alarme tem prosperado.  Temos também, os controles remotos de portões automáticos.   São   inúmeros  modelos e   a maioria utiliza pequenos controles remotos com o circuito integrado  HCS 200  a 301.  O preço de tais ‘chaveirinhos’ varia de R$10,00 a R$50,00 (depende do ‘luxo’).
Muitas vezes,  precisamos de  um  controle   remoto especifico para nossa aplicação (ex. alarme,painel de fila, portão).    Mas o HCS vem programado com uma  ‘chave’  (KEY)   própria e funciona somente em equipamento da mesma empresa,  com a mesma  ‘chave’.   E se pudéssemos ‘escolher’ a nossa ‘chave’ e reprogramar estes ‘chaveirinhos’ para nossa aplicação?

Com certeza, ficaria bem mais prático. Procurando informações sobre estes circuitos integrados na rede mundial, encontrei vários datasheets e até um modelo de programador usando um pic.     Mas o circuito parece  bem limitado, necessitando reprogramar este PIC cada vez que eu queiramos mudar, por exemplo, o ‘Serial Number’ ou a ‘Key’ . Mas serviu de base para este projeto – HCS_PROG, que usa um     AT89S52 ( com bastante memória de programa (8KB), uma EEprom externa do tipo 24C04 para salvar dados a serem programados, e mais alguns componentes como fontes,diodos, leds, resistores, etc. Veja o esquema abaixo:

Nota-se uma entrada DB9 (serial) para comunicar com um PC via um terminal serial (ex. HyperTerminal). Pode-se por este meio, configurar valores da chave a ser usada (Key 0…4), mudar o numero serial ( “Serial Number”), mudar o valor do numero discriminador (“Disc”), etc.   Sobre a   função de cada um dos dados, leia os datasheets do modelos, que não é muito difícil  de entender o funcionamento.
Ao ligar o HCS_PROG , já conectado ao PC e o terminal ligado a 9600 bauds, 8 bits, s/paridade,normal, deverá aparecer o nome do programador e nas linhas seguintes os comandos:

V= ver dados a serem gravados,
C= alterar dados (key,serial,etc),
G=gravar dados no HCS desejado ,
M= alterar o modelo que se deseja gravar e
A= ajuda.

Sem alterar manualmente o Serial Number, ele será automaticamente incrementado a cada chip programado com sucesso.
Também na função ‘D’ ‘Disc’ após clicar em ‘C’ , aparecerá se deseja fazer o numero de discriminação = aos 12 bits menos significativos da ‘Serial Number’. Penso que em futuros projetos deste blog, Disc=Ser será bem usado, por ser o método mais simples de determinar a aceitação ou não de uma transmissão.
Recapitulando: quando o ‘chaveirinho’ envia uma transmissão, junto vai um número chamado ‘discriminador’ que ,após a decriptação (desembaralhar) dos dados, se o valor de Disc for igual ao valor do Serial Number, basta apenas comparar estes no receptor. Se o valor de Disc no TX for diferente do Serial Number, teremos que salva-lo na memória EEprom da aplicação, ficando difícil usar o método de ‘aprender’ o controle.
Este programador, após ser escolhido os dados para os modelos, pode ser usado sem o PC (Stand Alone). No botão “modelo” podemos escolher de HCS 200 a 301. Também acenderá o respectivo led do modelo .
No botão “programar”, será usado para programar, e no led “sucesso/falha” teremos a seguinte indicação:
1 piscada – gravação bem sucedida
varias piscadas = falha na gravação.

Verifique se está usando modelo certo, se tem chip no soquete, etc.
Se ocorrer algum travamento, deverá ser usado o botão “reset”.
Lembre-se sempre: A chave programada no chip HCS tem que ser a mesma usada na Decriptação na aplicação. Se não , não haverá aceitação ao tentar ‘aprender’ o controle. Logicamente, este projeto visa apenas ajudar hobistas e não deve usado para fins comerciais. O codigo ASM é bem extenso, porque , com tanta memória, fiquei tentado a colocar muitas mensagens e não me preocupei muito com o tamanho das rotinas.   Por ora, temos uma Note Aplication que tem um circuito que pode ser usada para testar o sucesso da programação ou usar esta montagem do próprio blog, chamada de receptor genérico.  Breve teremos outras. Aguarde!

Segue abaixo o código ASM para o AT89s52:

HCS_PROG_ASM2

Segue abaixo o código HEX para o AT89s52:

HCS_PROG2_HEX

Segue os links para os datasheets abaixo:

HCS200 HCS201 HCS300 HCS301

Errata: Corrigido falha que não permitia mudar o Serial Number (os arquivos acima foram corrigidos).
Corrigido falha ao digitar ‘Config’.
Abaixo temos a visualização da tela do PC com o HyperTerminal rodando, ligado o programador.

Abaixo temos uma representação de como devemos inserir os vários valores de configuração, lembrando que o primeiro digito é o mais significativo e o segundo o menos significativo ( o que as vezes, gera confusão). Pode-se usar um “control_tester” para visualização.

Quanto a valores que devem ser setados antes de programar um HCS, deve-se dar atenção especial para o 12º byte ( byte11 de 16 bits), chamado de ‘CONFIGURATION WORD’ ou palavra de configuração. Veja o que é cada bit para cada modelo abaixo:

Modelo HCS 200

bit 0 = discrimination 0 ( o bit ‘LSB’ da palavra de ‘discriminação’ que será comparada com o valor recebido da parte encriptada)

bit1 = discrimination 1

bit2 = discrimination 2

bit3 = discrimination 3

bit4 = discrimination 4

bit5 = discrimination 5

bit6 = discrimination 6

bit7 = discrimination 7

bit8 = discrimination 8

bit9 = discrimination 9

bit10 = discrimination 10

bit11 = discrimination 11 ( o bit ‘MSB’ da palavra de ‘discriminação’ que será comparada com o valor recebido da parte encriptada)

bit12 = Low Voltage Trip Point Select (seleção de voltagem mínima da bateria) se 1= +- 8,5 volts (para baterias de 12 ou 9 v) ; se= 0 +- 4,5 volts(para baterias de 6v) Função:seta o penúltimo bit recebido chamado ‘ Vlow’ da transmissão) indicando que é hora de trocar a bateria).

bit13 = Baud Rate Select (seleção do Baud Rate da transmissão) se=0, teremos períodos de cada bit transmitido de 400us e se=1, teremos períodos de 200us

bit14 = 0 (não usado, resetar)

vit15 = 0 (não usado, resetar)

Modelo HCS201

bit0 = osc0 (sintonia fina do oscilador interno em +- 10% da frequência nominal em 16 níveis possíveis)

bit1 = osc1 (idem)

bit2 = osc2 (idem)

bit3 = osc3 (idem)

bit4 = Vlow (nível de indicação de bateria fraca) Sendo: = 0 , indicará com 4,4 volts; sendo =1 e s3set=0, indicará com 9 volts e sendo=1 e s3set=1,indicará com 6,75 volts. Quando a tensão da bateria for menor que os valores ajustados em ‘Vlow’ e ‘S2set’ irá setar o penúltimo bit da transmissão (Vlow).

bit5 = BRS (Baud Rate Select) Se=0 teremos períodos de cada bit transmitido de 400us e se=1, teremos períodos de 200us.

bit6 = MTX4 (1 ou 4 transmissões sucessivas) Se MTX4=0, uma única transmissão a um toque de botão. Se MTX4 =1 e BRS=1 , teremos 4 transmissões consecutivas e completas a um toque de botão.

bit7 = TXEN (transmite um pulso de ‘start’ antes da transmissão normal) . Se TXEN=0 , sem ‘start pulse’. Se TXEN=1, envia ‘start pulse’.

bit8 = S3SET (Valor de bit s3 na transmissão e nível de tensão da bateria). Se S3SET= 0 , S3 será espelho de S2 e se S3SET=1 , S3 será sempre ‘1’ e habilitará outro nível de tensão para aviso de bateria fraca.

bit9 = XSER (‘Serial Number’ estendido). Se XSER=0 , serão transmitidos 28 bits de ‘Serial Number’ mais os 4 botões. Se XSER=1, será transmitidos todos os 32 bits do ‘Serial Number’ sem os botões. (Atenção com este bit, ao programar).

bit10 a 15 = 0 ( não usados, resetar).

Modelo HCS300

bit 0 = discrimination 0 ( o bit ‘LSB’ da palavra de ‘discriminação’ que será comparada com o valor recebido da parte encriptada)

bit1 = discrimination 1

bit2 = discrimination 2

bit3 = discrimination 3

bit4 = discrimination 4

bit5 = discrimination 5

bit6 = discrimination 6

bit7 = discrimination 7

bit8 = discrimination 8

bit9 = discrimination 9

bit10 = OVR0 (‘over flow 0’, aumenta números possíveis de sincronização sem repetir o código transmitido (até 131072 vezes).

bit11 = OVR1 (‘over flow 1’, aumenta números possíveis de sincronização sem repetir o código transmitido (até 198608 vezes).

bit12 = Low Voltage Trip Point select (seleção de voltagem mínima da bateria) se 1= +- 8,5 volts (para baterias de 12 ou 9 v) ; se= 0 +- 4,5 volts(para baterias de 6v) Função:seta o penúltimo bit recebido chamado ‘ Vlow’ da transmissão) indicando que é hora de trocar a bateria).

bit13 = BSL0 (seleção do Baud Rate da transmissão) com BSL1=0 e BSL0=0, teremos períodos de cada bit transmitido de 400us e se BSL=1, teremos períodos de 200us

bit14 = BSL1 (seleção do Baud Rate da transmissão) se=1, teremos períodos de cada bit transmitido de 100us (independente do valor de BSL0) e se BSL1=0 , dependerá somente de BSL0)

vit15 = 0 (não usado, resetar)

Obs. O bit mais significativo do ‘Serial Number’ bit31 se for setado (=1) irá habilitar um timer de 25 segundos que desliga a transmissão, mesmo se a pessoa mantém os botões acionados. Se =0 , ficará desabilitado.
O último bit recebido em uma transmissão, será o RPT. Este indicará se = 0 , que é a primeira transmissão, e se=1 , botão apertado e recebendo novas transmissões sucessivas e repetidas.

Modelo HCS301

bit 0 = discrimination 0 ( o bit ‘LSB’ da palavra de ‘discriminação’ que será comparada com o valor recebido da parte encriptada)

bit1 = discrimination 1

bit2 = discrimination 2

bit3 = discrimination 3

bit4 = discrimination 4

bit5 = discrimination 5

bit6 = discrimination 6

bit7 = discrimination 7

bit8 = discrimination 8

bit9 = discrimination 9

bit10 = OVR0 (‘over flow 0’, aumenta números possíveis de sincronização sem repetir o código transmitido (até 131072 vezes).

bit11 = OVR1 (‘over flow 1’, aumenta números possíveis de sincronização sem repetir o código transmitido (até 198608 vezes).

bit12 = Low Voltage Trip Point Select (seleção de voltagem mínima da bateria) se 1= +- 8,5 volts (para baterias de 12 ou 9 v) ; se= 0 +- 4,5 volts(para baterias de 6v) Função:seta o penúltimo bit recebido chamado ‘ Vlow’ da transmissão) indicando que é hora de trocar a bateria).

bit13 = BSL0 (seleção do Baud Rate da transmissão) com BSL1=0 e BSL0=0, teremos períodos de cada bit transmitido de 400us e se BSL=1, teremos períodos de 200us

bit14 = BSL1 (seleção do Baud Rate da transmissão) se=1, teremos períodos de cada bit transmitido de 100us (independente do valor de BSL0) e se BSL1=0 , dependerá somente de BSL0)

vit15 = 0 (não usado, resetar)

Obs. O bit mais significativo do ‘Serial Number’ bit31 se for setado (=1) irá habilitar um timer de 25 segundos que desliga a transmissão, mesmo se a pessoa mantém os botões acionados. Se =0 , ficará desabilitado.
O último bit recebido em uma transmissão, será o RPT. Este indicará se = 0 , que é a primeira transmissão, e se=1 , botão apertado e recebendo novas transmissões sucessivas e repetidas.

Curiosidades:
Como se mede a temperatura do planeta Terra?
A arte e a ciência da previsão do tempo
Seu filho está com febre?
Cuidado com os alimentos!
Robert Boyle

Outros assuntos:
Desempenhem bem seu papel de pais
Como lidar com sogros
Como lidar com dívidas
Como parar de discutir com seu cônjuge
Como sobreviver ao primeiro ano de casamento

Até o próximo artigo!

7 comments on “HCS_PROG – PROGRAMADOR DE HCS 200/201/300/301 COM AT89S52 (REF010)

  1. Olá gostaria de saber se consigo clonar um controle da marca pecinnin pois ele usa um hcs201. Ou seja. Pegar um ja programado e clonar e nao precisar de programar de novo no receptor

    1. Olá Nrchaves!
      Os circuitos integrados da familia ‘hcs’ são projetados com o sistema ‘ hopping code’ ou ‘código esperado’. A cada transmissão é calculado um novo valor a transmitir e o sistema receptor ‘espera’ receber este valor. É baseado em criptografia e não pode ser clonado, uma vez que necessita de uma ‘key'(sequencia de números para embaralhar) e o ‘serial number'(número do tx de fabrica) para gerar o novo código a transmitir. Só é possivel clonar ‘hcs’ quando são usados em modo não criptografado,usando apenas seu ‘serial number’, que não é o caso da placa ‘pecinnin’.
      Claudio

  2. Claudio tudo bom.quando eu conecto o programador no terminal do pc,ele escreve o nome do programador,e as
    teclas de comando,: V= ver dados a serem gravados, C= alterar dados, G=gravar dados no HCS desejado, M= alterar o modelo que se deseja gravar e A= ajuda.
    até ai tudo bem,mas quando vou configuar,eu digito as teclas,v,c,g,m,a, não responde aos comandos.
    Eu não consigo configurar o programador.
    exemplo;digito a tecla = C , não tenho resposta.

    1. Prezado Sandro

      Pelo que posso perceber, o programador está comunicando com o Pc mas o Pc não está comunicando. Certifique que o sinal chega ao pino 10 do at892051. Use um osciloscópio, ou senão dispor, use o metodo ‘caseiro’ de colocar um fone de cristal para ouvir o sinal na hora que voce teclar os comandos.Eu uso um de campainha de telefone em serie com resistor de 1k. Siga o sinal do pino 10 até a db9 pino 3. Geralmente, é comum se enganar com a polaridade dos diodos d1 e d2. Cheque as ligações e a montagem do transistor q2, que podem estar trocados o emissor pelo coletor, na hora de soldar na placa. Eu montei o circuito no protoboard e não tive este problema.Verifique o cabo db9, se não está interrompido o fio do pino 3 de um lado ao outro. Faça esta checagem, depois me da um retorno.

  3. Olá Cladio,montei o hcs prog aparece o nome do programador e os comandos,mas as teclas que pede
    p/ configurar os comandos não obedece.
    Já chequei tudo, o terminal esta ligado a 9600 bauds,8 bits, s/paridade,normal,o circuito esta
    fazendo todos os comandos.
    A onde esta o erro,vc pode me ajudar!
    Fico muito agradecido.

    1. Oi Sandro
      Não entendi bem. Voce diz que está ‘fazendo todos os comandos’ e ‘para configurar não obedece’!
      Por favor, descreva ‘com mais palavras’, o que está acontecendo quando voce faz determinado comando, para ter uma idéia melhor do problema. Enquanto espero sua resposta, vou pegar o esquema e o codigo hex do site e remontar para ver se não tem ‘gato no telhado’. Claudio

      1. Prezado Sandro
        Realizando os testes, verifiquei que o pino de alimentação no esquema postado anteriormente estava com sendo ‘4’ e na realidade tem que ser ‘8’ (veja datasheets). Por favor, verifique isto no seu circuito, corrija se necessário e me de um retorno. Quanto ao codigo hex e asm, não encontrei nada de errado que pudesse dar algum problema. Claudio

Comments are closed.

Back To Top