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