Для чего нужен программатор

Программатор — аппаратно-программное устройство, предназначенное для записи/считывания информации в постоянное запоминающее устройство (однократно записываемое, флеш-память, ПЗУ, внутреннюю память микроконтроллеров и ПЛК).

Программатор — это устройство, которое заносит информацию, необходимую для работы, в программируемые энергонезависимые цифровые микросхемы, такие, как PROM (ПЗУ), EPROM (ППЗУ), EEPROM (ЭСППЗУ), Flash, PAL, GAL, FPGA и микроконтроллеры. Процесс записи часто называется «программирование», «загрузка», «прошивка», «прожиг».

Прошить ПЗУ, прошивка ПЗУ

«Прошить ПЗУ» — записать информацию в ПЗУ.

Когда-то, когда компьютеры были большими, с середины 1950-х и до середины 1970-х годов, в компьютерах использовалась память на магнитных сердечниках. Такая память использовалась и как ОЗУ, и как ПЗУ. При изготовлении ПЗУ провод либо проходил через кольцо, либо его обходил. Провод пропускали через ферритовое кольцо с помощью специальной иглы. То есть «прошивали» матрицу памяти в прямом смысле. Поэтому за этим процессом вполне закономерно закрепилось определение «прошить ПЗУ». Для того чтобы правильно «прошить», создавали технологический документ «карта прошивки» в котором было указано через какие кольца пропускать провод, а через какие нет. Память на ферритовых сердечниках ушла в прошлое, однако, термин «прошить» и «прошивка» применительно к процессу записи в ПЗУ используется до сих пор. Причем слово «прошивка» используется как глагол применительно к процессу занесения информации в ПЗУ, так и как существительное применительно к самой заносимой информации или файлу.

В отличие от полупроводников магнитные сердечники не боятся радиации и электромагнитного излучения, и, поэтому, память на магнитных сердечниках некоторое время продолжали использовать в военных и космических системах. Достоверно известно, что ее использовали в бортовых компьютерах Шаттлов до 1991 года. Возможно, такая память и до сих пор используется в некоторых старых системах. В настоящее время уже разработана полупроводниковая память устойчивая к спецвоздействию, и эпоха магнитных сердечников ушла, но термин «прошивка» остался.

Классификация программаторов.

По типу поддерживаемых микросхем

  1. Специализированный программатор. Устройство, программирующее микросхемы только одного типа, или микросхемы только одного производителя.
  2. Условно универсальный программатор. Устройство, программирующее (поддерживающее) микросхемы различных типов и/или микросхемы различных производителей.
  3. Универсальные программаторы. Устройства, программирующие (поддерживающие) микросхемы всех типов, и микросхемы всех производителей.

Очевидно, чем более широк спектр поддерживаемых микросхем, тем более сложная программно аппаратная реализация такого устройства.

Универсальный программатор — основные понятия

Аппаратная часть наиболее простых программаторов, позволяющих запрограммировать микросхемы одной серии, как правило, представляет собой кабель и несколько резисторов, которые подключаются к одному из портов PC.

Универсальный программатор строится на базе универсальных аппаратных драйверов. Аппаратные драйвера подключаются к выводам колодки, и должны обеспечивать:
— подачу и считывание логических уровней;
— подачу сложных тактовых последовательностей в широком диапазоне частот;
— подачу напряжения в широком диапазоне и с высокой точностью.

В общем случае, чем более универсальны аппаратные драйвера, и чем больше их количество — тем более универсально подобное устройство.

По способу программирования микросхем

  1. Параллельный программатор. Программирование микросхем происходит в колодке программатора;
  2. Внутрисхемный, или ISP программатор. Программирование микросхем происходит непосредственно в устройстве пользователя. в режиме ISP (внутрисхемного) программирования, иногда его называют режимом последовательного программирования.

Параллельный программатор. Для того, что бы произвести необходимые действия с микросхемой, ее надо вставить в колодку программатора. Затем, в программном интерфейсе выбрать соответствующий тип поддерживаемой микросхемы, после этого, запустить на исполнение необходимый режим (программирование, чтение, стирание, защита и т.п.).

Колодка должна обеспечивать надежный электрический контакт между выводами микросхемы и аппаратными драйверами устройства. Как правило, универсальный программатор оснащается колодкой под DIP корпус микросхемы. Наиболее надежными и удобными для пользователя являются специальные колодки (сокетки) с нулевым усилием — (ZIF socket).

Для программирования микросхем с корпусами, отличными от DIP, необходимо использовать специальные переходные адаптеры для программирования.

Внутрисхемный программатор. Внутрисхемное программирование возможно только тех микросхем, которые рассчитаны на данный режим. Как правило, подобные микросхемы имеют встроенные схемы, которые:
— из внешнего напряжения питания генерируют напряжения необходимые для программирования;
— обеспечивают коммуникацию с внутрисхемным прoгрaммaтором по последовательному интерфейсу (вариации протокола JTAG, SPI, UART).

Для реализации режима внутрисхемного программирования, устройство пользователя должно обеспечивать:
— необходимую коммутацию с выводами микросхемы;
— необходимые режимы по нагрузке и питанию на соответствующих выводах микросхемы в режиме программирования.

