quinta-feira, 24 de outubro de 2013

Decodificadores para displays de 7 segmentos

DECODIFICADOR BCD/Hexa - 7 SEGMENTOS

Em muitos circuitos eletrônicos precisamos de uma interface humana pra rapidamente entendermos os dados que resultam de uma medição, de um ajuste ou comunicação. Um dos meios mais baratos e difundidos é a utilização de displays de leds com 7 segmentos. Com esses displays podemos facilmente apresentar todos os dígitos decimais (0 a 9) e algumas letras do alfabeto. Apesar de existirem displays mais completos, com mais segmentos ou mesmo de matriz de pontos, o de 7 segmentos ainda é o mais usado e de mais fácil utilização. Para isso, geralmente precisamos de um circuito auxiliar que faça a tradução dos dados digitais para que os displays acendam os segmentos corretos e possam assim mostrar o dígito correto.
Esses circuitos são chamados de decodificadores BCD (binary coded decimal - decimal codificado em binário) para 7 segmentos. Para facilitar, esses circuitos são disponíveis em forma de circuitos integrados, sendo exemplos o CD4511 (CMOS) e os da série TTL 7446 7447  7448 (incluindo as variantes LS).
O problema desses cis é que eles só decodificam de 0 a 9 e às vezes queremos decodificar dígitos hexadecimais (acrescentando as letras A b C d E F). Antigamente existia um integrado de código DM9368 que era TTL e que fazia essa decodificação, mas hoje ele se tornou raro (difícil de encontrá-lo) e portanto deve ser caro pra comprar. Eu mesmo tenho umas 3 peças, mas vão virar peças de museu.






Aqui a tabela verdade do 9368, mostrando os dígitos headecimais:

Apesar de que hoje, quase não se usa mais circuitos integrados TTL ou CMOS das séries 74 e 4000/4500, pois praticamente quase tudo é implementado com microcontroladores, FPGA, PAL, etc, de vez em quando ainda precisamos de um decodificador desses.
Pra implementar um decodificador de BCD 7 segmentos, um circuito combinacional um pouco complexo é necessário. São várias portas lógicas interligadas e otimizadas com mapas de Karnaugh (cheguei a fazer vários exercícios de implementação desses decodificadores na escola, inclusive montando de verdade só com portas lógicas). Pra terem idéia, o diagrama de portas do 4511:

O 4511 além de tudo tem latches para manter os dados, mas ainda assim só consegue mostrar de 0 a 9.
Se fosse implementar um decodificador hexadecimal, o circuito seria assim (sem otimização por mapas de Karnaugh):

Esse circuito usa muitas portas com várias entradas, além disso eu coloquei um recurso de poder usar tanto displays de catodo comum como de anodo comum, com as portas XOR (ou exclusivo) nas saídas, de forma a poder selecionar com uma entrada se a lógica seria positiva (catodo comum) ou negativa (anodo comum).
Aqui outro esquema otimizado com os mapas de Karnaugh:

Como não vale a pena usar PAL ou FPGA pra implementar isso, resta a opção de usar microcontroladores para realizar essa "glue logic".  Microcontroladores simples com poucos pinos são muito utilizados para essas funções.
Infelizmente não achei nenhum PIC com a mesma pinagem de alimentação dos decoders comerciais, mas optei por um PIC de 14 pinos, o 16F630 (ou 16F676), que se não serve como substituto direto pino a pino para os decoders, pode simplificar bastante a falta de decoders hexadecimais:

Basta gravar o firmware abaixo, que o PIC se comporta como um decodificador hexadecimal para 7 segmentos, com a vantagem de que as saídas dele podem fornecer até 20mA de corrente para os segmentos de leds. Além disso implementei o recurso de modo de display (catodo comum ou anodo comum) que nenhum decoder comercial tem.

:100000000C288001840AFF3E031D01280728831362
:1000100003138312640008000730990083161F3011
:1000200085008701203084004030831201200F308A
:10003000B9000F300505B800640038083902031D07
:10004000222819283808B900051ABA14051EBA1052
:100050006400BA1C2D282F282E287028192838084B
:100060000F3C031C4D28362087004D2800308A00A5
:1000700038083D3E03188A0A82001F3403342D34A9
:100080002734333436343E3403343F3437343B344E
:100090003E341C342F343C34383438080F3C031CB5
:1000A0006F285820013903198512031D85166F2802
:1000B00000308A0038085F3E03188A0A8200013443
:1000C000003401340134003401340134013401348A
:1000D000013401340034013400340134013419286E
:1000E00038080F3C031C8E28772087008E280030AC
:1000F0008A0038087E3E03188A0A820020343C3485
:10010000123418340C34093401343C3400340834CB
:1001100004340134233410340334073438080F3CDA
:10012000031CB0289920013903198512031D851677
:10013000B02800308A003808A03E03188A0A8200DE
:10014000003401340034003401340034003400340D
:1001500000340034003401340034013400340034FD
:0601600019286300B1281C
:02400E00C43FAD
:00000001FF

