sexta-feira, 16 de dezembro de 2016

Display fluorescente acionado com o PT6312B.

        Sempre fui fascinado por displays de todas as tecnologias, especialmente os fluorescentes e mais recentemente os OLEDs.
        Este é um projeto meio antigo de um relógio com display fluorescente baseado no IC da Princeton PT6312B. Esta fabricante tem vários drivers para displays fluorescentes, LED e LCD.


PT6312B em seu tosco adaptador para DIP. Este IC veio de um aparelho de som que encontrei na rua jogado fora.
Fiação para ligar o display. Este é fabricado pela Samsung e veio de um video-cassete estragado.
Placa com o PT6312B e um PIC16F616. O transformador tem duas saídas, uma alimenta a lógica e o conversor/inversor de -12V (usa o PWM do PIC) e a outra aciona os filamentos do display através de uma fonte de corrente constante (LM317 com o dissipador). .
Detalhe da placa. O indutor do conversor/inversor de -12V fica no lado de baixo.

Todos os segmentos acesos.

Mostrando a hora.
Mostrando a hora de outro ângulo.

Inicialização do PT3612:
        Estes parâmetros na inicialização são para este display, eles podem variar para outros displays, portanto use por conta e risco.

1
DISPLAY MODE SETTING COMMAND (0, 0, 0, 0, 0, G2, G1, G0)
0x03 ;muda configuração do acionemento do display para 7 GRIDS e 15 SEGMENTS

G2 G1 G0
0  0  0   4 GRIDS, 16 SEGMENTS
0  0  1   5 GRIDS, 16 SEGMENTS
0  1  0   6 GRIDS, 16 SEGMENTS
0  1  1   7 GRIDS, 15 SEGMENTS
1  0  0   8 GRIDS, 14 SEGMENTS
1  0  1   9 GRIDS, 13 SEGMENTS
1  1  0  10 GRIDS, 12 SEGMENTS
1  1  1  11 GRIDS, 11 SEGMENTS

2
DATA SETTING COMMAND (0, 1, 0, 0, M, A, S1, S0)
0x40 ;NORMAL MODE, INCREMENT ADDRESS e WRITE DATA TO DISPLAY

M: 0= NORMAL MODE; 1=TEST MODE
A: 0=INCREMENT ADDRESS; 1=FIX ADDRESS 
S1 S0
0  0  WRITE DATA TO DISPLAY
0  1  WRITE DATA TO LED PORT
1  0  READ KEY DATA
1  1  READ SWITCH DATA

3
Apaga os 22 bytes DISPLAY DATA

4
DISPLAY MODE SETTING COMMAND
0x03 ;de novo com o mesmo valor

5
DISPLAY CONTROL COMMAND (1, 0, 0, 0, L, P2, P1, P0)
0x8A ;DISPLAY ON e 10/16 DUTY CYCLE

L: 0=DISPLAY OFF; 1=DISPLAY ON
P2 P1 P0
0  0  0   1/16 DUTY CYCLE
0  0  1   2/16 DUTY CYCLE
0  1  0   4/16 DUTY CYCLE
0  1  1  10/16 DUTY CYCLE
1  0  0  11/16 DUTY CYCLE
1  0  1  12/16 DUTY CYCLE
1  1  0  13/16 DUTY CYCLE
1  1  1  14/16 DUTY CYCLE









Display OLED amarelo com o controlador SSD1322.

        Dando sequencia ao post de displays OLED, testei um baseado no controlador Solomon Systech SSD1322, amarelo, com 16 niveis de intensidade em cada pixel, resolução de 256x64 pixels e interface SPI.
        Este display também tem a mesma pinagem do baseado no SSD1306, portanto pude usar a mesma placa com o MSP430G2452 sem alterações. Ao contrário do SSD1306 cujos pixels estão ou acesos ou apagados, o SSD1322 possui 16 níveis de intensidade, tem a resolução de 480x128 pixels mas neste display usa 256x64.
        Já usei diversos displays nos meus projetos, mas este foi o mais difícil de usar por causa da sua maneira peculiar de enviar os dados. Nos display monocromáticos, cada bit é um pixel e no colorido, cada byte é um pixel desde que seja usado o modo de 8 bit de cores, mas neste, só ativa os pixels após o envio de 2 bytes, em uma linha horizontal de 4 pixels independentemente do modo de incremento seja horizontal ou vertical. Cada pixel usa metade do byte (4 bits), ou seja, envio 2 bytes e ativa 4 pixels na horizontal, tente desenhar um caractere assim!
        Decidi usar uma fonte de 32x16 pixels (haja memória!), pois já a uso em outras aplicações e para ter um display com 2 linhas de 16 caracteres, formando assim um display 16x2 bem mais bonito.

Vista frontal do display.

Vista inferior. Note que este usa um regulador step-up para acionar os pixels e o SSD1322 fica na "fita" e não no vidro como nos outros. Note que também substituí os dois reguladores de tensão por um resistor de 0R.

Display em ação com fonte 32x16 mostrando diferentes níveis de brilho. Abaixo dele está placa com o MSP430G2452.


Inicialização do SSD1322:
        Esta é a sequência de inicialização que usei para este display, os parâmetros podem variar portanto use por conta e risco.
        Note que no SSD1322, os parâmetros dos comandos são enviados como dados, não como comandos como no SSD1306 e SSD1331.

1
Aplica-se um pulso de RESET por no mínimo 3µs.

2
Command lock
Envia comando 0xFD, Command lock/unlock
Envia Dado 0x12, Unlock OLED MCU interface from entering command

3
Sleep mode
Envia comando 0xAE, Set sleep mode ON (Display OFF)

4
Display clock divider/oscillator frequency
Envia comando 0xB3, Set Display Clock Divide Ratio/Oscillator Frequency
Envia dado 0x91, Oscillator frequency = 0x09, Clock Divider = divide by 2

5
MUX ratio
Envia comando 0xCA, Set multiplex ratio
Envia dado 0x3F, MUX ratio = 64

6
Display vertical offset
Envia comando 0xA2, Set display vertical offset
Envia dado 0x00, Vertical scroll by COM = 0

7
Display start line
Envia comando 0xA1, Set display start line
Envia dado 0x00, Display Start Line = 0

8
Remap & dual COM line mode
Envia comando 0xA0, Set Remap & Color Depth
Envia dado 0x14, COM Split disabled, Scan=COM(n-1)~COM0, Nibble remap enabled, Column remap disabled, Vertical address increment
Envia dado 0x11 ,Dual COM line mode enabled

9
GPIO
Envia comando 0xB5, Set GPIO
Envia dado 0x00, GPIO1 disabled, GPIO0 disabled

10
VP Supply
Envia comando 0xAB, Select VCC
Envia dado 0x00, External VDD selected

11
Display enhancement A
Envia comando 0xB4, Set display enhancement A
Envia dado 0xA0, External VSL enabled
Envia dado 0xFD, Enhanced low GS display quality

12
Contrast current
Envia comando 0xC1, Set contrast current
Envia dado 0x8C, ISEG current=140

13
Contrast current
Envia comando 0xC7, Set master contrast current control
Envia dado 0x0F, Output currents for all colors = 16/16

14
Gray Scale Table
Envia comando 0xB9, Set default linear gray scale table

15
Phase 1 & 2 period adjustment
Envia comando 0xB1, Set Phase 1 & 2 period adjustment
Envia dado 0xE2, Phase2 = 14DCLKs, Phase1 = 5DCLKs

16
Display enhancement B (VSL & Gray Scale Display Quality)
Envia comando 0xD1, Set display enhancement B
Envia dado 0x82, Normal
Envia dado 0x20, Não está claro na documentação porque tem que enviar este byte

17
Pre-charge voltage
Envia comando 0xBB, Set pre-charge voltage
Envia dado 0x1F ;Pre-charge voltage = 0.60*VCC

18
Second Pre-charge period
Envia comando 0xB6, Set Second Pre-charge period
Envia dado 0x08 ;2nd Pre-charge period = 8DCLKS

19
VCOMH
Envia comando 0xBE, Set VCOMH
Envia dado 0x07, Deselect voltage level = 0.86*VCC

20
Display
Envia comando 0xA6, Set display mode to normal display

21
Partial display
Envia comando 0xA9, Exit partial display mode

22
Apaga o conteúdo da memória do display
Envia comando 0x15, Set column address
Envia dado 0x00, Column address start = 0
Envia dado 0x77, Column address end = 119
Envia comando 0x75, Set row address
Envia dado 0x00, Row address start = 0
Envia dado 0x7F, Row address end = 127
Envia comando 0x5C, RAM memory write
Envia dados: 30720 bytes com valor 0x00

23
Sleep mode
Envia comando 0xAF, Set sleep mode OFF (Display ON), display pronto para ser usado.