Главным преимуществом внутрисхемного программирования является возможность объединения процесса программирования и тестирования, исключив отдельную фазу программирования микросхем перед окончательной сборкой устройства.

Отличительной особенностью моделей серии ChipProg-xx является то обстоятельство, что помимо поддержания параллельного режима программирования (программирования в колодке), они поддерживают и режим внутрисхемного программирования.

По подключению к компьютеру

Как правило, для подключения современного программатора к PC используется порт USB. Раньше для этих целей использовались LPT и/или COM порты. Некоторые модели могут работать и в автономном режиме, без подключения к PC. Например, ChipProg-ISP2 помимо обычного управления от PC допускает управление:
— кнопкой на корпусе;
— через Ethernet (с гальванической развязкой);
— от внешних программно аппаратных комплексов.
При этом, программируемая информация, все режимы и опции программирования хранятся на встроенной SD карте (до 256 проектов).

По количеству одновременно программируемых микросхем

Как правило, универсальный программатор может работать одновременно не более чем с одной микросхемой. Обычно, для целей разработки, ремонта или обслуживания различных электронных устройств и блоков, этого вполне достаточно. Для тиражирования микросхем выпускаются специализированные промышленные копировщики. Так например, наш ChipProg-G41 снабжен четырьмя ZIF сокетками, что позволяет в асинхронном режиме программировать до 4 микросхем одновременно, а нутрисхемный промышленный ISP CPI2-Gxxxx позволяет в асинхронном режиме программировать до 14 микросхем одновременно. Другая возможность существенно увеличить скорость тиражирования партий микросхем – воспользоваться функциональными возможностями некоторых устройств. В частности, модели ChipProg-XX с USB интерфейсом предоставляют возможность мультипрограммирования. Что позволяет обеспечить программирование практически любого количества микросхем одновременно.

По дополнительным функциональным и сервисным возможностям

Различные устройства, подчас существенно отличаются друг от друга по своим функциональным и сервисным возможностям.

Программатор для начинающих.

Начинающему пользователю программатора — завтрашнему коллеге:

1. Если Вам нужно устройство для программирования ограниченной номенклатуры микросхем, и в далнейшем Вы не планируете заниматься программированием микросхем профессионально — скорее всего Вы сможете найти в интернете описание подходящего устройства, которое можно воспроизвести обладая даже начальными радиолюбительскими навыками. Удачи.

2. Если Вы планируете заняться программированием профессионально — не спешите, лучший программатор для начинающего, это не обязательно самый простой или самый дешевый. Возможно Вам будет полезно посмотреть материал с рекомендациями какой универсальный программатор купить (выбрать).

Профессиональный, хорошо сделанный программатор обладает следующими опциями, полезными в том числе и начинающему пользователю:
— развернутая документация, включая контекстные подсказки;
— демо режим;
— поддержка разработчика;
— встроенные механизмы защиты от неправильных действий пользователя;
— режим самодиагностики.

Что такое ПЗУ

ПЗУ (Постоянное запоминающее устройство или EEPROM) один из вариантов памяти, применяемый для хранения config или хранения временных переменных, по сути это флешка на которой храниться программа для СМА. В основном встречаются микросхемы серии 24cxx (где xx объем памяти, чаще всего 64, то есть 8192 ячейки памяти, запомните это число, оно будет упомянуто далее), данные микросхемы работают по протоколу I2С.

464d34df1988c6565ca8a5289a165bda20210327092458.jpg

i2C шина обмена данными

I2C — шина для соединения различных интегральных устройств, с помощью двух проводов SDА (D — данные) и SCL (C — такт). Каждое подключенное устройство к данной шине Master (формирует такт и данные) или SLAVE (ведомое устройство). Напряжение в данной шине может быть либо 5V либо 3.3V. Данная технология была разработана компанией Philips еще в 80-х годах, но активно применяется и по сей день. У неё есть очень много плюсов (простота, понятность и т. д.), но и есть много минусов, о которых мы возможно поговорим более детально в расширенном курсе (Уровень 2). Кроме данной шины активно применяются в бытовой технике еще и SPI

f1ac581fbf163b86481006534076c36920210327101802.jpg

6.1. Программаторы

Эти устройства необходимы на заключительном этапе разработки систем, когда требуется записать отлаженную программу в ПЗУ, которое входит в состав микроконтроллера или реализуется в виде отдельного модуля. Выпускается два вида программаторов:

1) специализированные программаторные платы;

2) универсальные программаторы.

Программаторные платы предназначены для программирования одного типа микро- контроллеров или микросхем ПЗУ, которые включаются в имеющуюся на плате панельку. Платы подключаются к последовательному порту управляющего персонального компьюте- ра, с помощью которого выполняется программирование данные вводятся с клавиатуры компьютера отображаются на его экране и после редактирования загружаются в буферную память. Затем содержимое этой памяти переписывается в программируемое ПЗУ с помощью размещенных на плате формирователей сигналов требуемой мощности и длительности. После программирования выполняется верификация путем считывания и сравнения содержимого ПЗУ и буферной памяти. При выявлении несовпадений производится повторное программирование соответствующих ячеек.

