Recentemente fiz alguns experimentos para gerar vídeo por software utilizando um processador ARM, no caso um LPC1111/201 da NXP
A primeira dificuldade encontrada foi que no ARM, o tempo de execução da instrução, em ciclos de CLOCK, varia conforme o endereço em que as intruções são executadas, pois a memória FLASH do dispositivo tem uma velocidade máxima de funcionamento menor do que a do processador. Com isso, alguns
Wait States são inseridos e a temporização dentro de um loop também varia.
Uma solução para contornar esse problema foi inserir no código uma diretiva para que o compilador transfira para a RAM e execute a partir de lá a função que gera os
delays para os pulsos de sincronismo.
void delay_loop(int vezes) __attribute__ ((__section__(".data.ramfunc")));
 |
Testando a geração dos sinais de sincronismo |
O sinal de vídeo foi gerado utilizando-se a interface SPI do microcontrolador no modo TI, que é o único modo adequado do LPC1111 para gerar vídeo. Os outros modos inserem pausas entre os caracteres sendo enviados pela porta SPI. Um inconveniente deste modo é que quando a saída não está transmitindo, o pino MOSI fica em tristate.
Para somar o sinal de sincronismo ao sinal de vídeo foi utilizado um circuito simples, com diodos em série com os resistores. Esse arranjo é necessário por causa do estado tristate do sinal MOSI.
1K
Sync o-->|---/\/\/\/\/\----+--------o Video Out
220R | 75R
MOSI o-->|---/\/\/\/\/\----+---/\/\/\/\/\----|GND
O nível de pedestal, é então obtido mantendo-se o pino Sync em nível alto. Para gerar o sinal de sincronismo, coloca-se o pino em nível baixo (o resistor de 75 Ohms puxa a linha para zero).
Pulsos de sincronismo horizontal
 |
Pulsos de sincronismo horizontal |
 |
Sincronismo vertical (serração) |
 |
Final do pulso de sincronismo vertical e serração |
 |
Tela de 32x24. A fonte usada foi extraída da ROM do MSX Hot Bit |
 |
Caracteres em detalhe. Video sem jitter. |
.