Skip to content

Commit

Permalink
test PAL code
Browse files Browse the repository at this point in the history
  • Loading branch information
zst123 committed May 4, 2020
1 parent d7b4942 commit 0163da2
Show file tree
Hide file tree
Showing 2 changed files with 202 additions and 24 deletions.
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ PROGPART=t85

#21800000UL for Ch7, 3rd.
#61.25/2 = 30.625 nom.

# -DF_CPU=30625000UL
CFLAGS=-g -Wall -Os -mmcu=$(PART) -DF_CPU=30625000UL
ASFLAGS:=$(CFLAGS)
CC=avr-gcc
Expand All @@ -20,7 +22,7 @@ test.lst : test.c
avr-gcc -c -g -Wa,-a,-ad $(CFLAGS) $^ > $@

burn : test.hex
avrdude -c usbtiny -p $(PROGPART) -V -U flash:w:test.hex
avrdude -c stk500v1 -p $(PROGPART) -V -U flash:w:test.hex -P /dev/cu.usb* -b 19200

#For PLL
burnfuses :
Expand Down
222 changes: 199 additions & 23 deletions test.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,44 +58,79 @@ void NumToText4( char * c, uint16_t a )
EMPTY_INTERRUPT(TIM0_OVF_vect );


#define NOP() do { __asm__ __volatile__ ("nop"); } while (0)

int main( )
{
cli();

// Setup PLL for TIM1
CLKPR = 0x80; /*Setup CLKPCE to be receptive*/
CLKPR = 0x00; /*No scalar*/
CLKPR = 0x00; /*No pll prescale*/

PLLCSR = _BV(PLLE) | _BV( PCKE );

DDRB = _BV(1);
// Setup PWM on TIM1
//DDRB = _BV(1);
DDRB = 0;

DDRB |= _BV(3);
DDRB |= _BV(4);
PORTB |= _BV(1);
PORTB |= _BV(3);
PORTB |= _BV(4);

TCCR1 = _BV(CS10);// | _BV(CTC1); //Clear on trigger.
GTCCR |= _BV(PWM1B) | _BV(COM1B0);// | _BV(COM1B1);
OCR1B = 2;
OCR1B = 1;
OCR1C = 3;
DTPS1 = 0;
DT1B = _BV(0) | _BV(4);
DT1B = 0;

// Setup TIM0 for line interval
TCCR0A = 0;
TCCR0B = _BV(CS01);
TCCR0B = _BV(CS01); // 30MHz/8 = 3.75MHz timer = 266.67ns
TIMSK |= _BV(TOIE0);

//CH3 on my AVR is OSCCAL=237 to 241
OSCCAL = 239;
#define LINETIME 11 //Linetime of 7..20 is barely valid.

#define NTSC_VH { DDRB=0; }
#define NTSC_HI { DDRB=_BV(3); }
#define NTSC_LOW { DDRB=_BV(4)|_BV(3); }
OSCCAL = 251;
#define LINETIME 15 //Linetime of 7..20 is barely valid.
// Linetime = H = 64usec = 240 timer ticks
#define LINETIME_HALF (LINETIME+120)

#define POWERSET3

#ifdef POWERSET1
#define NTSC_VH { DDRB=0;}
#define NTSC_HI { DDRB=_BV(4)|_BV(3); OCR1B = 1; TCNT1 = 0;}
#define NTSC_LOW { DDRB=_BV(4)|_BV(3); OCR1B = 2; TCNT1 = 0;}
#elif defined( POWERSET2 )
// normal;
#define NTSC_VH { DDRB=0;}
#define NTSC_HI { DDRB=_BV(3); }
#define NTSC_LOW { DDRB=_BV(4)|_BV(3); }

#elif defined( POWERSET3 )
// test duty cycle
#define NTSC_VH { DDRB=0; }
#define NTSC_HI { DDRB=_BV(3); OCR1B = 1;}
#define NTSC_LOW { DDRB=_BV(4)|_BV(3); OCR1B = 2;}

#elif defined( POWERSET4 )
// swap polarity;
#define NTSC_VH { DDRB=_BV(4)|_BV(3); }
#define NTSC_HI { DDRB=_BV(3); }
#define NTSC_LOW { DDRB=0;}
#else
//#define NTSC_VH { DDRB=0; }
//#define NTSC_HI { DDRB=_BV(3); }
//#define NTSC_LOW { DDRB=_BV(4)|_BV(3); }
#endif

uint8_t line, i;

#define TIMEOFFSET .12
#define CLKOFS .12
#define TIMEOFFSET 0
#define CLKOFS 0

uint8_t frame = 0, k, ctll;
char stdsr[8*13];
Expand All @@ -113,13 +148,23 @@ int main( )
sprintf( stdsr+88, " " );


ADMUX =/* _BV(REFS1) | _BV(ADLAR) | */ 1; //1 = PB2
ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADATE) | _BV(ADPS2) | _BV(ADPS1);
//ADMUX =/* _BV(REFS1) | _BV(ADLAR) | */ 1; //1 = PB2
//ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADATE) | _BV(ADPS2) | _BV(ADPS1);

#define RESETCNT {TCNT0 = LINETIME; TIFR|=_BV(TOV0); GTCCR|=PSR0;sei();}
#define RESETCNT_HALF {TCNT0 = LINETIME_HALF; TIFR|=_BV(TOV0); GTCCR|=PSR0;sei();}
#define WAITTCNT sleep_cpu();


//#define LONGSYNC { NTSC_LOW; _delay_us(27.3-TIMEOFFSET); NTSC_HI; _delay_us(4.7-TIMEOFFSET-CLKOFS);}
//#define SHORTSYNC { NTSC_LOW; _delay_us(2.35-TIMEOFFSET); NTSC_HI; _delay_us(29.65-TIMEOFFSET-CLKOFS); }

#define LONGSYNC { NTSC_LOW; _delay_us(27-TIMEOFFSET); NTSC_HI; _delay_us(5-TIMEOFFSET-CLKOFS);}
#define SHORTSYNC { NTSC_LOW; _delay_us(3-TIMEOFFSET); NTSC_HI; _delay_us(28-TIMEOFFSET-CLKOFS); }

//#define LONGSYNC { NTSC_LOW; RESETCNT_HALF; _delay_us(27.3-TIMEOFFSET); NTSC_HI; WAITTCNT;}
//#define SHORTSYNC { NTSC_LOW; RESETCNT_HALF; _delay_us(2.35-TIMEOFFSET); NTSC_HI; WAITTCNT; }

sleep_enable();
sei();

Expand All @@ -129,19 +174,148 @@ int main( )

uint16_t ovax = 0; //0..1024 = 0...5v
uint8_t ovax8 = 0;


while(1)
{

frame++;
//H = 1./15734.264 = 63.555 / 2 = 31.7775
for( line = 0; line < 6; line++ )
{ NTSC_LOW; _delay_us(2.3-TIMEOFFSET); NTSC_HI; _delay_us(29.5-TIMEOFFSET-CLKOFS); }
for( line = 0; line < 6; line++ )
{ NTSC_LOW; _delay_us(27.1-TIMEOFFSET); NTSC_HI; _delay_us(4.7-TIMEOFFSET-CLKOFS); }
for( line = 0; line < 6; line++ )
{ NTSC_LOW; _delay_us(2.3-TIMEOFFSET); NTSC_HI; _delay_us(29.5-TIMEOFFSET-CLKOFS); }
//H = 1./15625 = 64
// H / 2 = 32

// Long sync: H*2.5
for( line = 0; line < 5; line++ ) { LONGSYNC; }

// Short sync: H*2.5
for( line = 0; line < 4; line++ ) { SHORTSYNC; }

// CNT == H == 64us

RESETCNT;
// FIRST
#define MAX_LINES (200)
for( line = 0; line < MAX_LINES; line++ ) {
_delay_us(1.65-TIMEOFFSET); // front porch
NTSC_LOW;
_delay_us(4.7-TIMEOFFSET); // horizontal sync
NTSC_HI;
_delay_us(1-TIMEOFFSET); // back porch (arbituary value)


if (line < 20) {
// Field-blanking interval of 17.5H
} else if (line < 80) {
if (40 < line && line < 60) {
_delay_us(5);
NTSC_VH;
_delay_us(5);
NTSC_HI;
_delay_us(5);
NTSC_VH;
_delay_us(5);
NTSC_HI;
}

/*NTSC_VH;
for (uint8_t x = 0; x < line; x+=4) {
NOP();
}
NTSC_HI;*/

/*
if (line < 22) {
} else if (line < 30) {
} else if (line < 50) {
NTSC_VH;
_delay_us(10-TIMEOFFSET-CLKOFS);
NTSC_HI;
} else if (line < 70) {
NTSC_VH;
_delay_us(15-TIMEOFFSET-CLKOFS);
NTSC_HI;
} else if (line < 100) {
NTSC_VH;
_delay_us(20-TIMEOFFSET-CLKOFS);
NTSC_HI;
} else {
NTSC_VH;
_delay_us(23-TIMEOFFSET-CLKOFS);
NTSC_HI;
}*/

} else if (line < 125) {
_delay_us(5);

#define V_DELAY { NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP(); }
#define V1 {NTSC_VH; V_DELAY; NTSC_HI; }
#define V0 {NTSC_HI; V_DELAY; NTSC_HI; }

// Hello World where 4x4 dots is 1 pixel
if (line>>2 == 20) { V1;V0;V0;V1;V0;V1;V1;V1;V1;V0;V1;V0;V0;V0;V0;V1;V0;V0;V0;V0;V1;V1;V1;V1; NTSC_HI; }
if (line>>2 == 21) { V1;V0;V0;V1;V0;V1;V0;V0;V0;V0;V1;V0;V0;V0;V0;V1;V0;V0;V0;V0;V1;V0;V0;V1; NTSC_HI; }
if (line>>2 == 22) { V1;V1;V1;V1;V0;V1;V1;V1;V1;V0;V1;V0;V0;V0;V0;V1;V0;V0;V0;V0;V1;V0;V0;V1; NTSC_HI; }
if (line>>2 == 23) { V1;V0;V0;V1;V0;V1;V0;V0;V0;V0;V1;V0;V0;V0;V0;V1;V0;V0;V0;V0;V1;V0;V0;V1; NTSC_HI; }
if (line>>2 == 24) { V1;V0;V0;V1;V0;V1;V1;V1;V1;V0;V1;V1;V1;V1;V0;V1;V1;V1;V1;V0;V1;V1;V1;V1; NTSC_HI; }

if (line>>2 == 26) { V1;V0;V0;V0;V1;V0;V1;V1;V1;V1;V0;V1;V1;V1;V1;V0;V1;V0;V0;V0;V0;V1;V1;V1; NTSC_HI; }
if (line>>2 == 27) { V1;V0;V0;V0;V1;V0;V1;V0;V0;V1;V0;V1;V0;V0;V1;V0;V1;V0;V0;V0;V0;V1;V0;V0;V1; NTSC_HI; }
if (line>>2 == 28) { V1;V0;V1;V0;V1;V0;V1;V0;V0;V1;V0;V1;V1;V1;V1;V0;V1;V0;V0;V0;V0;V1;V0;V0;V1; NTSC_HI; }
if (line>>2 == 29) { V1;V0;V1;V0;V1;V0;V1;V0;V0;V1;V0;V1;V0;V1;V0;V0;V1;V0;V0;V0;V0;V1;V0;V0;V1; NTSC_HI; }
if (line>>2 == 30) { V0;V1;V0;V1;V0;V0;V1;V1;V1;V1;V0;V1;V0;V0;V1;V0;V1;V1;V1;V1;V0;V1;V1;V1; NTSC_HI; }
// up to 30*4 = 124

} else {
}






// Use sleep interrupt to reset
WAITTCNT;
NTSC_HI;
RESETCNT;
}

/*
// Short sync: H*2.5
for( line = 0; line < 5; line++ ) { SHORTSYNC; }
// Long sync: H*2.5
for( line = 0; line < 5; line++ ) { LONGSYNC; }
// Short sync: H*2
for( line = 0; line < 4; line++ ) { SHORTSYNC; }
// SECOND
for( line = 0; line < 305; line++ ) {
_delay_us(1.65-TIMEOFFSET); // front porch
NTSC_LOW;
_delay_us(4.7-TIMEOFFSET); // horizontal sync/Synchronizing pulse
NTSC_HI;
_delay_us(5.7-TIMEOFFSET-CLKOFS); // back porch
if (line < 20) {
// Field-blanking interval of 17.5H
} else if (line < 200) {
NTSC_VH;
_delay_us(10-TIMEOFFSET-CLKOFS);
}
NTSC_HI; //_delay_us(44.5);
WAITTCNT;
RESETCNT;
}
*/

// Short sync: H*3
for( line = 0; line < 6; line++ ) { SHORTSYNC; }

/*
for( line = 0; line < 39; line++ )
{
NTSC_LOW;
Expand Down Expand Up @@ -224,7 +398,7 @@ int main( )
RESETCNT;
#endif
}
for( line = 0; line < 92; line++ )
for( line = 0; line < (92+47); line++ )
{
NTSC_LOW;
_delay_us(4.7-TIMEOFFSET);
Expand All @@ -238,6 +412,8 @@ int main( )
WAITTCNT;
RESETCNT;
}
*/
}

return 0;
Expand Down

0 comments on commit 0163da2

Please sign in to comment.