Некоторые типы программаторных плат работают без управляющего компьютера. Они используют размещенный на ллате резидентный контроллер со служебным ПЗУ, где со- держится управляющая программа. Вместо буферного ОЗУ на плате располагается панелька для включения микросхемы памяти (ОЗУ или ЭСППЗУ), в которую предварительно

записывается требуемое содержимое ПЗУ. Под управлением контроллера производится перезапись этого содержимого в программируемое ПЗУ, верификация результата и, при необходимости, повторное программирование.

Недорогие программаторные платы (их стоимость менее 100 дол.) М68НС05РGMR, М68НС7О5ххPGMR выпускаются фирмой » Motorola » для семейства М68НС705,

М68НС11SPGMR,М68НС711xxPGMR —для семейства М68НС711. Программаторные платы производятся для этих семейств таюке фирмой «Nash Electronics» (Model N680-4, N705-2, N805-2, NHС11) и рядом других.

Недостатком этих плат является их специализация на программирование одной или нескольких однотипных моделей микроконтроллеров или микросхем памяти. При исполь- зовании большой номенклатуры таких изделий целесообразно применять универсальные программаторы, которые выпускаются рядом зарубежных и российских производителей.

Универсальные проерамматоры работают под управлением компьютера и имеют два варианта конструктивной реализации:

1) в виде платы расширения, размещаемой внутри управляющего компьютера, с которой соединяется внешний коммутационный блок, имеющий панельки для включения про- граммируемых изделий (микроконтроллеров или микросхем ПЗУ);

2) в виде отдельного устройства, имеющего на корпусе панельки для включения про- граммируемых изделий, которое подключается к последовательному или параллельному порту компьютера.

В качестве примера зарубежных приборов этого типа можно привести программаторы

Model 3000, Model 5000 фирмы «Elan System», которые моiуг программировать всю номенк- латуру семейств. Эти устройства необходимы на заключительном этапе разработки систем, когда требуется записать отлаженную программу в ПЗУ, которое входит в состав микроконт- роллера или реализуется в виде отдельного модуля. Выпускается два вида программаторов:

1) специализированные программаторные платы; 2) универсальные программаторы.

Начинаем программировать

Программировать AVR контроллеры можно как на ассемблере (AVR assembler), так и на Си. Тут, думаю, каждый должен сделать свой выбор сам в зависимости от конкретной задачи и своих предпочтений. Лично я в первую очередь начал ковырять ассемблер. При программировании на ассемблере архитектура устройства становится понятнее и появляется ощущение, что копаешься непосредственно во внутренностях контроллера. К тому же полагаю, что в особенно критических по размеру и производительности программах знание ассемблера может очень пригодиться. После ознакомления с AVR ассемблером я переполз на Си.

После знакомства с архитектурой и основными принципами, решил собрать что-то полезное и интересное. Тут мне помогла дочурка, она занимается шахматами и в один прекрасный вечер заявила, что хочет иметь часы-таймер для партий на время. БАЦ! Вот она — идея первого проекта! Можно было конечно заказать их на том же eBay, но захотелось сделать свои собственные часы, с блэк… эээ… с индикаторами и кнопочками. Сказано — сделано!

В качестве дисплея решено было использовать два 7-сегментных диодных индикатора. Для управления достаточно было 5 кнопок — “Игрок 1” , “Игрок 2” , “Сброс” , “Настройка” и “Пауза” . Ну и не забываем про звуковую индикацию окончания игры. Вроде все. На рисунке ниже представлена общая схема подключения микроконтроллера к индикаторам и кнопкам. Она понадобится нам при разборе исходного кода программы:

Разбор полета

Начнем, как и положено, с точки входа программы — функции main . На самом деле ничего примечательного в ней нет — настройка портов, инициализация данных и бесконечный цикл обработки нажатий кнопок. Ну и вызов sei() — разрешение обработки прерываний, о них немного позже.

int main(void) < init_io(); init_data(); sound_off(); sei(); while(1) < handle_buttons(); >return 0; >

Рассмотрим каждую функцию в отдельности.

void init_io() < // set output DDRB = 0xFF; DDRD = 0xFF; // set input DDRC = 0b11100000; // pull-up resistors PORTC |= 0b00011111; // timer interrupts TIMSK = (1<

Настройка портов ввода/вывода происходит очень просто — в регистр DDRx (где x — буква, обозначающая порт) записивается число, каждый бит которого означает, будет ли соответствующий пин устройством ввода (соответствует 0) либо вывода (соответствует 1). Таким образом, заслав в DDRB и DDRD число 0xFF, мы сделали B и D портами вывода. Соответственно, команда DDRC = 0b11100000; превращает первые 5 пинов порта C во входные пины, а оставшиеся — в выходные. Команда PORTC |= 0b00011111; включает внутренние подтягивающие резисторы на 5 входах контроллера. Согласно схеме, к этим входам подключены кнопки, которые при нажатии замкнут их на землю. Таким образом контроллер понимает, что кнопка нажата.

Далее следует настройка двух таймеров, Timer0 и Timer1. Первый мы используем для обновления индикаторов, а второй — для обратного отсчета времени, предварительно настроив его на срабатывание каждую секунду. Подробное описание всех констант и метода настройки таймера на определенноый интервал можно найти в документации к ATmega8.

Обработка прерываний

ISR (TIMER0_OVF_vect) < display(); if (_buzzer >0) < _buzzer—; if (_buzzer == 0) sound_off(); >> ISR(TIMER1_COMPA_vect) < if (ActiveTimer == 1 Timer1 >0) < Timer1—; if (Timer1 == 0) process_timeoff(); >if (ActiveTimer == 2 Timer2 > 0) < Timer2—; if (Timer2 == 0) process_timeoff(); >>

При срабатывании таймера управление передается соответствующему обработчику прерывания. В нашем случае это обработчик TIMER0_OVF_vect, который вызывает процедуру вывода времени на индикаторы, и TIMER1_COMPA_vect, который обрабатывает обратный отсчет.

Вывод на индикаторы

void display() < display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms(0.25); display_number((Timer1%60)%10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b10000000); _delay_ms(0.25); display_number((Timer2/60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; >void display_number(int number, int mask)

Функция display использует метод динамической индикации. Дело в том, что каждый отдельно взятый индикатор имеет 9 контактов (7 для управления сегментами, 1 для точки и 1 для питания). Для управления 4 цифрами понадобилось бы 36 контактов. Слишком расточительно. Поэтому вывод разрядов на индикатор с несколькими цифрами организован по следующему принципу:

Напряжение поочередно подается на каждый из общих контактов, что позволяет высветить на соответствующем индикаторе нужную цифру при помощи одних и тех же 8 управляющих контактов. При достаточно высокой частоте вывода это выглядит для глаза как статическая картинка. Именно поэтому все 8 питающих контактов обоих индикаторов на схеме подключены к 8 выходам порта D, а 16 управляющих сегментами контактов соединены попарно и подключены к 8 выходам порта B. Таким образом, функция display с задержкой в 0.25 мс попеременно выводит нужную цифру на каждый из индикаторов. Под конец отключаются все выходы, подающие напряжение на индикаторы (команда PORTD = 0; ). Если этого не сделать, то последняя выводимая цифра будет продолжать гореть до следующего вызова функции display, что приведет к ее более яркому свечению по сравнению с остальными.

Обработка нажатий

void handle_buttons() < handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); >void handle_button(int key) < int bit; switch (key) < case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT; break; case KEY_PAUSE: bit = PAUSE_BIT; break; case KEY_PLAYER1: bit = PLAYER1_BIT; break; case KEY_PLAYER2: bit = PLAYER2_BIT; break; default: return; >if (bit_is_clear(BUTTON_PIN, bit)) < if (_pressed == 0) < _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) < _pressed |= key; // key action switch (key) < case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; >sound_on(15); > > > else < _pressed >>

Эта функция по очереди опрашивает все 5 кнопок и обрабатывает нажатие, если таковое случилось. Нажатие регистрируется проверкой bit_is_clear(BUTTON_PIN, bit) , т.е. кнопка нажата в том случае, если соответствующий ей вход соединен с землей, что и произойдет, согласно схеме, при нажатии кнопки. Задержка длительностью DEBOUNCE_TIME и повторная проверка нужна во избежание множественных лишних срабатываний из-за дребезга контактов. Сохранение статуса нажатия в соответствующих битах переменной _pressed используется для исключения повторного срабатывания при длительном нажатии на кнопку.
Функции обработки нажатий достаточно тривиальны и полагаю, что в дополнительных комментариях не нуждаются.

Полный текст программы
#define F_CPU 4000000UL #include #include #include #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define KEY_SETUP 0b00000001 #define KEY_RESET 0b00000010 #define KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 volatile int ActiveTimer = 0; volatile int Timer1 = 0; volatile int Timer2 = 0; volatile int _buzzer = 0; volatile int _pressed = 0; // function declarations void init_io(); void init_data(); int number_mask(int num); void handle_buttons(); void handle_button(int key); void process_setup(); void process_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); void display(); void display_number(int mask, int number); void sound_on(int interval); void sound_off(); // interrupts ISR (TIMER0_OVF_vect) < display(); if (_buzzer >0) < _buzzer—; if (_buzzer == 0) sound_off(); >> ISR(TIMER1_COMPA_vect) < if (ActiveTimer == 1 Timer1 >0) < Timer1—; if (Timer1 == 0) process_timeoff(); >if (ActiveTimer == 2 Timer2 > 0) < Timer2—; if (Timer2 == 0) process_timeoff(); >> int main(void) < init_io(); init_data(); sound_off(); sei(); while(1) < handle_buttons(); >return 0; > void init_io() < // set output DDRB = 0xFF; DDRD = 0xFF; // set input DDRC = 0b11100000; // pull-up resistors PORTC |= 0b00011111; // timer interrupts TIMSK = (1<void init_data() < Timer1 = 0; Timer2 = 0; ActiveTimer = 0; >int number_mask(int num) < switch (num) < case 0 : return 0xC0; case 1 : return 0xF9; case 2 : return 0xA4; case 3 : return 0xB0; case 4 : return 0x99; case 5 : return 0x92; case 6 : return 0x82; case 7 : return 0xF8; case 8 : return 0x80; case 9 : return 0x90; >; return 0; > void process_setup() < Timer1 += 60; Timer2 += 60; // overflow check (5940 seconds == 99 minutes) if (Timer1 >5940 || Timer2 > 5940) < Timer1 = 0; Timer2 = 0; >> void process_reset() < init_data(); >void process_timeoff() < init_data(); sound_on(30); >void process_pause() < ActiveTimer = 0; >void process_player1() < ActiveTimer = 2; >void process_player2() < ActiveTimer = 1; >void handle_button(int key) < int bit; switch (key) < case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT; break; case KEY_PAUSE: bit = PAUSE_BIT; break; case KEY_PLAYER1: bit = PLAYER1_BIT; break; case KEY_PLAYER2: bit = PLAYER2_BIT; break; default: return; >if (bit_is_clear(BUTTON_PIN, bit)) < if (_pressed == 0) < _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) < _pressed |= key; // key action switch (key) < case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; >sound_on(15); > > > else < _pressed >> void handle_buttons() < handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); >void display() < display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms(0.25); display_number((Timer1%60)%10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b10000000); _delay_ms(0.25); display_number((Timer2/60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; >void display_number(int number, int mask) < PORTB = number_mask(number); PORTD = mask; >void sound_on(int interval) < _buzzer = interval; // put buzzer pin high PORTC |= 0b00100000; >void sound_off() < // put buzzer pin low PORTC >

Прототип был собран на макетной плате:

После тестирования прототипа пришло время все это добро разместить в корпусе, обеспечить питание и т.д.

Ниже показан окончательный вид устройства. Часы питаются от 9-вольтовой батарейки типа “Крона”. Потребление тока — 55 мА.

Потратив $20-25 на оборудование и пару вечеров на начальное ознакомление с архитектурой микроконтроллера и основными принципами работы, можно начать делать интересные DIY проекты. Статья посвящается тем, кто, как и я в свое время, думает, что начать программировать микроконтроллеры — это сложно, долго или дорого. Поверьте, начать намного проще, чем может показаться. Если есть интерес и желание — пробуйте, не пожалете!

Удачного всем программирования!

P.S. Ну и напоследок, небольшая видео-демонстрация прототипа:

AVR. Учебный курс. Трактат о программаторах

Что же представляет из себя это устройство?
В простейшем случае программатор это девайс который связывает микроконтроллер и компьютер, позволяя с компа залить файл прошивки в память контроллера. Также нужна прошивающая программа, которая по специальному протоколу загонит данные в микроконтроллер.

Программаторы бывают разные под разные семейства контроллеров существуют свои программаторы. Впрочем, бывают и универсальные. Более того, даже ту же простейшую AVR’ку можно прошить несколькими способами:

Внутрисхемное программирование (ISP)
Самый популярный способ прошивать современные контроллеры. Внутрисхемным данный метод называется потому, что микроконтроллер в этот момент находится в схеме целевого устройства — он может быть даже наглухо туда впаян. Для нужд программатора в этом случае выделяется несколько выводов контроллера (обычно 3..5 в зависимости от контроллера).

К этим выводам подключается прошивающий шнур программатора и происходит заливка прошивки. После чего шнур отключается и контроллер начинает работу.
У AVR прошивка заливается по интерфейсу SPI и для работы программатора нужно четыре линии и питание (достаточно только земли, чтобы уравнять потенциалы земель программатора и устройства):

  • MISO — данные идущие от контроллера (Master-Input/Slave-Output)
  • MOSI — данные идущие в контроллер (Master-Output/Slave-Input)
  • SCK — тактовые импульсы интерфейса SPI
  • RESET — сигналом на RESET программатор вводит контроллер в режим программирования
  • GND — земля

Сам же разъем внутрисхемного программирования представляет собой всего лишь несколько штырьков. Лишь бы на него было удобно надеть разъем. Конфигурация его может быть любой, как тебе удобней.
Однако все же есть один популярный стандарт:

Для внутрисхемной прошивки контроллеров AVR существует не один десяток разнообразных программаторов. Отличаются они в первую очередь по скорости работы и типу подключения к компьютеру (COM/LPT/USB). А также бывают безмозглыми или со своим управляющим контроллером.

Безмозглые программаторы, как правило, дешевые, очень простые в изготовлении и наладке. Но при этом обычно работают исключительно через архаичные COM или LPT порты. Которые найти в современном компьютере целая проблема. А еще требуют прямого доступа к портам, что уже в Windows XP может быть проблемой. Плюс бывает зависимость от тактовой частоты процессора компьютера.

Так что твой 3ГГЦ-овый десятиядерный монстр может пролететь, как фанера над Парижем.