Falta ainda descobrir por que o display apaga quando o sinal CS vai para nível baixo, isso faz o display piscar em cada atualização.


quinta-feira, 15 de dezembro de 2016

Medidor de corrente e tensão com INA219, versão MSP430G2230

        O primeiro medidor de corrente e tensão com INA219 que fiz (de fato o primeiro IC específico para esta função que testei) não funcionou satisfatoriamente pois a montagem foi feita em placas separadas e sem os devidos cuidados em relação ao caminho dos sinais analógicos, algo crítico para este IC. Assim fiz esta placa com tudo integrado, e agora que tenho mais experiência com os microcontroladores  MSP430, usei o MSP430G2230, o menor da família. Para o display, usei aquele OLED um pouco maior que os adaptadores SOIC-DIL usados neste medidor. Também disponibilizei um header de três pinos para selecionar a alimentação que pode ser externa (bateria de Li-ION) ou vinda do barramento a ser medido, isso resolve o problema de medir tensões abaixo de 3V e de medição onde o consumo de energia da própria placa pode interferir no resultado. O regulador de tensão, usei o LM2936MP-3.3, com uma corrente quiescente extremamente baixa, suporta 40V na entrada e aguenta ser ligado com a tensão de entrada invertida. Os bornes continuam os mesmos das outras placas de medição.

Placa com os ICs removidos. Há um header de três pinos para selecionar a alimentação que pode ser externa ou vinda do barramento a ser medido.
Vista inferior. Note o resistor shunt de 200mR, 10 a 20 vezes maior que costumo usar pois este medidor é para correntes de até 3A e tensões até 24V. Note também o diâmetro dos fios no caminho da corrente a ser medida para minimizar perdas. Usei mais componentes de filtragem como os dois capacitores de tântalo bem como o indutor SMD para filtrar a entrada de alimentação.
Medidor em ação sendo alimentado por uma bateria externa e medindo 0V. Note que agora o offset é bem menor e estável, dentro da tolerância do INA219. De cima para baixo: tensão no shunt em dezenas de microvolts (o ponto decimal está errado), tensão do barramento, potência, corrente no barramento.
Medidor em ação sendo alimentado pelo barramento com uma carga (a alimentação da placa vem do borne de entrada, assim não está afetando a medição nesta caso). Se você já jogou no ATARI2600, vai achar o estilo dos caracteres familiar pois usei a mesma fonte usado na maioria de seus jogos.










quarta-feira, 7 de dezembro de 2016

Display OLED colorido com o controlador SSD1331.

        Finalmente chegou mais um lote de displays OLED que havia pedido. Dentre eles está um colorido de resolução 96x64 pixels com controlador Solomon Systech SSD1331 e interface SPI.
        Este display tem a mesma pinagem do baseado no SSD1306, portanto pude usar a mesma placa com o MSP430G2452 sem alterações. Ao contrário do SSD1306, cujos pixels estão ou acesos ou apagados, o SSD1331 possui 3 sub-pixels retangulares (vermelho, verde e azul), modulados em 64 ou 32 níveis de intensidade. Por padrão, ele usa 16 bits de cor (5bits para o vermelho, 6 bits para o verde e 5bits para o azul ou R4~R0, G5~G0 e B4~B0) devendo ser transmitidos 2 bytes para acionar cada pixel. Como na minha aplicação não precisa uma fidelidade de cor tão precisa, optei por usar o formato 8 bits, ou seja, será enviado um byte por pixel no formato [Red2, Red1, Red0, Green2, Green1, Green0, Blue1, Blue0]. Considerando a resolução, usei uma fonte de 16x12, tendo assim 4 linhas de 8 caracteres, formando assim um display 8x4.

Display com o SSD1331 (esquerda) ao lado do monocromático com o SSD1306. Note que ambos tem a mesma pinagem.

Vista inferior. Assim como nos outros dislays, retirei o regulador de 3,3V (U2), contornando-o com um resistor de 0R. Note que o display colorido usa um regulador step-up externo e o outro usa o charge-pump interno.
Display em ação com um firmware de teste na placa com o MSP430G2452.

Inicialização do SSD1331:
       Esta é a sequência de inicialização que usei para este display, os parâmetros podem variar portanto use por conta e risco.



1
Aplica-se um pulso de RESET por no mínimo 3µs.

2
Command lock
Comando 0xFD ;Comando para travar/destravar envio de comandos.
0x12 ;para destravar o envio de comandos

