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

//        1Еh и 11h соответственно они идентифицируют АТ89С1051 контроллер.

//        Третий байт во втором адресе указывает программирование 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, 7, 8, 9, 10



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