Идеальный компьютер для работы с такими программаторами это какой-нибудь PIII-800Mhz с Windows98…XP.
Вот очень краткая подборка проверенных лично безмозглых программаторов:

  • Программатор Громова.
    Простейшая схема, работает через оболочку UniProf(удобнейшая вещь. ), но имеет ряд проблем. В частности тут COM порт используется нетрадиционно и на некоторых материнках может не заработать. А еще на быстрых компах часто не работает. Да, через адаптер USB-COM эта схема работать не будет. По причине извратности подхода 🙂
  • STK200
    Надежная и дубовая, как кувалда, схема. Работает через LPT порт. Поддерживается многими программами, например avrdude. Требует прямого доступа к порту со стороны операционной системы и наличие LPT порта.
  • FTBB-PROG.
    Очень надежный и быстрый программатор работающий через USB, причем безо всяких извратов. C драйверами под разные операционные системы. И мощной оболочкой avrdude. Недостаток один — содержит редкую и дорогую микросхему FTDI, да в таком мелком корпусе, что запаять ее без меткого глаза, твердой руки и большого опыта пайки весьма сложно. Шаг выводов около 0.3мм. Данный программатор встроен в демоплаты Pinboard

Программаторы с управляющим контроллером лишены многих проблем безмозглых. Они без особых проблем работают через USB. А если собраны на COM порт, то без извращенских методик работы с данными — как честный COM порт. Так что адаптеры COM-USB работают на ура. И детали подобрать можно покрупней, чтобы легче было паять. Но у этих программаторов есть другая проблема — для того чтобы сделать такой программатор нужен другой программатор, чтобы прошить ему управляющий контроллер. Проблема курицы и яйца. Широко получили распространение такие программаторы как:

Внутрисхемное программирование, несмотря на все его удобства, имеет ряд ограничений.
Микроконтроллер должен быть запущен, иначе он не сможет ответить на сигнал программатора. Поэтому если неправильно выставить биты конфигурации (FUSE), например, переключить на внешний кварцевый резонатор, а сам кварц не поставить. То контроллер не сможет запуститься и прошить его внутрисхемно будет уже нельзя. По крайней мере до тех пор пока МК не будет запущен.
Также в битах конфигурации можно отключить режим внутрисхемной прошивки или преваратить вывод RESET в обычный порт ввода-вывода (это справедливо для малых МК, у которых RESET совмещен с портом). Такое действо тоже обрубает программирование по ISP.

Параллельное высоковольтное программирование
Обычно применяется на поточном производстве при массовой (сотни штук) прошивке чипов в программаторе перед запайкой их в устройство.

Параллельное программирование во много раз быстрей последовательного (ISP), но требует подачи на RESET напряжения в 12 вольт. А также для параллельной зашивки требуется уже не 3 линии данных, а восемь + линии управления. Для программирования в этом режиме микроконтроллер вставляется в панельку программатора, а после прошивки переставляется в целевое устройство.

Для радиолюбительской практики он особо не нужен, т.к. ISP программатор решает 99% насущных задач, но тем не менее параллельный программатор может пригодиться. Например, если в результате ошибочных действий были неправильно выставлены FUSE биты и был отрублен режим ISP. Параллельному программатору на настройку FUSE плевать с высокой колокольни. Плюс некоторые старые модели микроконтроллеров могут прошиваться только высоковольтным программатором.
Из параллельных программаторов для AVR на ум приходит только:

  • HVProg от ElmChan
  • Paraprog
  • DerHammer

А также есть универсальные вроде TurboProg 6, BeeProg, ChipProg++, Fiton которые могут прошивать огромное количество разных микроконтроллеров, но и стоят неслабо. Тысяч по 10-15. Нужны в основном только ремонтникам, т.к. когда не знаешь что тебе завтра притащат на ремонт надо быть готовым ко всему.

Прошивка через JTAG
Вообще JTAG это отладочный интерфейс. Он позволяет пошагово выполнять твою программу прям в кристалле. Но с его помощью можно и программу прошить, или FUSE биты вставить. К сожалению JTAG доступен далеко не во всех микроконтроллерах, только в старших моделях в 40ногих микроконтроллерах. Начиная с Atmega16.

Компания AVR продает фирменный комплект JTAG ICEII для работы с микроконтроллерами по JTAG, но стоит он (как и любой профессиональный инструмент) недешево. Около 10-15тыр. Также есть первая модель JTAG ICE. Ее можно легко изготовить самому, а еще она встроена в мою демоплату Pinboard.

Прошивка через Bootloader
Многие микроконтроллеры AVR имеют режим самопрошивки. Т.е. в микроконтроллер изначально, любым указанным выше способом, зашивается спец программка — bootloader. Дальше для перешивки программатор не нужен. Достаточно выполнить сброс микроконтроллера и подать ему специальный сигнал. После чего он входит в режим программирования и через обычный последовательный интерфейс в него заливается прошивка. Подробней описано в статье посвященной бутлоадеру.
Достоинство этого метода еще и в том, что работая через бутлоадер очень сложно закосячить микроконтроллер настолько, что он не будет отвечать вообще. Т.к. настройки FUSE для бутлоадера недоступны.

Бутлоадер также прошит по умолчанию в главный контроллер демоплаты Pinboard чтобы облегчить и обезопасить первые шаги на пути освоения микроконтроллеров.

Pinboard II
Прошивка AVR с помощью демоплаты Pinboard II (для Pinboard 1.1 все похоже)

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

89 thoughts on “AVR. Учебный курс. Трактат о программаторах”

Stalker46 :

А что это делает в учебном курсе? чего не на главной странице?
Здарова, Артем, вот я и зашел, чего то не мог зайти долго…

