55
FF
АТ89С55-ХХХХ-5
1E
55
05
AT89LV55
1Е
65
FF
AT89S8252
1Е
72
Нет
AT89LS8252
1Е
82
Нет
Программа автоматически определяет тип установленного в одну из панелей микроконтроллера, анализируя для этого его сигнатуру – два или три байта, специально записанные в постоянной памяти. Перечень сигнатур микроконтроллеров семейства АТ89 приведен в таблице 6. Если все байты сигнатуры равны 0FFH, отсутствует в панели или неисправен микроконтроллер, а возможно – не включено питание программатора.
Рекомендуемая операционная среда – MS DOS. Пользователям Windows следует запускать программу, предварительно перезагрузив компьютер в режиме MS DOS или установить такой режим в свойствах файла. Иначе программирование микросхем придется повторять по три-четыре раза подряд, пока не прекратятся сообщения об ошибках верификации.
Весь процесс программирования занимает не более одной-двух минут, а собственно загрузка FLASH-памяти – максимум 10...15 с. Команды, список которых выведен на экран монитора, подают, нажимая клавиши с буквами латинского алфавита. Регистр (верхний или нижний) не имеет значения.
Имя двоичного файла, данные из которого должны быть загружены в память микроконтроллера, вводят после подачи команды "Чтение файла". Содержимое этой памяти можно предварительно прочитать и сохранить в аналогичном файле (команда "Запись в файл"). При сверке содержимого памяти с данными из файла (команда "Сверка с файлом") возможно появление на экране сообщений, подобных такому:
В ячейке FLASH 039A = FF ?! 6В
Это означает, что а ячейке FLASH-памяти (памяти программ) микроконтроллера по адресу 39АН записан код 0FFH вместо 6ВН, указанного в файле.
6.2. Исходный текст программы.
Программа написана на языке программирования Borland C++
// Программа для AT89C51/C52/C1051/C1052 программатора.
#include <stdio.h>
#include <string.h>
#include <graph.h>
#include <dos.h>
#define FALSE 0
#define TRUE -1
//#define PBASE 0x378 // LPT1 базовый адрес
//#define PBASE 0x278 // LPT2 базовый адрес
//#define PDATA (PBASE+0)
//#define PSTAT (PBASE+1)
//#define PCTRL (PBASE+2)
#define CHIPSIZE 2048 // AT89C1052 размер FLASH-памяти
#define TCVT (1.19318) // постоянная преобразования времни
// частота порядка 1E6
// Коды четырехбитных функций (передача в P3.6; P3.5; P3.4; P3.3).
#define WRITE_DATA 0xe
#define READ_DATA 0xc
#define WRITE_LOCK_1 0xf
#define WRITE_LOCK_2 0x3
#define CHIP_ERASE 0x1
#define READ_SIGNATURE 0x0
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned int BOOLEAN;
typedef unsigned long int BIGINT;
BOOLEAN load_data( char *, BYTE *, int * );
BOOLEAN save_data( char *, BYTE *, int );
void erase( BYTE * );
void program( BYTE *, BYTE *, int );
void xread( BYTE *, BYTE *, int );
BOOLEAN verify( BYTE *, BYTE *, int );
BOOLEAN blank( BYTE * );
void signature( BYTE * );
void lock( BYTE *, int );
void reset( BYTE * );
void set_function( BYTE );
void set_data( BYTE );
BYTE get_data( void );
void enable_address( BYTE * );
void disable_address( BYTE * );
void enable_data( BYTE * );
void disable_data( BYTE * );
void enable_RST( BYTE * );
void disable_RST( BYTE * );
void pulse_RST( BYTE*, int );
void pulse_XTAL1( BYTE*, int );
void pulse( BYTE *, int );
void delay( BIGINT );
extern void tinit( void );
extern void tend( void );
extern void tread( void );
extern void disable_traps( void );
extern void enable_traps( void );
WORD pctrl, pdata; // Адреса регистра данных и регистра управления //LPT-порта
BIGINT tcount = 0L; // счет таймера
main(argc, argv)
int argc;
char *argv[];
{
FILE *fptr;
int fsize;
BYTE pgmdata[CHIPSIZE], control = 0;
char *pch, fname[20];
WORD far *p_lpt1 = (WORD far *)0x00400008;
WORD far *p_lpt2 = (WORD far *)0x0040000a;
if ((argc > 1) && ((pch = strpbrk( argv[1], "12" )) != NULL)) {
switch (*pch) {
case '1': // LPT1
pdata = *p_lpt1;
pctrl = *p_lpt1 + 2;
break;
case '2': // LPT2
pdata = *p_lpt2;
pctrl = *p_lpt2 + 2;
break;
}
if (pdata == 0) { // порт неопределен
puts( "SPP параллельный порт не установлен." );
exit( 255 );
}
} else
puts(
tinit(); // запускаем таймер
disable_traps(); // запрещаем ctl-C и ctl-break
while (TRUE) {
_clearscreen( _GCLEARSCREEN );
puts( "Стирание чипа\t\tD\n" );
puts( "Программа из файла \tF" );
puts( "Сравнение данных на чипе с файлом\tG" );
puts( "Запись в файл\t\tH\n" );
puts( "Проверка: чистый чип или нет\t\tI\n" );
puts( "Чтение сигнатуры\t\tJ\n" );
puts( "Запись Lock Bit 1\tL" );
puts( "Запись Lock Bit 2\tN\n" );
puts( "Выход\t\t\tX\n\n" );
printf( "Ваш выбор: " );
gets( pch );
*pch |= 0x20; //конвертируем первый символ в нижний регистр
switch (*pch) {
case 'd': // стирание чипа
erase( &control );
break;
case 'f': // запись чипа из файла
printf( "Введите имя файла: " );
gets( fname );
fsize = CHIPSIZE;
if (load_data( fname, pgmdata, &fsize ))
program( &control, pgmdata, fsize );
else {
_clearscreen( _GCLEARSCREEN );
puts( "Ошибка открытия или чтения входного файла данных." );
puts( "\nНажмите Enter для продолжения..." );
gets( pch );
}
break;
case 'g': // сравнивание содержимого чипа с файлом
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( "Устройство чистое" );
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10