All pastes #920940 Raw Edit

Miscellany

public text v1 · immutable
#920940 ·published 2008-02-27 18:45 UTC
rendered paste body
// 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
			 }
      }
}