DI HALT :

Я постепенно правлю и переписываю старые статьи, чтобы привести их в более стройный и завершенный вид.

Stalker46 :
А эта статья про что была?
DI HALT :

Эта ни про что. Она новая. Но ее явно тут не хватало. Если ты не заметил, я выбросил из учебного курса «шаг первый — программатор» Переименовав ее в «Программатор Громова» и вынес ее в Готовые устройства.

Stalker46 :

Да, заметил. Люблю изменения на этом сайте)))
Кстати, как сделать, чтобы мне на другое мыло пароль высылался, да и сообщение от сайта об оповещении, что, мол, «сообщение пришло, тебе ответили»)))?

DI HALT :
Напиши на почту какое тебе надо новое мыло и какой нужен пароль. я вручную поправлю.
TheZotant :

Привет всем, есть вопрос по всем этим программаторским делам.
Есть к примеру рабочий программатор AVR910 Protoss (он указан в статье).
Есть header плата с контроллером AT90CAN128 от фирмы OLIMEX. Так вот на ней кроме JTAG
разьема есть еще и резьем, который называется ICSP(In-Circut Serial Programming). Как
оказалось у этого рзьема немного другое подключение, а именно вместо стандартного ISP
подключения
Программатор Контроллер
VCC——————VCC
RES——————RESET
MISO—————-MISO
MOSI—————-MOSI
SCK——————SCK
GND——————GND
У него вот такое(ICSP подключение):
Программатор Контроллер
VCC——————VCC
RES——————RESET
MISO—————-TXDO
MOSI—————-RXDO
SCK——————SCK
GND——————GND
В инете не так много и нашел по ICSP,кроме того что это доработанная ISP. Так вот вопрос сможет ли программатор AVR910 Protoss или любой другой ISP программатор запрограммировать контроллер через разьем ICSP?
Буду благодарен за любые мысли по этому поводу. Спасибо.

DI HALT :

Все правильно. У Мега128 разьем программирования отличается по подключению от классического тем, что ноги идут не на выводы моси мисо на тхдо рхдо. Прошить сможешь.

всем привет. есть вопрос такой. работаю щас с 90S2313. пробовал на нем несколько программаторов: Громова, «пять проводков» и USB на FT232RL. USB-программатор никак не хочет с ним работать, при том, что с программатором Громова и «пятью проводками» работает на ура — и пишет и читает. avrdude.exe -p 2313 -c ftbb -P ft0 -U flash:w:2313.hex:a — это команда для avrdude. получаю: avrdude.exe: BitBang OK
avrdude.exe: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude.exe: drain OK ft245r: bitclk 230400 -> ft baud 115200
avrdude.exe: ft245r_program_enable: failed
avrdude.exe: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check. avrdude.exe done. Thank you. Даю команду с -F:
avrdude.exe -p 2313 -c ftbb -P ft0 -F -U flash:w:2313.hex:a Получаю avrdude.exe: BitBang OK
avrdude.exe: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude.exe: drain OK ft245r: bitclk 230400 -> ft baud 115200
avrdude.exe: ft245r_program_enable: failed
avrdude.exe: initialization failed, rc=-1
avrdude.exe: AVR device initialized and ready to accept instructions Reading |#######################################################| 100%
avrdude.exe: Device signature =0x000000
avrdude.exe: Invalid device signature
avrdude.exe: Expected signature for AT90S2313 is 1E 91 01
avrdude.exe: safemode: Verify error — unable to read fuse properly. Programmer may not be reliable. И Это при том, что я установил ключ -F, который должен отключать верификацию сигнатуры. И другие программаторы прекрасно работают с этим микроконтроллером. Добавлю, что он уже несколько раз был перепрограммирован, то есть не «с завода». У кого были такие проблемы и что с этим делать?

DI HALT :

Хм. А другие типы контроллеров шьет? Судя по логу у тебя дудка нашла программатор, но не смогла подключиться к контроллеру.

Удалось проверить седня еще один 2313. Такие же проблемы. А мегу16 вчера шил без проблем и читал тоже.
Но самое интересное, что другие то программаторы работают с этими 2313.

И интересно, почему ключ -F не отключает верификацию

мегу8 тоже шьет.
Видел в теме про USB-программатор у Antoniy тоже были проблемы с 2313. потом он купил новый 2313 и сразу же подключил его к USB-программатору и, судя по логу, он у него заработал, только он видимо при чтении формат выходного файла не указал. Так может быть дело в том, что мои 2313 уже залочены? и тогда вопрос: как их «разлочить»? ISP наверное не поможет.

Такой вопрос: «STK200
Надежная и дубовая, как кувалда, схема. Работает через LPT порт. Поддерживается многими программами, например avrdude. Требует прямого доступа к порту со стороны операционной системы и наличие LPT порта.» Прямой доступ к порту это какой режим LPT потра Normal, EEP или ECP?

ZPower :

