Fala galera,

Estou estudando a geração de sinais VGA colorido usando um Arduino UNO.

Para não ficar me matando tentando ajustar um código pronto (e para fazer o serviço completo), decidi construir o sinal do zero, gerando os sinais de sincronia com a frequência exata.

O primeiro passo foi gerar a maior frequência possível com o Arduino/ATMega328. Até agora consegui 4MHz usando um código tirado dessa discussão (segue abaixo tb): http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1169088394

Funciona! Imagens acima e código abaixo:

/*
PortD - Arduino pins from 0 to 7
Pin 0 = D0
*/

void setup() {

DDRD |= B11000000; // sets pins 7 and 6 as output without changing the value of pins 0 & 1, which are RX & TX
PORTD |= B11000000; // sets pins 7 (hSync) and 6 (vSync) HIGH
};

void loop () {

do {
PORTD = B11000000;
PORTD = B00000000;
} while(1);

};

 

 

Exibições: 2248

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Marcelo Rodrigues em 7 março 2012 às 7:27

Valeu Cesar! É por aí mesmo. Esse teste que você mencionou, eu fiz aqui também.

Para tornar mais rápido, acredito que teria que mexer no ATMega (fusebits, etc). Mas a proposta é permitir que o sinal de vídeo seja gerado pelo Arduino, do jeito que ele vem de fábrica, para qualquer garagista fazer sem dificuldade. Então a velocidade cai bastante mesmo.

A princípio estou gerando sinais de sincronia apenas, já estou quase conseguindo pintar a tela do monitor com qualquer cor. Mas o mais complicado vai ser a formação de desenhos, textos, etc, que estarão limitados pela velocidade do Arduino. Como a velocidade cai, os sinais RGB serão suficientes apenas para gerar desenhos bem quadradões, sem definição (isso já testei aqui, falta ajustar).

Vou postando as novidades para a galera.

Valeu!

Comentário de Cesar Osaka em 7 março 2012 às 2:03

Fala Marcelo!

 

Gostei da ideia do sinal VGA! Até agora só decodifiquei um sinal NTSC, mas nunca gerei nada de sinal de video...

Quanto ao código, não sou nenhum especialista em AVR e muito menos em Arduino, mas me parece que a ideia ali é apenas utilizar os tempos de instrução para gerar o sinal pulsado... ou seja, qualquer que seja a instrução que você coloque ali no meio, vai baixar essa frequência de 4MHz.

Assim podemos deduzir que, como o AVR está rodando a 16MHz, o laço está demorando 4 ciclos de instrução para rodar. Provavelmente, um ciclo para cada atribuição ao PORTD e mais 2 para voltar ao início do laço.

Ou seja, 16MHz / 4 ciclos = 4 MHz.

Para verificar isso, fiz alguns testes:

 

1 - Código exatamente como o que o Marcelo passou: o sinal fica em nível 0 três vezes o tempo em que fica em nível 1.

 

 
2 - Com as instruções invertidas:
 
void loop() {
  do {
    PORTD = B11000000;
    PORTD = B00000000;
  } while (1);
}
 
A situação se inverte, nível 1 três vezes o tempo em que fica em nível 0.
 
 
Isso indica que dois ciclos são tomados pelo retorno do laço, portanto a saída do Arduino mantém o último estado determinado antes do fim do laço.
 
Bom, de qualquer forma, acredito que, com o Arduino rodando a 16MHz, não seria possível nem gerar sinais de vídeo na ordem de MHz..... kHz talvez dê. Qual ordem de frequência seria o objetivo?
 
No que precisar de ajuda nesse estudo do sinal VGA, conte comigo!
 
Abraço!

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço