Estou fazendo um projeto por hobby de um video game tipo atari, e para isso estou utilizando o microcontrolador PIC16F877A.
Sei que não é o mais recomendado, mas como disse, é só hobby.
Fiz um firmware que gera o sincronismo HSYNC e VSYNC, o monitor reconhece quando o conecto em minha placa, porém quando ativo as saídas RGB não é gerada nenhuma cor no monitor.
A tensão nos pinos RGB estão em 0,7vcc, os de sincronismo 5vcc.
Alguém pode me dar uma dica sobre a razão de não conseguir "pintar" a tela?
Desde já, obrigado
cpp code
/////////////////////////////////////////////////////////////////////////
// DEFINIÇÕES DO MICROCONTROLADOR //
#include<16f877A.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT // Configura FUSES
#use delay(clock=20000000) // Configura oscilador interno em 20Mhz
//***********************************************************************//
// Definição da Pinagem
//***********************************************************************//
#define HSYNC PIN_D0
#define VSYNC PIN_D1
#define LED PIN_A0
#define cor_1_0 output_low(PIN_C1)
#define cor_1_1 output_high(PIN_C1)
#define cor_2_0 output_low(PIN_C2)
#define cor_2_1 output_high(PIN_C2)
#define cor_3_0 output_low(PIN_C3)
#define cor_3_1 output_high(PIN_C3)
//***********************************************************************//
// DEFINIÇÃO DAS VARIÁVEIS GLOBAIS //
//***********************************************************************//
unsigned long int conta_linhas = 1;
//***********************************************************************//
// TIMER 0 - Definição do sincronismo horizontal (HSYNC)
//***********************************************************************//
#int_timer0
void trata_timer0()
{
output_low(HSYNC);
delay_us(3);
output_high(HSYNC);
conta_linhas++;
set_timer0(159);
}
//***********************************************************************//
// TIMER 1 - Definição do sincronismo vertical (VSYNC)
//***********************************************************************//
#int_timer1
void trata_timer1()
{
output_low(VSYNC);
delay_us(5);//25
output_high(VSYNC);
set_timer1(55120);
}
//***********************************************************************//
// DEFINIÇÃO DA FUNÇÃO MAIN //
//***********************************************************************//
void main()
{
//***********************************************************************//
// DEFINIÇÃO DE ESTOURO DE TIMER 0 - HSYNC 30,3KHz //
//***********************************************************************//
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
enable_interrupts(int_timer0);
enable_interrupts(GLOBAL);
SET_RTCC(159);
// Seguindo a fórmula:(1/Fosc)*4)*T0_div = intervalo de incremento
// Tendo Fosc=20MHz, temos ((1/20000000)*4)*1 = 0,0000002
// Timer overview = intervalo de incremento * 2^8 = 256
// Para um estouro a cada 0,000.028s : 256 * 0,0000002 = 0,000.0512
// 256 * 0,000.028 = 0,007168s
// Teremos: 0,007168s / 0,000.0512 = 140
// Sendo assim, nosso contador irá contar a partir de 256 - 140 = 116
// Realizando medições no Osciloscópio percebe-se melhor sincronisto
//realizando setup com 159
//***********************************************************************//
// DEFINIÇÃO DE ESTOURO DE TIMER 1 - VSYNC 60Hz //
//***********************************************************************//
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
SET_TIMER2(55120);
// Seguindo a fórmula do Timer 0 obteve-se o valor 55120 para setar Timer1
//***********************************************************************//
// DEFINIÇÃO DO LAÇO INFINITO //
//***********************************************************************//
while (true)
{
if (conta_linhas >= 640) // Se já houver varrido 513 linhas HSYNC - 1 TELA
{
conta_linhas=1; // reseta contador de linhas
enable_interrupts(int_timer1); // libera timer1 para funcionamento.
}
////////////////////////////////////////////////////////////////////////////////
if (( get_timer0() >= 159 ) && (get_timer0()<169)) ; // Ausência de Cor, Tela Preta
{
cor_1_0;
cor_2_0;
cor_3_0;
}
if (( get_timer0() >= 169 ) && (get_timer0()<179)) ; //
{
cor_1_1;
cor_2_0;
cor_3_0;
}
if (( get_timer0() >= 179 ) && (get_timer0()<189)); //
{
cor_1_0;
cor_2_1;
cor_3_0;
}
if (( get_timer0() >= 189 ) && (get_timer0()<199)) ; //
{
cor_1_1;
cor_2_1;
cor_3_0;
}
if (( get_timer0() >= 199 ) && (get_timer0()<209)) ; //
{
cor_1_0;
cor_2_0;
cor_3_1;
}
if (( get_timer0() >= 209 ) && (get_timer0()<219)) ; //
{
cor_1_1;
cor_2_0;
cor_3_1;
}
if (( get_timer0() >= 219) && (get_timer0()<229)) ; //
{
cor_1_0;
cor_2_1;
cor_3_1;
}
if ( get_timer0() >= 229 ) ; //
{
cor_1_1;
cor_2_1;
cor_3_1;
}
}// Fim do Laço
} // Fim do Main