3
Display
Comando 0xAE ;Display desligado (modo sleep)

4
Remapeamento & número de bits por cor
Comando 0xA0 ;Comando para ajustar o rempeamento e definir o número de bits por cor
0x23 ;8bit/pixel, COM split enabled, Scan COM0~COM(n-1), Left-right swapping disabled, RGB order, RAM column map inverted, Vertical address increment

5
Display start line
Comando 0xA1 ;Define start line
0x00 ;start line=0

6
Display vertical offset
Comando 0xA2 ;Define vertical offset
0x00 ;vertical offset=0

7
Modo do Display
Comando 0xA4 ;Display ajustado para modo normal

8
Multiplex ratio
Comando 0xA8 ;Define multiplex ratio
0x3F ;1/64 duty

9
VP Supply
Comando 0xAD ;Seleciona VCC
0x8E ;Seleciona VCC externo, usa o regulador step-up do módulo.

10
Modo Power save
Comando 0xB0 ;Define modo power save
0x0B ;Modo Power save desabilitado

11
Ajuste do período da fase 1 & 2
Comando 0xB1 ;Set phase 1 & 2 period adjustment
0x31 ;Fase 2 = 3DCLK, Fase 1= 1DCLK

12
Divisor do Clock e frequencia do oscilador
Comando 0xB3 ;Define divisor do Clock e frequência do oscilador
0xF0 ;Fosc = ~890kHz, divisão = 1

13
Second Pre-charge
Comando 0x8A ;Define Second Pre-charge para vermelho
0x64
Comando 0x8B ;Define Second Pre-charge para verde
0x78
Comando 0x8C ;Define Second Pre-charge para azul
0x64

14
Nivel Pre-charge
Comando 0xBB ;Define nível pre-charge
0x3A ;pre-charge=0.475xVCC

15
VCOMH
Comando 0xBE ;Set VCOMH
0x3E ;VCOMH=0.83Vref

16
Master current control
Comando 0x87 ;Define master current
0x06 ;Master current=9/16 (160uA)

17
Contraste
Comando 0x81 ;Contraste cor 'A'
0x91
Comando 0x82 ;Contraste cor 'B'
0x50
Comando 0x83 ;Contraste cor 'C'
0x7D

18
Coluna
Comando 0x15 ;Define coluna inicial e final
0x00 ;coluna inicial = 0
0x5F ;coluna final = 95

19
Linha
Comando 0x75 ;Define linha inicial e final
0x00 ;coluna inicial = 0
0x3F ;coluna final = 63

20
Limpa a RAM
Envia 6144 bytes de valor 0x00 para limpar a memória do display

21
Display
Comando 0xAC ;Display ON, display pronto para o uso.






















Coleção de processadores antigos.


Minha coleção de processadores antigos, primeira parte:

Vários Intel 486, um Intel 387 (coprocessador aritmético ao lado de um concorrente da ULSI).

AMD Am5x86 (um 486 que operava a 133MHz, tinha 16KB de cache write-back e foi a alegria de muitos que tinha uma placa socket-3 e pouco dinheiro) e AMD 486 com 8 KB de cache write-back.
486s da Cyrix e um "686" (concorrente do clássico Intel Pentium com alguns méritos e algumas incompatibilidades). A Cyrix não possuía fábrica própria, apenas fazia o projeto do processador. assim outras empresas fabricavam o processador como a IBM, ST Microeletronics e Texas Instruments. Montei mutos computadores com estes processadores, principalmente com o "verdinho" que tinha um custo/benefício imbatível.

Raridades: um Intel Overdrive (486 com regulador de tensão integrado para placas que só dispunham de 5V), um Cyrix 486DLC para placas de 386 fabricado pela Texas Instruments (este dispunha de cache L1 e o Intel 386 não, além de operar a 40MHz), e um raríssimo Winchip C6 da IDT (único concorrente do Pentium clássico 100% compatível).

Detalhe do regulador linear de tensão do Intel Overdrive, uma profissional gambiarra.


K6 e K6-2 da AMD. Aqui tem um raro modelo, o K6-2+, primeiro processador a incorporar o cache L2 no chip de silício (este vinha com 128kB).

Não é obviamente um processador, mas esta SoundBlaster AWE64 Gold me deu muitas alegrias. Poder ouvir MIDIs com o sintetizador e banco de instrumentos dela era revolucionário na época. A qualidade do hardware era muito acima da média.