не могу вкурить как правильно сделать,
ресет программатора напрямую запаивать на ресет контроллера: +———+
|tn2313 |
ISP_reset]———-[|reset |
+———+ или на резистор 10к, который подключен к ресету мк?
+———+
R 10k |tn2313 |
ISP_reset]———-[==]- [|reset |
+———+

DI HALT :
Напрямую, без резистора. А через резистор в 10к ресет подключается к +питания
SergeyB :

У меня сейчас 3 компа
1)коре i5 750 2.66 Ггц 4 ядра ,нет ни лпт ни ком
2)Атлон64 с частотой 2 Ггц
3)пеньтиум 2 400Мгц
Заработает ли какой либо програмаматор на первом компе?
особо интересует заработает ли STK200 или вариант Громова на атлоне
или мой единственный выход старый пентиум 2?

DI HALT :
Скорей да чем нет. Но точно сказать не могу, надо собрать и попробовать.
SergeyB :

т.е. скорее да чем нет это ответ на вопрос что stk200 или громов заработает на атлоне?
я соберу тогда громова для атлона и отпишусь сюда заработает или нет

Erfindhel :

Недавно собрал нечто похожее на классический stk200/300, на моём атлоне3500 с упоротой материнкой работает без проблем;)

Привет!
Поясни пожалуста: если я использую внутрисхемное программирование (ISP), то получается, что я отбираю 4 порта у МК? Если в схеме на этих ногах постоянно сидят входы или выходы логики, или просто светодиоды, то повлияет ли это на процесс прошивки? или повлияет ли процесс прошивки на перефирию (особенно если порт подключён к выходу логики)?

DI HALT :

Смотря как сделать. Выводы логики подключаются на этих выводах к МК через резисторы в 300ом. На работу логики этот резюк не повлияет. А выводы программатора подключаются к МК напрямую, до резюка на логику. Тогда логика не повлияет на прошивку. Но прошивка будет влиять на логику, ведь там уровни меняются. Поэтому логику, если это критично, на период прошивки надо выключать. Иначе она сойдет с ума и будет чудить во время прошивки. Или выключать исполнительное устройство, чтобы оно бед не наделало.

Выручай, комрад ДИ! Извиняй, если не в той теме пишу. Не получается завести мегу168 от внешнего тактового генератора. Уже не знаю, что не так делаю. Фузы CKSEL3..0 прошиты как «0000». Импульсы поступают на ногу XTAL1 меги с порта другого МК с частотой ок. 1 МГц. Есть ли какие-нибудь подводные камни во внешнем тактировании? Что я мог упустить? Заранее благодарен.

DI HALT :
По идее никаких подводных камней там нет. Разве что перепутал прямые фузы с инверсными 🙂

Шил через USBasp с граф. оболочкой. Галочки битов CKSEL3..0 были установлены. То есть, не перепутал. Ладно, спасибо за ответ. Буду проверять всё остальное.

Добрый день. Скажите пожалуйста, программатором можно воспользоваться для считывания ROM, EEPROM из МК? Какие программы нужны для этого? Что вообще нужно для того, чтобы после некоторого времени работы МК я смог подключить его к компу и считать EEPROM или ROM? Нужно ли в таком случае писать в МК код, срабатывающий по прерыванию и выдающий на MOSIMISO данные?
Заранее спасибо

DI HALT :

Пожалуй любым. Любой AVR программатор умеет читать и епром и флеш. Никакой софт для МК писать не нужно. Правда и флеш и епром могут быть заблокированы автором прошивки изнутри (95% всех коммерческих девайсов). Тодга ты обломаешься.

Спасибо, автором прошивки собираюсь быть я: думаю, пару месяцев эмулирования МК мне достаточно, пора переходить на железо. То есть, обычным ПониПрог или АВРДуде можно не только загружать, но и считывать информацию с контроллера? Ни разу не прошивал МК, и даже не видел, как это делают, поэтому такие вопросы.

dima11221122 :

Здравствуйте. Начал изучать микроконтроллеры. Хочу приобрести программатор из набора мастер-кит NM9211. В описании написано, что он предназначен для программирования микроконтроллеров серии AT89S/AT90S. Можно ли его использовать для ATmega-16, ATmega-8, и если нет, то какие посоветуете программаторы «из той же оперы»? Заранее благодарю.

DI HALT :
Если покупать, то лучше искать клон AVRISP2 он актуальней сейчас.
NiSkNAme :

Скажите пожалуйста если подключать ISP програматор к ATtiny 2313 то вывод sck програматора нужно подключать к USCK или XCK.

Re: ЧТО ТАКОЕ программатор и с чем его едят?

avr123.nm.ru » 24 сен 2009, 10:16

Дак «собери», а не «прошей». Наверняка с защитой. В напишите что за прибор, что делает и как, схему приложите.

  • Сайт
  • ICQ

Re: ЧТО ТАКОЕ программатор и с чем его едят?

Dizayner » 24 сен 2009, 20:54

Схема предназначенна для управления девайсами через USB-порт, вообщем из-за короткого замыкания во внешнем блоке, сгорела микросхема «IC-4 (ULN2803)» так же нессколько светоиндикаторов ! вообщем со схемой «IC-4 (ULN2803)» особых проблем не возникло, а вот на выходе «PIC16F871-I/P» по неизвестным пока причинам сигнала нету, т.е. не происходит инициализация между устройством и PC

Вложения PIC 16F 871-I/P

Оцените статью
TutShema
Добавить комментарий