// lfuse 1101 1111; EF
#define F_CPU 18432000UL // 18.432 MHz
//#define F_CPU 18000000UL // 18 MHz
#include <avr/io.h>
#include <util/delay.h>
/////////////////////////////////////////////////////////////////////////////////////////////////
#define PIN0 0 // 580 Ohm Resistor
#define PIN1 1 // 1k2 Ohm Resistor
#define PIN2 2 // 1k Ohm Resistor
// PIN0 PIN1 PIN2 OUTPUT
// 0 0 0 0.0V - Sync level
// 1 0 0 510mV - Gray
// 0 1 0 246mV - ???
// 0 0 1 296mV - Black
// 1 1 0 757mV - gray/white
// 1 0 1 806mV - gray/white
// 0 1 1 542mV - black/gray
// 1 1 1 1.05V - white
#define LEVEL_SYNC PORTA &= ~(1<<PIN0); PORTA &= ~(1<<PIN1); PORTA &= ~(1<<PIN2) // 0 0 0
#define LEVEL_BLACK PORTA &= ~(1<<PIN0); PORTA &= ~(1<<PIN1); PORTA |= (1<<PIN2) // 0 0 1
#define LEVEL_GRAY PORTA |= (1<<PIN0); PORTA &= ~(1<<PIN1); PORTA &= ~(1<<PIN2) // 1 0 0
#define LEVEL_GRAY2 PORTA |= (1<<PIN0); PORTA &= ~(1<<PIN1); PORTA |= (1<<PIN2) // 1 0 1
#define LEVEL_GRAY3 PORTA |= (1<<PIN0); PORTA |= (1<<PIN1); PORTA &= ~(1<<PIN2) // 1 1 0
#define LEVEL_WHITE PORTA |= (1<<PIN0); PORTA |= (1<<PIN1); PORTA |= (1<<PIN2) // 1 1 1
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
inline void vsync_pulse()
{
LEVEL_SYNC;
_delay_us(30);
LEVEL_BLACK;
_delay_us(2);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
inline void equal_pulse()
{
LEVEL_SYNC;
_delay_us(2);
LEVEL_BLACK;
_delay_us(30);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
inline void hsync_pulse()
{
LEVEL_SYNC;
_delay_us(4); //4.7us
LEVEL_BLACK;
_delay_us(8); //7.3us
}
/////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
register unsigned int line;
/* NOTE THAT THE SIGNAL GENERATED BY THIS PROGRAM HAS A NOT VERY ACURATE TIMMING SO
IT IS POSIBLE THAT THE IMAGE BLINKS ON YOUR TV SCREEN OR DOESN'T SHOW AT ALL,
THIS PROGRAM WRITTEN IN C (INTEAD OF ASSEMBLER) IS ONLY A PROFF OF CONCEPT */
line = 0;
DDRA = 0xFF; // PORTD, all pins are outputs
while(1)
{
if (line == 625)
{
line = 1;
}
else
{
line++;
}
switch(line)
{
case 1:
case 2:
case 314:
case 315:
vsync_pulse();
vsync_pulse();
// break;
case 3:
vsync_pulse();
equal_pulse();
//break;
case 4:
case 5:
case 311:
case 312:
case 316:
case 317:
case 623:
case 624:
case 625:
equal_pulse();
equal_pulse();
// break;
case 313:
equal_pulse();
vsync_pulse();
break;
default:
// Image scanline (not a sync line)
hsync_pulse(); // Horizontal Sync, lenght = 12us
LEVEL_GRAY2;
_delay_us(8);
LEVEL_BLACK;
_delay_us(14);
LEVEL_WHITE;
_delay_us(7);
LEVEL_BLACK;
_delay_us(14);
LEVEL_GRAY;
_delay_us(8);
//52us in total
}
}
}