terça-feira, maio 31, 2016

Geração de Vídeo com Microcontrolador AVR - Parte 4

Neste post e nos próximos vou falar um pouco sobre o Craft - um demo impressionante do que pode ser feito com um AVR. Aqui vou falar sobre a parte mais simples, o hardware.



O esquema do hardware do Craft e uma explicação básica do funcionamento estão aqui. Não tive muita dificuldade em montá-lo, e funcionou perfeitamente com o firmware original (no mesmo link). Vou repassar o básico aqui e fazer uns poucos comentários adicionais.

O Padrão VGA

A maioria dos leitores do blog provavelmente nunca conheceu nada inferior da VGA. Talvez só conheçam HDMI...

No lançamento do PC IBM (em 1981) a opção de cores era a CGA (Color Graphics Adapter). A conexão com o monitor era bastante simples: sinais digitais R, G, B e I (vermelhor, verde, azul e intensidade) mais os sinais de sincronismo horizontal e vertical. Desta forma se obtinham 16 cores; limitações de memória e arquitetura faziam com qua apenas um subconjunto limitado disto estivesse disponível no modo gráfico.

A EGA (Enhanced Graphics Adapter) expandiu isto disponibilizando um sinal de intensidade separado para cada cor. Ou seja, usava dois bits para cada cor, possibilitando 64 cores distintas. Os modos gráficos mais sofisticados permitiam 16 cores simultâneas, com as cores definidas por uma paleta (uma memória que mapeava cada uma das 16 cores "lógicas" em um destas 64 cores).

A VGA (Video Graphics Array) substituiu os sinais de cores digitais por sinais analógicos, potencialmente permitindo um número infinito de cores do lado do monitor. A VGA usava uma paleta com 256 posições, cada uma com 18 bits. Um DAC (conversor digital analógico) convertia os 6 bits de cada componente no respectivo sinal analógico.

Do ponto de vista de sincronismo, a VGA suportava alguns padrões (daí os monitores serem chamados de multi-sinc). O padrão principal é o correspondente a uma resolução de 640x480 pontos e utiliza uma frequência horizontal de pouco menos de 31.5KHz e uma frequência vertical de 60Hz.

O conector padrão para a placa é o DE-15 fêmea, com 15 pinos. Este conector prevê terra (ou retorno) separado para os vários sinais, mas a minha montagem funcionou corretamente ligando o terra apenas nos pinos 5 e 10. Os sinais de vídeo estão nos pinos 1, 2 e 3. Os pinos 13 e 14 correspondem aos sinais de sincronismo horizontal e vertical (respectivamente).

O Circuito do Craft

O Craft parte de uma montagem típica com um microcontrolador ATmega. O pino 1 é o Reset, que vai para o conector de programação (eu coloquei também um pullup de 10K). Um cristal de 20 MHz está conectado aos pinos 9, 10. Em cada extremidade do cristal vai um capacitor de 22pF para terra. A alimentação (5V) vai no pino 7. Os pinos 8 e 22 vão para terra.Os pino 18, 19 e 20 (MOSI, MISO e SCK vão para o conector de programação).

O microcontrolador utilizado é um ATmega88, desconfio que poder ser usado um ATmega328 no lugar, mas não investiguei. Atualização: O endereço dos vetores de interrupção é diferente entre os dois. No ATmega88 cada vetor contém um byte com o deslocamento para a rotina, no ATmega328 tem dois bytes com o endereço absoluto. Fonte: http://www.avrfreaks.net/forum/porting-atmega88-code-atmega328.

Os pinos 3, 4, 6, 11, 12 e 13 são usados para a geração de som. Um DAC de 6 bits é construído com resistores, a chamada escada R-2R. O firmware gerará o som escrevendo valores apropriados no port D de entrada e saída digital. Na minha montagem, retirei o capacitor de 10uF e liguei a saída do DAC à base de um transistor S8050, através de um potenciômetro de 10K.  O emissor do transmissor foi ligado em terra e o coletor a um alto falante. O outro terminal do alto falante foi ligado ao +5. Com isto obtive um amplificador simples com um controle de volume.

No lado do vídeo, temos um DAC de 2 bits (novamente uma escada R-2R) para cada componente: pinos 28 e 27 para R, pinos 26 e 25 para G e pinos 24 e 23 para B. Com isto os pixels podem ser escritos usando o port D de entrada e saída digital.

Além disso, as três componentes podem ser ativadas simultaneamente (gerando um branco ou tom de cinza) através de um transistor PNP (um 2N2904 na minha montagem). O emissor deste transistor é ativado pela saída OC2B (pino 5), através de um trimpot. A base está conectada ao sinal MOSI, através de um resistor de 1K. O coletor está ligado aos sinais R, G e B através de diodos. O resultado é que os sinais R, G e B serão colocados em nível alto somente quando OC2B e MOSI estiverem altos; o nível é definido pelo trimpot. Caberá ao firmware programar o Timer2 para ativar OC2B durante os momentos corretos e usar a interface SPI para shiftar os pixel pelo pino MOSI. O uso da interface SPI pemite gerar rapidamente oito pixels independente do processador.

Finalmente, os sinais de HSync e VSync são gerados pelos pinos 16 (OC1B) e 15 (PB1).

Como eu queria fazer uma montagem bem autônoma, a alimentação foi feita a partir de uma bateria de 9V, usando um 7805 como regulador. A montagem original do Craft é semelhante, parece que ele usou um 78L05.

Como de costume a minha montagem foi feita em uma placa padrão. Uma caixa Patola acomodou com folga o circuito e uma tampa transparente permite observar que temos apenas um ATmega. A minha montagem ainda precisa de um acréscimo fundamental: um LED de ligado. Afinal, onde já se viu um circuito com microcontrolador que não tenha pelo menos um LED?


Nenhum comentário: