Параллельный программатор для микроконтроллеров Atmel серии АТ89

55

FF

АТ89С55-ХХХХ-5

1E

55

05

AT89LV55

65

FF

AT89S8252

72

Нет

AT89LS8252

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



Реклама
В соцсетях
рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать рефераты скачать