A pinagem fica assim:

E a tabela verdade:
Mudando a entrada modo para nível baixo (0), o decodificador funciona com as saídas para displays de anodo comum, e a lógica invertida.

A seguir o firmware versão 16F676, que tem a mesma pinagem do 16F630, só que tem alguns recursos analógicos a mais (conversores A-D).

:100000000C288001840AFF3E031D01280728831362
:1000100003138312640008000730990083161F3011
:100020008500870191012030840040308312012037
:100030000F30B9000F300505B800640038083902E8
:10004000031D23281A283808B900051ABA14051EFA
:10005000BA106400BA1C2E2830282F2871281A28BC
:1000600038080F3C031C4E28372087004E280030EC
:100070008A0038083E3E03188A0A82001F3403347F
:100080002D342734333436343E3403343F3437345C
:100090003B343E341C342F343C34383438080F3C65
:1000A000031C70285920013903198512031D851678
:1000B000702800308A003808603E03188A0A8200DF
:1000C000013400340134013400340134013401348A
:1000D000013401340134003401340034013401347A
:1000E0001A2838080F3C031C8F28782087008F2897
:1000F00000308A0038087F3E03188A0A82002034C4
:100100003C34123418340C34093401343C34003497
:1001100008340434013423341034033407343808E9
:100120000F3C031CB1289A20013903198512031DC5
:100130008516B12800308A003808A13E03188A0AC3
:1001400082000034013400340034013400340034BF
:1001500000340034003400340134003401340034FD
:0801600000341A286300B228E4
:02400E00C43FAD
:00000001FF

quarta-feira, 16 de outubro de 2013

instruções dos PIC 16F

TABELA COM INSTRUÇÕES DOS MICROCONTROLADORES PIC


Download: http://www.filedropper.com/picinstr


Fiz essa planilha faz tempo e resolvi compartilhar no Blog. Ela contem as instruções em linguagem de máquina dos PICs das séries 16F (palavras de 14 bits) e 18F (palavras de 16 bits), com o mnemônico, código binário, operandos e um resumo da operação realizada. Na planilha das instruções 18F dá pra simular e verificar o funcionamento de algumas instruções (lógicas, aritméticas, e de deslocamento), com os resultados nos registradores e bits de flags do status.

Acredito que essa tabela possa ser útil pra aprendizado de programação de PIC, principalmente pra quem gosta de programar em assembly.

Caminhando um pouco para a direita da planilha, podemos ver a tabela de simulação das instruções, onde a entrada de dados nos operandos (registradores e bits de status) deve ser feita nas células com caracteres em vermelho.

Observado que esse recurso só está implementado na planilha de instruções dos 18F, mas algumas instruções funcionam da mesma forma nos 16F.  Como o conjunto de instruções dos PIC é reduzido (RISC) não é muito difícil depois de um tempo decorar e aprender rapidamente o que faz cada instrução.

segunda-feira, 14 de outubro de 2013

Etiquetas para CIs

Etiquetas com pinagem de CIs


Quando vamos fazer um circuito em protoboard usando circuitos integrados sempre precisamos ter a pinagem e funções dos pinos à mão para fazer as conexões corretamente. Isso é especialmente incomodo quando temos vários cis e temos que ficar procurando a pinagem nas datasheets e databooks. Isso torna a montagem demorada e suscetível a erros, basta uma distração e podemos queimar um ci por bobeira.
Como tinha uma caixinha com vários cis TTL (tá certo, ninguém usa mais isso, mas a idéia serve pra qualquer ci), resolvi colar umas etiquetas com as pinagens dos cis em cima deles pra facilitar a identificação dos pinos.  Inicialmente eu apenas colava um pedacinho de etiqueta adesiva e desenhava ou escrevia as funções dos pinos. Mas o papel é pequeno demais e precisa escrever com lápis com ponta fina ou caneta bem fina, senão fica tudo ilegível.
Com tempo pude desenhar no Coreldraw e depois imprimir os desenhos e pinagens dos cis e assim ficar um pouco mais legível (o problema é o tamanho das letrinhas, mas com lente de aumenta ainda vai...).
Vejam as etapas:

Primeiro desenhar e escrever no Corel na escala correta (real), aqui uma amostra dos desenhos:

A seguir fazer a impressão (melhor em papel adesivo) e recortar (dá trabalho) os pequenos "cis" de papel:

A seguir colar os papelzinhos sobre os cis de verdade:


Usando o ci etiquetado na protoboard do meu laboratório:

A idéia serve pra todos os cis com tamanho suficiente pra ter uma etiqueta colada e pode ajudar desenvolvedores e estudantes em laboratório a montar os circuitos com menor chance de erro e maior facilidade.