HCS_PROG_TINY – PROGRAMADOR DE HCS200..301 – C/ PIC 12F629 (REF011)

0

Como usar um PIC 12F629 para programar um HCS200.. 301? Difícil? Como fazer este programador usando também um LCD 16X2 para mostrar as configurações? ” Mas…isto, é impossível , pois necessitamos de 6 pinos mínimos para acionar o LCD” , talvez você diga. Pois não é mais impossível!!! Apresento o HCS_PROG_TINY !!!

Veja o esquema abaixo. Notará, que pelo método ‘Lplex’, que o pino ‘E’ também esta ligado, via resistor de 10k e um capacitor de 100nf ( ao GND) ao pino ‘RS’ do display.
Nota: O método ‘Lplex’ ainda não é suportado nas simulações do Proteus.
O resistor de 470 Ohms em série com um diodo serve para reduzir o tempo da descarga do capacitor, quando “E”=0. Com ajuda de “flags” no programa , uma rotina de delay curta e outra longa , a ideia passou a funcionar a contento.

programador de hcs 200...301 com pic 12f629

Com esta rede RC, forma-se um atraso na tensão do pulso que chega a “RS”. Ou seja: Precisamos que a porta fique =1 por mais tempo se desejamos que RS=1. Portanto, controlando a largura do pulso de “E” determinamos se RS será 1 ou 0. Problema resolvido. Agora com apenas 5 pinos podemos usar um LCD. Viva!!! Ai vem boas idéias !!! Também , neste projeto, estou usando mais uma RC para controlar a alimentação do HCS a programar.
Com respeito ao objetivo do projeto, visa aqui ajudar os hobistas que gostam de PIC a terem também um programador para a família HCS 200 a 301. Este são usados em controle remotos de portão, alarmes e outros ‘chaveirinhos’, usando sistema bem seguro, pois sempre transmite um código diferente a cada acionamento (Encriptação).
Conforme observa-se no circuito, ele possui 4 chaves que são usadas para entrada de dados de configuração antes de programar.
Após ligar a alimentação, deverá aparecer no display “HCS_PROG_TINY” e na segunda linha os seguintes comandos:”0=M 1=A 2=G” que significa:

Aperte ‘CH0’ para ‘Ver/Alterar o modelo do chip a ser programado.

Aperte ‘CH1’ para “ver/Alterar as palavras de configuração (KEY, SYNC, SER, SEED, DISC e CONFIG) e também para optar se ao gravar será usado em ‘DISC’ (discriminador) os 12 bits menos significativos do ‘SERIAL NUMBER’ (SER), visando facilitar a operação de aprendizado do controle (chaveirinho). O valores de cada palavra podem ser alterados apertando ‘CH0’ e ‘CH1’ (desloca a direita) e ao termino podemos ir para a próxima apertando ‘CH2’ ou saindo apertando ‘CH3’.

Digite ‘CH2’ para gravar os dados/modelo no chip colocado no soquete. Se tudo estiver “ok” aparecerá a mensagem “SUCESSO”. Senão, aparecerá a mensagem “FALHA”, que poderá ser ocasionada por esquecer de colocar o chip no soquete, ligar alimentação ou escolher modelo errado (Atenção! ).

