Atmel 89

else

puts( " " );

puts( "\n Enter ..." );

gets( pch );

break;

case 'j': //

_clearscreen( _GCLEARSCREEN );

signature( &control );

puts( "\n Enter ..." );

gets( pch );

break;

case 'l': // Lock Bit 1

lock( &control, 1 );

break;

case 'n': // Lock Bit 2

lock( &control, 2 );

break;

case 'x': //

default:

_clearscreen( _GCLEARSCREEN );

tend(); //

enable_traps();

exit( 0 );

}

}

}


// .

// ,

// , .

// ,

// .

// .



BOOLEAN load_data( fname, store, sptr )

char fname[];

BYTE store[];

int *sptr;

{

FILE *fptr;

int nbytes;


if ((fptr = fopen( fname, "rb" )) == NULL)

return( FALSE ); //

nbytes = fread( store, 1, *sptr, fptr );

if (ferror( fptr ))

return( FALSE ); //

if (feof( fptr )) //

*sptr = nbytes; //

fclose( fptr );

return( TRUE );

}



// .

// , .


BOOLEAN save_data( fname, store, bcount )

char fname[];

BYTE store[];

int bcount;

{

FILE *fptr;


if ((fptr = fopen( fname, "wb" )) == NULL)

return( FALSE ); //

if (fwrite( store, 1, bcount, fptr ) != bcount)

return( FALSE ); //

fclose( fptr );

return( TRUE );

}



// .


void erase( cptr )

BYTE *cptr;

{

reset( cptr ); //

set_function( CHIP_ERASE ); //

enable_address( cptr ); // func, PROG*

delay( (BIGINT)(10 * TCVT) ); // 10

enable_RST( cptr ); // RST=12v

delay( (BIGINT)(15000 * TCVT) ); // 15 RST ->PROG*

pulse( cptr, 10000 ); // 10 PROG*

delay( (BIGINT)(10 * TCVT) ); // PROG*->adr/data

reset( cptr ); //

delay( (BIGINT)(15000 * TCVT) ); // 15 RST

}



// .

//

// .

// .


void program( cptr, data, count )

BYTE *cptr, data[];

int count;

{

WORD addr;


reset( cptr ); //

pulse_RST( cptr, 10 ); //

set_function( WRITE_DATA ); //

enable_address( cptr ); // function, PROG*

enable_data( cptr ); //

delay( (BIGINT)(10 * TCVT) ); // function->RST

enable_RST( cptr ); // RST=12v

delay( (BIGINT)(15000 * TCVT) ); // 15 RST ->PROG*


for (addr=0; addr<count; addr++) {

set_data( data[addr] ); // data

delay( (BIGINT)(10 * TCVT) ); // data->PROG*

pulse( cptr, 100 ); // 100 PROG*

delay( (BIGINT)(1500 * TCVT) ); // 1.5

pulse_XTAL1( cptr, 10 ); //

}


reset( cptr ); //

delay( (BIGINT)(15000 * TCVT) ); // 15 RST

}


//

//

// . .


void xread( cptr, data, count )

BYTE *cptr, data[];

int count;

{

BYTE tmp;

WORD addr;


reset( cptr ); //

pulse_RST( cptr, 10 ); //

set_function( READ_DATA ); //

enable_address( cptr ); // function, PROG*


for (addr=0; addr<count; addr++) {

delay( (BIGINT)(10 * TCVT) ); // address->data

data[addr] = get_data();

pulse_XTAL1( cptr, 10 ); //

}


reset( cptr ); //

}


// .

//

// . .

//

// : , ,

// .

// .


BOOLEAN verify( cptr, data, count )

BYTE *cptr, data[];

int count;

{

BYTE tmp;

BOOLEAN flag=TRUE;

WORD addr;


reset( cptr ); //

pulse_RST( cptr, 10 ); //

set_function( READ_DATA ); //

enable_address( cptr ); // function, PROG*


for (addr=0; addr<count; addr++) {

delay( (BIGINT)(10 * TCVT) ); // address->data

if ((tmp = get_data()) != data[addr]) {

if (flag) {

_clearscreen( _GCLEARSCREEN );

}

printf(" %.4X is %.2X sb %.2X\n", addr, tmp, data[addr] );

flag = FALSE;

}

pulse_XTAL1( cptr, 10 ); //

}


reset( cptr ); //

return( flag );

}



// , . .

// .



BOOLEAN blank( cptr )

BYTE *cptr;

{

BYTE tmp;

BOOLEAN flag = TRUE; //

WORD addr;


reset( cptr ); //

pulse_RST( cptr, 10 ); //

set_function( READ_DATA ); //

enable_address( cptr ); // function, PROG*


for (addr=0; addr<CHIPSIZE; addr++) {

delay( (BIGINT)(10 * TCVT) ); // address->data

if (get_data() != 0xff) //

flag = FALSE; //

pulse_XTAL1( cptr, 10 ); //

}


reset( cptr ); //

return( flag );

}



// .

// , .

: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10