Параллельный программатор для микроконтроллеров 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



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