Caso prefira gravar chip tipo SMD (pequeninos) , use pequenos fios de telefone para puxar as ligações do “chaveirinho” para um protoboard e dai para o soquete do programador. Não esqueça que as entrada ‘S0’e ‘S1’ do HCS a programar tem que esta aterradas (use um resistor de baixo valor).
Sempre fique atento para gravar a ‘Key’ ou sua chave de encriptação igual a que será usada no receptor na decriptação. Pode ser qualquer valor que desejar em valores hexa e com 8 bytes de comprimento ex.’0123456789ABCDEF’. (Nota: Breve publicarei uma aplicação simples. Fique ligado!)
Note que cada fabricante de automatismo de portão/alarmes tem sua ‘key’ trancada a 7 chaves. Portanto, sem ela, não podemos usar suas placas receptoras. Mas….podemos usar os chaveirinhos com nossa ‘key’,reprogramando-os e fazer nossas placas com nossa ‘key’.
No modelo 201, o valor de ‘DISC’ fica em palavra separada. Nos outros modelos (200,300,301) fica junto com a palavra ‘CONFIG’. Veja os datasheets para maiores informações . Este aparelho foi testado com o modelo 201 (mais problemático) e modelo 200. Os modelos 300 e 301 são bem similares ao 200 ,exceto novas melhorias e funções programáveis adicionais.
O HCS_PROG_TINY deve ser alimentado por uma fonte externa de 9 volts a 12 volts com consumo de alguns miliamperes .
O código assembly foi enxugado ao máximo para ‘caber’ em 1 kb de memória Flash. O resistor de 3K3 no pino 2 (junto a chave ‘0’) foi acrescentado para evitar uma instabilidade, que resultava em interpretar como ligada a chave ‘0’ após uma gravação. Seu valor é crítico, e foi definido por método de tentativa e erro. Também, foi usado a EEprom para alguns dados para visualização no Lcd, para poupar FLASH. Mas…até sobrou algumas linhas.
A cada programação bem sucedida, será incrementado automaticamente o numero da Serial Number (SER). Isto permite programar vários ‘chaveirinhos’ em seguida, sem necessitar alterar as configurações.

Quanto a valores que devem ser setados antes de programar um HCS, deve-se dar atenção especial para o 12º byte ( byte 11 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’ Ampliado). 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’, amplia números possíveis de sincronização sem repetir o código transmitido (até 131072 vezes).

bit11 = OVR1 (‘Over Flow 1’, amplia 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’, amplia números possíveis de sincronização sem repetir o código transmitido (até 131072 vezes).

bit11 = OVR1 (‘over flow 1’, amplia 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.

Segue abaixo o código ASM:
HCS_PROG_TINY_ASM

Segue abaixo o código HEX:
HCS_PROG_TINY_HEX
Segue abaixo a lista de materiais
LISTA DE MATERIAIS

Segue abaixo a lista de materiais:
LISTA DE MATERIAIS

Segue abaixo a placa do circuito:

Segue abaixo a placa com os componentes (lado do cobreado)

Até o próximo artigo!!!

0

5 comments

  1. 0

    Boa noite Claudio, gostaria de saber qual o algoritmo que voce usa para a geração da Crypt Key, pude ver nos datasheet do HCS que a Crypt Key e gerada com o numero serial do transmissor e com o codigo do fabricante. No caso do seu projeto voce esta usando essa chave 0123456789ABCDEF, seria essa a Crypt Key ou o numero que sera usado para o calculo dela?

    1. 0

      Olá Mavomax! Isto mesmo. ‘0123456789ABCDEF’ é a chave de comparação que foi usada neste programa exemplo. Cada fabricante usa uma chave diferente, além da possibilidade dela ser gerado por algoritmos, em especial, de forma industrial, com o objetivo de manter secreta esta chave até para os empregados. Neste caso, muitas empresas usam 2 chaves diferentes, 1 para cada empregado programador, que irá gerar a Key que será usada no microcontrolador. Não sei informar em detalhes sobre esta técnica, mas poderá pesquisar junto a Microchip e a Keelogs.
      Claudio

  2. 0

    Bom dia, Claudio. Estava procurando algumas informaçoes sobre o pic12f629, e chequei ate a sua pagina. Muito interessantes os seus projetos. Parabens pelas suas ideias.

      1. 0

        Olá Claudio, fiz aqui este exemplo para rodar no proteus, mas nao aparece nada no display, vejo os pinos transmitindo os dados ao display mais nada de aparecer, se puder dar uma dica ai fico agradecido, valeu obrigado.

Comments are closed.