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);
};
Comentar
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!
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
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)