Atmel 89

printf( " : " );

gets( fname );

fsize = CHIPSIZE;

if (load_data( fname, pgmdata, &fsize )) {

if (!verify( &control, pgmdata, fsize )) {

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

gets( pch );

}

} else {

_clearscreen( _GCLEARSCREEN );

puts( " ." );

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

gets( pch );

}

break;

case 'h': //

printf( " : " );

gets( fname );

xread( &control, pgmdata, CHIPSIZE );

if (!save_data( fname, pgmdata, CHIPSIZE )) {

_clearscreen( _GCLEARSCREEN );

puts(" .");

puts( "\ Enter ..." );

gets( pch );

}

break;

case 'i': // :

_clearscreen( _GCLEARSCREEN );

if (blank( &control ))

puts( " " );

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 );

}



// .

// , .

// 1h 11h 891051 .

// 12 ,

// FFh.


void signature( cptr )

BYTE *cptr;

{

BYTE tmp1, tmp2, tmp3;


reset( cptr ); //

pulse_RST( cptr, 10 ); //

set_function( READ_SIGNATURE ); //

enable_address( cptr ); // func, PROG*

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

tmp1 = get_data(); //


pulse_XTAL1( cptr, 10 ); //

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

tmp2 = get_data(); //


pulse_XTAL1( cptr, 10 ); //

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

tmp3 = get_data(); //


printf( "signature byte 1: %.2X\n", tmp1 );

printf( "signature byte 2: %.2X\n", tmp2 );

printf( "signature byte 3: %.2X\n", tmp3 );

reset( cptr ); //

}



// Lock Bits.


void lock( cptr, lbit )

BYTE *cptr;

int lbit;

{

reset( cptr ); //


switch (lbit) { //

case 1:

set_function( WRITE_LOCK_1 );

break;

case 2:

set_function( WRITE_LOCK_2 );

break;

}


enable_address( cptr ); // function, PROG*

enable_RST( cptr ); // RST=12

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

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

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

reset( cptr ); //

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

}


// .


void reset( cptr )

BYTE *cptr;

{

outp( pdata, 0 ); //


outp( pctrl, 0x08 ); // control latch

outp( pctrl, 0x09 ); // latch data

outp( pctrl, 0x08 );


outp( pctrl, 0x0c ); // latch

outp( pctrl, 0x0d ); // latch data

outp( pctrl, 0x0c );


outp( pctrl, 0x00 ); // latch

outp( pctrl, 0x01 ); // latch data

outp( pctrl, 0x00 );


outp( pdata, 0xff ); //


outp( pctrl, 0x04 ); // data latch

outp( pctrl, 0x05 ); // latch data


outp( pctrl, 0x04 ); //

outp( pdata, 0 ); //


*cptr = 0; // control latch

}


// .

// 3


void set_function( func )

BYTE func;



// .


void set_data( outdata )

BYTE outdata;

{

outp( pdata, outdata ); //


outp( pctrl, 0x04 ); // data latch

outp( pctrl, 0x05 ); // latch data

outp( pctrl, 0x04 );


// outp( pctrl, 0x04 ); //

outp( pdata, 0 ); //

}



// .

// latch .

//

// 5- .


BYTE get_data( void )

{

BYTE tmp;


outp( pdata, 0xff ); // LPT

outp( pctrl, 0x24 ); // LPT

outp( pctrl, 0x26 ); //


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

tmp = inp( pdata ); //


outp( pctrl, 0x04 ); //

outp( pdata, 0 ); //


return( tmp );

}



// : address and function latches.

// PROG* (P3.2) .


void enable_address( cptr )

BYTE *cptr;



// : address and function latches.

// PROG* (P3.2) .


void disable_address( cptr )

BYTE *cptr;

{

outp( pdata, (*cptr &= ~0x10) ); //


outp( pctrl, 0x08 ); // control latch

outp( pctrl, 0x09 ); // latch data

outp( pctrl, 0x08 );


outp( pctrl, 0x04 ); //

outp( pdata, 0 ); //

}



// .


void enable_data( cptr )

BYTE *cptr;



// .


void disable_data( cptr )

BYTE *cptr;

{

outp( pdata, (*cptr &= ~0x20) ); // set up data


outp( pctrl, 0x08 ); // control latch

outp( pctrl, 0x09 ); // latch data

outp( pctrl, 0x08 );


outp( pctrl, 0x04 ); //

outp( pdata, 0 ); //

}



// 12 RST.

// , RST

// .


void enable_RST( cptr )

BYTE *cptr;



// RST 5 .

// , RST

// .



void disable_RST( cptr )

BYTE *cptr;

{

outp( pdata, (*cptr &= ~0x80) ); //


outp( pctrl, 0x08 ); // control latch

outp( pctrl, 0x09 ); // latch data

outp( pctrl, 0x08 );


outp( pctrl, 0x04 ); //

outp( pdata, 0 ); //

}



// RST . // .


void pulse_RST( cptr, time )

BYTE *cptr;

int time;



// XTAL1

// . .


void pulse_XTAL1( cptr, time )

BYTE *cptr;

int time;

outp( pctrl, 0x08 );


// PROG*

// . .


void pulse( cptr, time )

BYTE *cptr;

int time;



// .

// 1/1193180 (0,838)


void delay( xcount )

BIGINT xcount;

{

BIGINT count0;


// printf( " = %lu\n", xcount );


tread(); //

count0 = tcount; //

do // >=

tread(); //

while (tcount - count0 < xcount);

}


7. OrCAD


OrCAD 9.2. 815. OrCAD- , . 4.1 , OrCAD Capture.

7.1.

Place/Part. Pspice/New Simulation Profile, . , . , Stimulus Editor. DigStim, Edit Pspice Stimulus.

Stimulus Editor , 4.1


7.2. Stimulus Editor` sig

7.3. Pspice A/D

 

, Pspice/Run Pspice A/D ( 4.3)

. , Trace/Add Trace .


.

Atmel 89 LPT- . , , , Atmel 89 , .

.

.

, .

.

1.            . Atmel 89. , 2003, 9, . 24 25.

2.            . 89. , 2004, 2, . 28 31.

3.            . . P-CAD - .: -, 2003.-224.:.

4.            AT89 Series Programmer Interface <http://www.atmel.com/dyn/resources/ prod_documents/APCPGM.EXE >.

5.            .-., . : . ./ . . . . .: . 1980. 464 ., .

6.            . ., . ., . . . . .: , 2003. 160 .

7.            . . : . .: , .: -, 1998. 720.: .


23751-86. . .




: 1, 2, 3, 4, 5, 6






           

2009 .