Site Loader

Содержание

Параллельный программатор для микроконтроллеров AVR

Поводом для создания данного устройства послужило появление новых чипов AVR поддерживающих отладку по протоколу debugWIRE. Так как он не является протоколом программирования, то после смены исходного кода во время отладки и, естесственно, забыв отключить фуз DWEN — AVRStudio не может заново «подключиться» к отлаживаему кристаллу. Это значит, что фуз DWEN не может быть «сброшен» и, следовательно, отлаживаемый чип больше не может быть запрограммирован через SPI.

После «убийства» двух tiny2313 была написана программа для mega16, которая позволяла, подключившись к меге через житаг, в AVRStudio перепрограммировать фузы тини в параллельном режиме.

Правда это было несколько неудобно и была написана программа для PC, в которой была возможность программирования всех бит фузов для tiny2313.
Дальнейшим развитием стало введение возможности программирования, проверки и чтения Flash памяти, а также введена поддержка других МК.
Поддержка программирования EEPROM не вводилась в виду ненадобности. Вообще программа для МК должна быть написана таким образом, чтоб она сама устанавливала начальные значения EEPROM.

Самым очевидным недостатком данного устройства является то, что для сборки программатора AVR необходимо запрограммировать mega16. Однако такой подход имеет право на существование, т.к. даже Atmel предлагает для своего программатора AVRISP схему на своем же микроконтроллере.
Mega16, используемая в данном устройстве, может быть запрограммирована при помощи программатора AVReal и схемы FBPRG («6 проводков на LPT»). Или через интерфейс JTAG с помощью AVR miniICE

К сожалению COM порт компьютера не позволил реализовать «супербыстрое» программирование. Однако на глаз все равно оно проходит быстрее чем последовательное. DIP корпуса использованы исключительно потому, что автором при отладке используются именно они. Желающие могут сами переделать всю эту конструкцию под SMD.

Особенности:

  • Программирование AVR в параллельном режиме.
  • Возможность «безболезненно» программировать фузы DWEN и RSTDISBL
  • Возможность программирования фуза SPIEN

Поддерживаемые микроконтроллеры:
ATtiny 2313, ATmega32, ATmega16, ATmega8515, ATmega8535, ATmega8, ATmega48, ATmega88, ATmega168

Схема:

Схема проста и не имеет каких то особенностей.

  • На микросхеме DA1 собран стабилизатор напряжения +5V
  • На транзисторах VT1 и VT2 реализован конвертер TTL — RS232
  • Микросхема DD2 может быть применена с любым буквенным индексом
  • Разъем XS2 служит для подключения к COM порту компьютера
  • К разъему XS3 подключается программируемый микроконтроллер.
  • Разъем XS4 предназначался для внутрисхемной отладки и может быть исключен или же использован для программирования mega16 по интерфейсу JTAG
  • Питание устройства осуществляется от внешнего стабилизированного источника +12V

Mega16 должна быть запрограммирована файлом code.hex из прилагаемого архива.
Фузы mega16 должны быть запрограммированы следующим образом:

CKSEL = 1110
SUT = 00
В архиве также имеется схема в форматах PDF и PCAD2002, разведенная печатная плата для головного модуля устройства и адаптеров для различных видов МК.

Пример реализации:

Центральный модуль.

Плата адаптеров.

Работа с устройством

Перед началом работы необходимо вставить программируемый микроконтроллер в соответствующую панельку. Соединить центральный модуль устройства с платой адаптеров 20-ти проводным кабелем. Подать питание и запустить управляющую программу ParaPROG.exe

После старта управляющая программа имеет следующий вид:

Доступна только одна кнопка «Read Chip». При нажатии на эту кнопку программа ParaPROG осуществляет поиск программируемого микроконтроллера и пытается прочесть фузы и лок биты.

Если поиск устройства был неудачным программа выводит сообщение о неудачной попытке и остается в прежнем состоянии.

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

Значения фузов и лок битов выводятся в формате принятом Atmel. Т.е. 1 = бит не запрограммирован (соответсвует установленному флажку) и 0 = бит запрограммирован (соответсвует снятому флажку)

Кнопки выполняют следующие функции:

Read Chip
Нажатие на эту кнопку осуществляет синхронизацию управляющей программы и центрального модуля программатора, поиск программируемого микроконтроллера, читает сигнатуру, фузы и лок биты
Write Fuses
Запись фузов в соответсвии со значениями заданными флажками для фузов
Write Lock Bits
Запись лок битов соответсвии со значениями заданными флажками для фузов
Chip Erase
Стирает Flash память программируемого микроконтроллера и сброс лок битов
Write Flash
Программирование Flash памяти в соответсвии с файлом, имя которого задано в поле рядом с этой кнопкой
Verify Flash
Сравнение Flash памяти с содержимым файла, имя которого задано в поле рядом с кнопкой Write Flash
Read Flash
Считывание Flash памяти в файл, имя которого задано в поле рядом с этой кнопкой

Программа принимает для записи/сравнения, а также выходным для чтения Flash является файлы binary формата. Получить их можно при помощи утилиты hex2bin из прилагаемого архива.
Во время работы программой выводятся сообщения в строке состояния, диалоговых окнах помогающие пользователю сориентироваться в работе программы.

Замеченные и пока не устранненные ошибки:
Так как при постоянно поданном напряжении +12V на Reset программируемые МК довольно сильно грелись, алгоритм работы устройства был сменен на временное включение режима программирования и немедленное выключение его после выполнения действия. Вледсвие этого при работе с некоторыми МК (например мега48) происходит рассинхронизация управляющей программы и основного модуля программатора. Поэтому рекомендуется иногда нажимать кнопку «Read Chip» проводя этим повторную синхронизацию (желательно перед каждым новым действием)

Иногда имя выходного файла при операции «Read Flash» самопроизвольно меняется на имя «Reading Flash»

Новая версия управляющей программы 0.2.0.7

Добавлено:

  • Поддержка ATmega162.
  • Возможность добавления пользователем новых кристаллов. Поддержка различных процессоров вынесена в INI-файлы. Теперь для добавления нового процессора достаточно создать для него файл. В этом файле помимо всего прочего есть дефолтные значения для фузов (из даташита).
  • После считывания битов конфигурации с чипа для каждого байта отображается его HEX-представление (для более удобного переноса значений, например, в скрипт пакетной прошивки PonyProg).
  • Значения фузов, не соответствующие дефолтным, отображаются красным цветом.
  • Окошко ввода ком-порта и сохранение этой информации, а также путей к файлам BIN и HEX, в файл конфигурации.
  • Ручной выбор программируемого кристалла. Это полезно, когда у программируемого чипа испортились байты сигнатуры и обычным способом он не видится программатором (иногда бывает 🙂 ).
  • Автоматический запуск конвертера hex2bin при выборе для заливки во флэш файла типа HEX.
  • Исправлена ошибка самопроизвольного изменения имени выходного файла при операции «Read Flash».

Прошивка, управляющая программа, схема и печатные платы (436 Кб). Загрузок: 726
ParaPROG v 0.2.0.7 (217 Кб). Загрузок: 572

Автор статьи: Павел Сироткин и Олег Шепель E-mail: [email protected] [email protected]
Просмотров: 11968

Параллельный программатор / фьюз-бит доктор для контроллеров avr — radiohlam.ru

Введение

Получив из Китая очередную партию чипов ATtiny2313 для изготовления шлюзов UART-to-I2C/SPI/1W я, вдруг, обнаружил, что эти чипы совершенно невозможно прошить последовательным внутрисхемным (ICSP) программатором. Чипы при этом были в заводской упаковке и без следов пайки. Ранее я уже сталкивался с ситуациями, когда китайцы продавали новые рабочие чипы, но заранее прошитые под какие-либо устройства (например, — вот). Такие чипы прошивают нужной прошивкой прямо на заводе, но, видимо, время от времени случаются накладки, заказчик не забирает партию и чипы попадают в открытую продажу.

Ситуация в общем-то обычная, сложность же конкретно с контроллерами AVR заключается в том, что при сбросе определённых фьюзов, прошить контроллер становится возможно только параллельным программатором в режиме высоковольтного программирования (с использованием напряжения +12 Вольт). Схемы фьюз-докторов для AVR можно найти в интернете, однако минус всех этих схем заключается в полном отсутствии описания их работы. Выложена просто готовая прошивка, которую нужно залить в управляющий схемой контроллер, включить, нажать кнопку и будет вам счастье. Ни исходников, ни подробностей, вообще никаких объяснений.

Для меня, как для радиохламера, такой подход совершенно невозможен и невыносим, поэтому решено было разработать свой собственный программатор / фьюз-бит доктор для микроконтроллеров AVR, описать как он работает и выложить в открытый доступ не только прошивку, но и исходники программы для микроконтроллера с комментариями. Итак, поехали:

В любом даташите на микроконтроллеры AVR есть глава «Memory Programming». Если микроконтроллер поддерживает параллельное программирование (здесь и далее в этой статье под этим термином понимается заливка прошивки в микроконтроллер), то в этой главе есть раздел «Parallel Programming». В этом разделе, во-первых, описано какие сигналы и ноги используются при параллельном программировании, во-вторых, описаны используемые при этом команды и алгоритмы и, в третьих, приводятся диаграммы сигналов. В общем, — всё, что нужно для успеха операции.

Для начала разберёмся с сигналами. Сигналы используются следующие:

  • 8 сигналов для параллельного приёма/передачи байта данных DATA[7:0]. Сигналы передаются в обоих направлениях в зависимости от сигнала OE.
  • 9 служебных сигналов:
    • RDY/BSY — уровень на этой линии сигнализирует о готовности контроллера принимать новые команды. Данные передаются от контроллера к программатору
    • OE — служит для переключения линий данных на вход (высокий уровень) или на выход (низкий уровень)
    • WR — используется для старта выполнения каких-либо действий (стирание / запись …)
    • BS2, BS1 — эти две линии используются для выбора старших или младших байт
    • XA1, XA0 — по уровням на этих двух линиях определяется какое действие будет выполняться по наличию тактового импульса
    • PAGEL — используется при программировании Flash/EEPROM
    • XTAL1 — используется для подачи тактовых импульсов

Кроме этого нам потребуется напряжение +12 Вольт (для перехода в режим программирования), +5 Вольт — для питания контроллера, ну и естественно нужно будет подключить нулевой провод, относительно которого задаются +12 и +5 Вольт, к ноге GND.

В некоторых контроллерах какие-то сигналы могут быть объединены (например, в ATtiny2313 объединены ноги BS1 и PAGEL, а также XA1 и BS2), кроме того, могут отличаться номера ног, на которые заводятся эти сигналы (например, в ATmega8 для данных используются два младших бита порта C и 5 младших бит порта B, а в ATtiny2313 для данных используется только порт B целиком).

С алгоритмами тоже всё оказалось довольно просто, — вся задача сводится к выставлению нужных уровней на некоторые служебные линии (XA1, XA0, BS2, BS1, OE) и линии данных, а также к генерированию положительных или отрицательных импульсов на других служебных линиях (XTAL1, WR, PAGEL). Плюс нужно управлять питанием +5 Вольт (+1 линия) и напряжением +12 Вольт (ещё +1 линия). Управление всеми нужными линиями решено было сделать командами через UART (для этого нужно ещё 2 линии).

Исходя из всего выше описанного, для реализаци устройства нужно иметь 21 линию I/O (8 — данные + 9 — служебные сигналы + 2 — управление линиями +5 и +12 Вольт + 2 — uart), что, согласитесь, довольно много. Чтобы ног на всё хватило, в качестве управляющего контроллера была выбрана ATmega8 (для прототипа, естественно, в dip-корпусе), — у неё 23 линии I/O.

Аппаратная часть

Схема:

Справа на схеме нарисовано как подключать к ней микроконтроллеры ATtiny2313.

Печатная плата (DipTrace 3.2)

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

  • разводка выполнена для одностороннего текстолита (не нужно совмещать разные стороны при переносе рисунка на плату)
  • использован контроллер в dip-корпусе (возможность установки в кроватку + большие расстояния между ножками обеспечивают лёгкость пайки)
  • все нужные контакты выведены на линейки с большим шагом (2,54 мм)
  • есть разъём для внутрисхемного программирования управляющего контроллера (для отладки очень удобно прошивать контроллер прямо на плате, не вынимая из кроватки)

При разводке платы я также предусмотрел установку конденсаторов по линиям питания +5 и +12 Вольт (прямо рядом с разъёмом питания). Эти конденсаторы на схеме не нарисованы, но я решил их на всякий случай поставить. Большого тока схема не потребляет, поэтому будет достаточно конденсаторов на 10-47 мкФ, рассчитанных на максимальное напряжение 16-25 Вольт и выше.

После сборки устройство выглядит вот так:

Программная часть

В соответствии с приведёнными в даташитах алгоритмами и диаграммами наш программатор должен уметь делать следующие вещи:

  • переходить в режим программирования
  • устанавливать и считывать уровни на линиях DATA[7:0]
  • выставлять правильные уровни на линиях XA1, XA0, BS2, BS1, OE
  • генерировать импульсы заданной ширины на линиях WR, XTAL1, PAG

Учитывая, что переходить в режим программирования нужно из какого-то начального состояния, а также то, что линия PAG может быть совмещена с BS1, — для реализации заявленного выше функционала нам хватит всего 11-дцати UART-команд, которые я просто пронумеровал от 0x1 до 0xB:

  • 0x01 — установить все используемые для программирования выводы (включая выводы, управляющие линиями +5 и +12 вольт) в начальное состояние
  • 0x02 — выполнить алгоритм перехода в режим программирования
  • 0x03 — выполнить алгоритм выхода из режима программирования
  • 0x04 — установить нужное состояние на линиях XA1/XA0 и BS2/BS1
  • 0x05 — установить нужное состояние на линии OE
  • 0x06 — сформировать положительный импульс на линии BS1
  • 0x07 — сформировать положительный импульс на линии PAG
  • 0x08 — сформировать положительный импульс на линии XTAL1
  • 0x09 — сформировать отрицательный импульс на линии WR
  • 0x0A — установить нужные уровни на линиях Data[7:0]
  • 0x0B — прочитать состояния линий Data[7:0]

Теперь некоторые моменты обсудим более детально:

Во-первых. В даташитах написано, что перед переходом в режим программирования нужно установить сигналы XA1, XA0, BS1 и WR (они называются Prog_enable) в ‘0000’. Поскольку сигнал на линии WR инвертирован (active low) и далее на всех диаграммах он начинается с высокого уровня, то логично было бы предположить, что его начальное состояние — это высокий уровень (именно он для него означает 0). На деле оказалось, что это работает только после подачи питания, а до подачи питания для всех ног 0 — это низкий уровень, и перед переходом в режим программирования все ноги, входящие в группу Prog_enable должны быть притянуты к низкому уровню.

Сам алгоритм перехода в режим программирования банален, — после того, как все линии Prog_enable притянуты к низкому уровню — нужно включить питание +5 Вольт и далее через 20-60 мкс включить напряжение +12 Вольт. Через 10 мкс после этого можно начинать переключать линии Prog_enable, а через 300 мкс — загружать каманды.

Выйти из режима программирования можно отключив от программируемого чипа +12 Вольт или +5 Вольт (или оба сразу).

Далее. Как можно заметить, для выполнения некоторых команд из приведённого выше списка нужны дополнительные данные. Например, команда «установить нужное состояние на линии OE» не позволяет сделать никаких выводов о том, что это за нужное состояние. Для таких команд мы будем устанавливать специальные флаги, которые будут означать, что следующий принимаемый по UART байт — это не новая команда, а те самые данные о «нужных состояниях» линий (состояния линий будут соответствовать определённым битам полученного байта).

Ну и, наконец, чтобы как-то сообщить компьютеру о том, что предыдущий принятый байт обработан и можно посылать следующий — будем отсылать обратно на компьютер 0x00 в случае успешной обработки очередного принятого байта или 0xFF в случае его неуспешной обработки. Вот, собственно, и вся концепция.

Исходя из всего вышеописанного получилась следующая программа:

Программа для микроконтроллера, ассемблер

;-- radiohlam.ru --
.device   ATmega8
.include  "m8def.inc"
.list
;-- по-умолчанию фьюзы CSEL = 0001 (1 МГц), нужно поставить CSEL = 0100 (8 МГц)
;-- определяем свои переменные (и раздаём под них регистры)
.def	w=r16          ; аккумулятор (обменник)
.def	wait_flags=r17 ; флаги ожидания данных (0 - XA1/XA0/BS2/BS1, 1 - OE, 2 - Data)
.def	fd_reg=r19     ; счётчик для организации быстрых (маленьких) задержек (шаг 1 мкс)
.def	ld_reg=r20     ; счётчик для организации медленных (больших) задержек (шаг 200 мкс)
.def	w2=r21         ; ещё одна переменная для временного хранения всякой фигни
;-- определяем названия выводов и портов
.equ	Data_Out = 0x18 ; порт B - вывод данных (линии данных на выход)
.equ	Data_In  = 0x16 ; порт B - ввод данных (линии данных на вход)
 
.equ	RDY = 0         ; PC0
.equ	BS1 = 1         ; PC1
.equ	BS2 = 2         ; PC2
.equ	XA0 = 3         ; PC3
.equ	XA1 = 4         ; PC4
.equ	PAG = 5         ; PC5
 
.equ	OE      = 2     ; PD2
.equ	XTAL1   = 3     ; PD3
.equ	WR      = 4     ; PD4
.equ	Ctrl_12 = 6     ; PD6
.equ	Ctrl_5  = 7     ; PD7
 
.equ	RxD = 0         ; PD0
.equ	TxD = 1         ; PD1
 
.equ MinCommandNumber = 0x1 ; минимальный номер команды
.equ MaxCommandNumber = 0xB ; максимальный номер команды
;------------------------------------------
;-- начало программного кода
	.cseg
	.org 0
	rjmp	Init   ; переход на начало программы (вектор сброса)
;-- дальше идут вектора прерываний
;-- если не используем - reti, иначе - переход на начало обработчика
	reti           ; внешнее прерывание INT0
	reti           ; внешнее прерывание INT1
	reti           ; Timer2 COMP
	reti           ; Timer2 OVF
	reti           ; Timer1 CAPT
	reti           ; Timer1 COMPA
	reti           ; Timer1 COMPB
	reti           ; Timer1 OVF
	reti           ; Timer0 OVF
	reti           ; SPI, STC
	rjmp	RX_INT ; USART, Rx complete
	reti           ; USART, DataRegister Empty
	reti           ; USART, Tx complete
	reti           ; ADC conversion complete
	reti           ; EEPROM ready
	reti           ; Analog comparator
	reti           ; TWI (two-wire serial interface)
	reti           ; Store Program Memory Ready
;-- начало программы
Init:	;-- устанавливаем указатель вершины стека на старший байт RAM
	ldi w,Low(RAMEND)
	out SPL,w            ; младший байт адреса
	ldi w,High(RAMEND)
	out SPH,w            ; старший байт адреса
	;-- отключаем лишнее
	sbi ACSR,ACD         ; выключаем компаратор
	;-- инициализируем порты
	;-- DDR - направление работы (0 - вход, 1 - выход)
	;-- PORT - состояние защёлок / подтяжек (0 - низкий уровень / нет подтяжки, 1 - высокий уровень / есть подтяжка)
	;-- настраиваем PORTD (состояние - все, кроме PD2(OE), PD4(WR), PD7(+5) - нули, направление - все на выход)
	ldi w,0b10000000
	out PORTD,w
	ldi w,0b11111111
	out DDRD,w
	;-- настраиваем PORTC (состояние - все нули, направление - все на выход, кроме PC0(RDY))
	clr w
	out PORTC,w
	ldi w, 0b11111110
	out DDRC,w
	;-- настраиваем PORTB (состояние - все нули, направление - все на выход)
	clr w
	out PORTB,w
	ser w
	out DDRB,w
	;-- инициализируем UART
	clr w
	out UBRRH,w                    ; UBRR (для кварца 8 МГц и скорости 38400)
	ldi w,12                       ; равен 12, т.е. UBRRH = 0, UBRRL = 12
	out UBRRL,w
	ldi w,0b10001110               ; поднимаем биты USBS, UCSZ1:0 + старший бит (URSEL) должен быть 1 при записи в UCSRC
                                       ; в примере из оф.доки на мегу - косяк, они просто скопировали пример из 2313
                                       ; (в 2313 старший бит был не важен)
	out UCSRC,w                    ; формат: 1 старт, 8 данные, 2 стоп
	ldi w, (1<<RXEN)|(1<<TXEN)
	out UCSRB,w                    ; включить приёмник и передатчик
	;-- сбросить флаги и счётчики
	clr wait_flags
	clr fd_reg
	clr ld_reg
	;-- разрешаем прерывание от приёмника
	sbi UCSRB,RXCIE                ; включить прерывания от приёмника
	;-- сообщаем компу, что загрузились и ждём команду
	ldi w,0x0
	out UDR,w
	;-- разрешаем глобальные прерывания
	sei
	;-- ждём у моря погоды ---
Wait_data:
	rjmp Wait_data
;------------------------------------------
;-- процедуры задержки
Fast_Delay:
	nop
	nop
	nop
	nop
	nop
	dec  fd_reg          ; уменьшаем счётчик
	brne Fast_Delay      ; если счётчик не ноль следующий цикл
	ret                  ; если отсчитали нужную задержку - выходим
Low_Delay:
	ldi fd_reg,200       ; задержка 200 мкс
	rcall Fast_Delay
	dec ld_reg           ; уменьшаем счётчик
	brne Low_Delay       ; если счётчик не ноль следующий цикл
	ret                  ; если отсчитали нужную задержку - выходим
;------------------------------------------
;--- Обработчик прерывания от приёмника ---
RX_INT:
	in   w,UDR           ; читаем байт из приёмника в w
	;-- если хотябы 1 флаг поднят, то мы приняли данные, а не команду
	tst wait_flags       ; проверяем на ноль регистр флагов
	breq CommandHandle
	;-- если приняты данные, а не команды, то работаем по флагам
DataHandle:
TestFlag0:
	sbrs wait_flags,0    ; пропустить следующую команду, если установлен флаг 0
	rjmp TestFlag1
	;-- установить XA1/XA0/BS2/BS1 = биты [3:0] полученного по UART байта
	in  w2,PORTC         ; читаем текущие установленные значения выходов
	ori w2,0b00011110    ; поднимаем значения нужных битов ([4:1])
	sbrs w,0             ; если 0-й бит в принятом байте установлен - пропустить следующую команду
	andi w2,0b11111101   ; сбрасываем 1-й бит
	sbrs w,1             ; если 1-й бит в принятом байте установлен - пропустить следующую команду
	andi w2,0b11111011   ; сбрасываем 2-й бит
	sbrs w,2             ; если 2-й бит в принятом байте установлен - пропустить следующую команду
	andi w2,0b11110111   ; сбрасываем 3-й бит
	sbrs w,3             ; если 3-й бит в принятом байте установлен - пропустить следующую команду
	andi w2,0b11101111   ; сбрасываем 4-й бит
	out PORTC,w2         ; устанавливаем выходы в нужные значения
	rjmp ClearFlags 
TestFlag1:
	sbrs wait_flags,1    ; пропустить следующую команду, если установлен флаг 1
	rjmp TestFlag2
	;-- установить OE = бит [0] полученного по UART байта
	sbrc w,0             ; если 0-й бит в принятом байте сброшен - пропустить следующую команду
	rjmp SetDataOutput
SetDataInput:
	ser w
	out PORTB,w          ; устанавливаем подтяжки
	clr w
	out DDRB,w           ; переключаем порт на вход
	cbi PORTD, OE        ; сбрасываем OE (переключаем ноги микрухи на выход)
	rjmp ClearFlags
SetDataOutput:
	sbi PORTD, OE        ; поднимаем OE (переключаем ноги микрухи на вход)
	clr w
	out PORTB,w          ; обнуляем выходы
	ser w
	out DDRB,w           ; переключаем порт на выход
	rjmp ClearFlags
TestFlag2:
	sbrs wait_flags,2    ; пропустить следующую команду, если установлен флаг 2
	rjmp ClearFlags
	;-- установить Data = биты [7:0] полученного по UART байта
	out Data_Out,w
	;rjmp ClearFlags     ; этот обработчик флагов последний, так что эта команда не нужна
ClearFlags:
	clr wait_flags       ; сбрасываем флаги
	rjmp Send_Ok
	;-- если это не данные, а команды, то работаем с блоком переходов к обработчикам команд
CommandHandle:
	cpi  w,MinCommandNumber     ; сравниваем полученный байт с минимальным номером команды
	brlo Error_Command          ; номер команды меньше минимального - ошибка
	cpi  w,MaxCommandNumber + 1 ; сравниваем полученный байт с максимальным номером команды + 1
	brsh Error_Command          ; номер команды больше или равен максимальному +1
	subi w,MinCommandNumber     ; приводим ряд к начинающемуся с нуля
	rcall StartCommandCase      ; получаем в стек адрес следующей метки
StartCommandCase:
	pop  ZH                     ; извлекаем адрес из стека
	pop  ZL
	adiw ZL,7                   ; вычисляем начальный адрес блока переходов (он сдвинут на 7 от метки)
	add  ZL,w                   ; добавляем адрес команды в блоке переходов
	brcc NoCarry                ; пропускаем следующую команду, если не установился флаг переноса
	inc  ZH
NoCarry:
	ijmp                        ; переходим по вычисленному адресу в блок переходов
	;-- ниже расположен сам блок переходов
	rjmp SetInitState           ; 0x1 - установить выходы в начальное состояние
	rjmp EnterPM                ; 0x2 - переход в режим программирования
	rjmp ExitPM                 ; 0x3 - выход из режима программирования
	rjmp SetXABS                ; 0x4 - установить XA1/XA0/BS2/BS1
	rjmp SetOE                  ; 0x5 - установить OE
	rjmp GiveBS1PP              ; 0x6 - сформировать положительный импульс на BS1
	rjmp GivePagelPP            ; 0x7 - сформировать положительный импульс на Pagel
	rjmp GiveXTAL1PP            ; 0x8 - сформировать положительный импульс на XTAL1
	rjmp GiveWRNP               ; 0x9 - сформировать отрицательный импульс на WR
	rjmp SetData                ; 0xA - установить Data[7:0]
	rjmp ReadData               ; 0xB - прочитать Data[7:0]
	;-- конец блока переходов
Error_Command:
	ldi  w,0xFF                 ; сообщаем, что приняли неизвестную команду и выходим
	out  UDR,w
	reti
;--- Говорим компу, что всё сделали и ждём ещё команд
Send_Ok:
	;-- ждём, когда освободится буфер передатчика
	;-- здесь (и не только) по идее нужен ещё таймер для предотвращения зависания программы, в случае
	;-- если буфер не освобождается длительное время, но для тестовой версии сойдёт и так
	sbis UCSRA,UDRE
	rjmp Send_Ok
	ldi w,0x00                  ; отправляем признак готовности
	out UDR,w
	reti
;--- ОБРАБОТЧИКИ КОМАНД --------------------------
;--------------------------------------------------
;-- set initial state
;-- XA1 / XA0 / BS1 / WR = "0000", +5 = off, +12 = off
;-- (сигнал WR у нас инверсный по определению, Ctrl_5 инверсный по схемотехнике)
;-- XA1=0, XA0=0, BS1=0, WR=1, Ctrl_5=1, Ctrl_12=0
;-- RDY=0 (без подтяжки), BS2=0, PAG=0, OE=1, XTAL1=0
;-- DATA=0x0, все сигналы на выход, кроме RDY
SetInitState:
	;-- настраиваем PORTD (состояние - все, кроме PD2(OE), PD4(WR), PD7(+5) - нули, направление - все на выход)
	ldi w,0b10000000
	out PORTD,w
	ldi w,0b11111111
	out DDRD,w
	;-- настраиваем PORTC (состояние - все нули, направление - все на выход, кроме PC0(RDY))
	clr w
	out PORTC,w
	ldi w, 0b11111110
	out DDRC,w
	;-- настраиваем PORTB (состояние - все нули, направление - все на выход)
	clr w
	out PORTB,w
	ser w
	out DDRB,w
	rjmp Send_Ok        ; сообщаем о готовности
;-- enter program mode (включить +5В, минимум через 30 мкс включить +12В, минимум через 300 мкс можно подавать команды)
EnterPM:
	cbi PORTD, Ctrl_5   ; включаем +5 Вольт (PD7=0)
	ldi fd_reg,40       ; задержка 40 циклов (чуть больше 40 мкс)
	rcall Fast_Delay
	sbi PORTD, Ctrl_12  ; включаем +12 Вольт (PD6=1)
	ldi ld_reg,2        ; задержка 1 цикл (чуть больше 200 мкс)
	rcall Low_Delay
	sbi PORTD, OE       ; поднимаем OE
	sbi PORTD, WR       ; поднимаем WR
	ldi ld_reg,2        ; задержка 1 цикл (чуть больше 200 мкс)
	rcall Low_Delay
	rjmp Send_Ok        ; сообщаем о готовности
;-- exit program mode (выключить +12В, выключить +5В)
ExitPM:
	cbi PORTD, Ctrl_12  ; выключаем +12 Вольт (PD6=0)
	sbi PORTD, Ctrl_5   ; выключаем +5 Вольт (PD7=1)
	rjmp Send_Ok        ; сообщаем о готовности
;-- set XA1/XA0/BS2/BS1 (4 младших бита в следующем принятом байте)
SetXABS:
	sbr wait_flags,(1<<0) ; поднимаем 0-й флаг в регистре флагов (ожидание XA1/XA0/BS2/BS1)
	rjmp Send_Ok          ; сообщаем о готовности
;-- set OE line (младший бит в следующем принятом байте)
SetOE:	sbr wait_flags,(1<<1) ; поднимаем 2-й флаг в регистре флагов (ожидание OE)
	rjmp Send_Ok          ; сообщаем о готовности
;-- give BS1 positive pulse
GiveBS1PP:
	sbi PORTC, BS1        ; переключаем BS1 в 1
	ldi fd_reg,1          ; задержка 1 цикл (чуть больше 1 мкс)
	rcall Fast_Delay
	cbi PORTC, BS1        ; переключаем BS1 в 0
	rjmp Send_Ok          ; сообщаем о готовности
;-- give Pagel positive pulse
GivePagelPP:
	sbi PORTC, PAG        ; переключаем PAG в 1
	ldi fd_reg,1          ; задержка 1 цикл (чуть больше 1 мкс)
	rcall Fast_Delay
	cbi PORTC, PAG        ; переключаем PAG в 0
	rjmp Send_Ok          ; сообщаем о готовности
;-- give XTAL1 positive pulse
GiveXTAL1PP:
	sbi PORTD, XTAL1      ; переключаем XTAL1 в 1
	ldi fd_reg,1          ; задержка 1 цикл (чуть больше 1 мкс)
	rcall Fast_Delay
	cbi PORTD, XTAL1      ; переключаем XTAL1 в 0
	rjmp Send_Ok          ; сообщаем о готовности
;-- give WR negative pulse
GiveWRNP:
	cbi PORTD, WR         ; переключаем WR в 0
	ldi fd_reg,1          ; задержка 1 цикл (чуть больше 1 мкс)
	rcall Fast_Delay
	sbi PORTD, WR         ; переключаем WR в 1
	rjmp Send_Ok          ; сообщаем о готовности
;-- set Data[7:0]
SetData:
	sbr wait_flags,(1<<2) ; поднимаем 3-й флаг в регистре флагов (ожидание Data)
	rjmp Send_Ok          ; сообщаем о готовности
;-- read Data[7:0]
ReadData:
	in w,Data_In          ; читаем линии данных
	out UDR,w             ; отправляем в порт
	rjmp Send_Ok          ; сообщаем о готовности

;— radiohlam.ru — .device ATmega8 .include «m8def.inc» .list ;— по-умолчанию фьюзы CSEL = 0001 (1 МГц), нужно поставить CSEL = 0100 (8 МГц) ;— определяем свои переменные (и раздаём под них регистры) .def w=r16 ; аккумулятор (обменник) .def wait_flags=r17 ; флаги ожидания данных (0 — XA1/XA0/BS2/BS1, 1 — OE, 2 — Data) .def fd_reg=r19 ; счётчик для организации быстрых (маленьких) задержек (шаг 1 мкс) .def ld_reg=r20 ; счётчик для организации медленных (больших) задержек (шаг 200 мкс) .def w2=r21 ; ещё одна переменная для временного хранения всякой фигни ;— определяем названия выводов и портов .equ Data_Out = 0x18 ; порт B — вывод данных (линии данных на выход) .equ Data_In = 0x16 ; порт B — ввод данных (линии данных на вход) .equ RDY = 0 ; PC0 .equ BS1 = 1 ; PC1 .equ BS2 = 2 ; PC2 .equ XA0 = 3 ; PC3 .equ XA1 = 4 ; PC4 .equ PAG = 5 ; PC5 .equ OE = 2 ; PD2 .equ XTAL1 = 3 ; PD3 .equ WR = 4 ; PD4 .equ Ctrl_12 = 6 ; PD6 .equ Ctrl_5 = 7 ; PD7 .equ RxD = 0 ; PD0 .equ TxD = 1 ; PD1 .equ MinCommandNumber = 0x1 ; минимальный номер команды .equ MaxCommandNumber = 0xB ; максимальный номер команды ;—————————————— ;— начало программного кода .cseg .org 0 rjmp Init ; переход на начало программы (вектор сброса) ;— дальше идут вектора прерываний ;— если не используем — reti, иначе — переход на начало обработчика reti ; внешнее прерывание INT0 reti ; внешнее прерывание INT1 reti ; Timer2 COMP reti ; Timer2 OVF reti ; Timer1 CAPT reti ; Timer1 COMPA reti ; Timer1 COMPB reti ; Timer1 OVF reti ; Timer0 OVF reti ; SPI, STC rjmp RX_INT ; USART, Rx complete reti ; USART, DataRegister Empty reti ; USART, Tx complete reti ; ADC conversion complete reti ; EEPROM ready reti ; Analog comparator reti ; TWI (two-wire serial interface) reti ; Store Program Memory Ready ;— начало программы Init: ;— устанавливаем указатель вершины стека на старший байт RAM ldi w,Low(RAMEND) out SPL,w ; младший байт адреса ldi w,High(RAMEND) out SPH,w ; старший байт адреса ;— отключаем лишнее sbi ACSR,ACD ; выключаем компаратор ;— инициализируем порты ;— DDR — направление работы (0 — вход, 1 — выход) ;— PORT — состояние защёлок / подтяжек (0 — низкий уровень / нет подтяжки, 1 — высокий уровень / есть подтяжка) ;— настраиваем PORTD (состояние — все, кроме PD2(OE), PD4(WR), PD7(+5) — нули, направление — все на выход) ldi w,0b10000000 out PORTD,w ldi w,0b11111111 out DDRD,w ;— настраиваем PORTC (состояние — все нули, направление — все на выход, кроме PC0(RDY)) clr w out PORTC,w ldi w, 0b11111110 out DDRC,w ;— настраиваем PORTB (состояние — все нули, направление — все на выход) clr w out PORTB,w ser w out DDRB,w ;— инициализируем UART clr w out UBRRH,w ; UBRR (для кварца 8 МГц и скорости 38400) ldi w,12 ; равен 12, т.е. UBRRH = 0, UBRRL = 12 out UBRRL,w ldi w,0b10001110 ; поднимаем биты USBS, UCSZ1:0 + старший бит (URSEL) должен быть 1 при записи в UCSRC ; в примере из оф.доки на мегу — косяк, они просто скопировали пример из 2313 ; (в 2313 старший бит был не важен) out UCSRC,w ; формат: 1 старт, 8 данные, 2 стоп ldi w, (1<<RXEN)|(1<<TXEN) out UCSRB,w ; включить приёмник и передатчик ;— сбросить флаги и счётчики clr wait_flags clr fd_reg clr ld_reg ;— разрешаем прерывание от приёмника sbi UCSRB,RXCIE ; включить прерывания от приёмника ;— сообщаем компу, что загрузились и ждём команду ldi w,0x0 out UDR,w ;— разрешаем глобальные прерывания sei ;— ждём у моря погоды — Wait_data: rjmp Wait_data ;—————————————— ;— процедуры задержки Fast_Delay: nop nop nop nop nop dec fd_reg ; уменьшаем счётчик brne Fast_Delay ; если счётчик не ноль следующий цикл ret ; если отсчитали нужную задержку — выходим Low_Delay: ldi fd_reg,200 ; задержка 200 мкс rcall Fast_Delay dec ld_reg ; уменьшаем счётчик brne Low_Delay ; если счётчик не ноль следующий цикл ret ; если отсчитали нужную задержку — выходим ;—————————————— ;— Обработчик прерывания от приёмника — RX_INT: in w,UDR ; читаем байт из приёмника в w ;— если хотябы 1 флаг поднят, то мы приняли данные, а не команду tst wait_flags ; проверяем на ноль регистр флагов breq CommandHandle ;— если приняты данные, а не команды, то работаем по флагам DataHandle: TestFlag0: sbrs wait_flags,0 ; пропустить следующую команду, если установлен флаг 0 rjmp TestFlag1 ;— установить XA1/XA0/BS2/BS1 = биты [3:0] полученного по UART байта in w2,PORTC ; читаем текущие установленные значения выходов ori w2,0b00011110 ; поднимаем значения нужных битов ([4:1]) sbrs w,0 ; если 0-й бит в принятом байте установлен — пропустить следующую команду andi w2,0b11111101 ; сбрасываем 1-й бит sbrs w,1 ; если 1-й бит в принятом байте установлен — пропустить следующую команду andi w2,0b11111011 ; сбрасываем 2-й бит sbrs w,2 ; если 2-й бит в принятом байте установлен — пропустить следующую команду andi w2,0b11110111 ; сбрасываем 3-й бит sbrs w,3 ; если 3-й бит в принятом байте установлен — пропустить следующую команду andi w2,0b11101111 ; сбрасываем 4-й бит out PORTC,w2 ; устанавливаем выходы в нужные значения rjmp ClearFlags TestFlag1: sbrs wait_flags,1 ; пропустить следующую команду, если установлен флаг 1 rjmp TestFlag2 ;— установить OE = бит [0] полученного по UART байта sbrc w,0 ; если 0-й бит в принятом байте сброшен — пропустить следующую команду rjmp SetDataOutput SetDataInput: ser w out PORTB,w ; устанавливаем подтяжки clr w out DDRB,w ; переключаем порт на вход cbi PORTD, OE ; сбрасываем OE (переключаем ноги микрухи на выход) rjmp ClearFlags SetDataOutput: sbi PORTD, OE ; поднимаем OE (переключаем ноги микрухи на вход) clr w out PORTB,w ; обнуляем выходы ser w out DDRB,w ; переключаем порт на выход rjmp ClearFlags TestFlag2: sbrs wait_flags,2 ; пропустить следующую команду, если установлен флаг 2 rjmp ClearFlags ;— установить Data = биты [7:0] полученного по UART байта out Data_Out,w ;rjmp ClearFlags ; этот обработчик флагов последний, так что эта команда не нужна ClearFlags: clr wait_flags ; сбрасываем флаги rjmp Send_Ok ;— если это не данные, а команды, то работаем с блоком переходов к обработчикам команд CommandHandle: cpi w,MinCommandNumber ; сравниваем полученный байт с минимальным номером команды brlo Error_Command ; номер команды меньше минимального — ошибка cpi w,MaxCommandNumber + 1 ; сравниваем полученный байт с максимальным номером команды + 1 brsh Error_Command ; номер команды больше или равен максимальному +1 subi w,MinCommandNumber ; приводим ряд к начинающемуся с нуля rcall StartCommandCase ; получаем в стек адрес следующей метки StartCommandCase: pop ZH ; извлекаем адрес из стека pop ZL adiw ZL,7 ; вычисляем начальный адрес блока переходов (он сдвинут на 7 от метки) add ZL,w ; добавляем адрес команды в блоке переходов brcc NoCarry ; пропускаем следующую команду, если не установился флаг переноса inc ZH NoCarry: ijmp ; переходим по вычисленному адресу в блок переходов ;— ниже расположен сам блок переходов rjmp SetInitState ; 0x1 — установить выходы в начальное состояние rjmp EnterPM ; 0x2 — переход в режим программирования rjmp ExitPM ; 0x3 — выход из режима программирования rjmp SetXABS ; 0x4 — установить XA1/XA0/BS2/BS1 rjmp SetOE ; 0x5 — установить OE rjmp GiveBS1PP ; 0x6 — сформировать положительный импульс на BS1 rjmp GivePagelPP ; 0x7 — сформировать положительный импульс на Pagel rjmp GiveXTAL1PP ; 0x8 — сформировать положительный импульс на XTAL1 rjmp GiveWRNP ; 0x9 — сформировать отрицательный импульс на WR rjmp SetData ; 0xA — установить Data[7:0] rjmp ReadData ; 0xB — прочитать Data[7:0] ;— конец блока переходов Error_Command: ldi w,0xFF ; сообщаем, что приняли неизвестную команду и выходим out UDR,w reti ;— Говорим компу, что всё сделали и ждём ещё команд Send_Ok: ;— ждём, когда освободится буфер передатчика ;— здесь (и не только) по идее нужен ещё таймер для предотвращения зависания программы, в случае ;— если буфер не освобождается длительное время, но для тестовой версии сойдёт и так sbis UCSRA,UDRE rjmp Send_Ok ldi w,0x00 ; отправляем признак готовности out UDR,w reti ;— ОБРАБОТЧИКИ КОМАНД ————————— ;————————————————— ;— set initial state ;— XA1 / XA0 / BS1 / WR = «0000», +5 = off, +12 = off ;— (сигнал WR у нас инверсный по определению, Ctrl_5 инверсный по схемотехнике) ;— XA1=0, XA0=0, BS1=0, WR=1, Ctrl_5=1, Ctrl_12=0 ;— RDY=0 (без подтяжки), BS2=0, PAG=0, OE=1, XTAL1=0 ;— DATA=0x0, все сигналы на выход, кроме RDY SetInitState: ;— настраиваем PORTD (состояние — все, кроме PD2(OE), PD4(WR), PD7(+5) — нули, направление — все на выход) ldi w,0b10000000 out PORTD,w ldi w,0b11111111 out DDRD,w ;— настраиваем PORTC (состояние — все нули, направление — все на выход, кроме PC0(RDY)) clr w out PORTC,w ldi w, 0b11111110 out DDRC,w ;— настраиваем PORTB (состояние — все нули, направление — все на выход) clr w out PORTB,w ser w out DDRB,w rjmp Send_Ok ; сообщаем о готовности ;— enter program mode (включить +5В, минимум через 30 мкс включить +12В, минимум через 300 мкс можно подавать команды) EnterPM: cbi PORTD, Ctrl_5 ; включаем +5 Вольт (PD7=0) ldi fd_reg,40 ; задержка 40 циклов (чуть больше 40 мкс) rcall Fast_Delay sbi PORTD, Ctrl_12 ; включаем +12 Вольт (PD6=1) ldi ld_reg,2 ; задержка 1 цикл (чуть больше 200 мкс) rcall Low_Delay sbi PORTD, OE ; поднимаем OE sbi PORTD, WR ; поднимаем WR ldi ld_reg,2 ; задержка 1 цикл (чуть больше 200 мкс) rcall Low_Delay rjmp Send_Ok ; сообщаем о готовности ;— exit program mode (выключить +12В, выключить +5В) ExitPM: cbi PORTD, Ctrl_12 ; выключаем +12 Вольт (PD6=0) sbi PORTD, Ctrl_5 ; выключаем +5 Вольт (PD7=1) rjmp Send_Ok ; сообщаем о готовности ;— set XA1/XA0/BS2/BS1 (4 младших бита в следующем принятом байте) SetXABS: sbr wait_flags,(1<<0) ; поднимаем 0-й флаг в регистре флагов (ожидание XA1/XA0/BS2/BS1) rjmp Send_Ok ; сообщаем о готовности ;— set OE line (младший бит в следующем принятом байте) SetOE: sbr wait_flags,(1<<1) ; поднимаем 2-й флаг в регистре флагов (ожидание OE) rjmp Send_Ok ; сообщаем о готовности ;— give BS1 positive pulse GiveBS1PP: sbi PORTC, BS1 ; переключаем BS1 в 1 ldi fd_reg,1 ; задержка 1 цикл (чуть больше 1 мкс) rcall Fast_Delay cbi PORTC, BS1 ; переключаем BS1 в 0 rjmp Send_Ok ; сообщаем о готовности ;— give Pagel positive pulse GivePagelPP: sbi PORTC, PAG ; переключаем PAG в 1 ldi fd_reg,1 ; задержка 1 цикл (чуть больше 1 мкс) rcall Fast_Delay cbi PORTC, PAG ; переключаем PAG в 0 rjmp Send_Ok ; сообщаем о готовности ;— give XTAL1 positive pulse GiveXTAL1PP: sbi PORTD, XTAL1 ; переключаем XTAL1 в 1 ldi fd_reg,1 ; задержка 1 цикл (чуть больше 1 мкс) rcall Fast_Delay cbi PORTD, XTAL1 ; переключаем XTAL1 в 0 rjmp Send_Ok ; сообщаем о готовности ;— give WR negative pulse GiveWRNP: cbi PORTD, WR ; переключаем WR в 0 ldi fd_reg,1 ; задержка 1 цикл (чуть больше 1 мкс) rcall Fast_Delay sbi PORTD, WR ; переключаем WR в 1 rjmp Send_Ok ; сообщаем о готовности ;— set Data[7:0] SetData: sbr wait_flags,(1<<2) ; поднимаем 3-й флаг в регистре флагов (ожидание Data) rjmp Send_Ok ; сообщаем о готовности ;— read Data[7:0] ReadData: in w,Data_In ; читаем линии данных out UDR,w ; отправляем в порт rjmp Send_Ok ; сообщаем о готовности

[свернуть]

Готовая прошивка (*.hex). Осталось только залить эту прошивку в управляющий микроконтроллер (как вы помните, это можно сделать прямо через расположенный на плате разъём ICSP).

Работа

Вот так выглядит устройство с подключенным к нему чипом (который нужно «вылечить» или прошить):

На приведённой выше фотографии к параллельному программатору как раз подключен один из полученных от китайцев чипов ATtiny2313 в SOIC-корпусе (с чего всё и началось). Для подключения чипа в SOIC-корпусе я использовал описанные ранее самодельные коннекторы.

Сам программатор подключен к компьютеру через продающийся на нашем сайте метровый переходник USB-to-UART на микросхеме cp2102.

Весь процесс работы с программатором сводится к передаче программатору нужной последовательности байт (команд). Сделать это можно через любую терминалку, умеющую работать в hex-режиме (я, естественно, пользуюсь своей терминалкой RH_Com, которую любой желающий может скачать вместе с исходниками с нашего сайта из раздела «Полезные программы для ПК»).

Ниже приведены примеры вариантов последовательностей для чипа ATtiny2313 (вместо BS2 для ATtiny2313 используется XA1). Байты нужно передавать по очереди, каждый отдельно, дождавшись ответа о выполнении предыдущей команды (все сразу отправлять нельзя):

Выполнение команды Chip Erase (стирание чипа и сброс lock-битов):
01 02 04 08 0A 80 08 09 03

Расшифровка приведённой последовательности

	0x01 - установить на выходах начальные значения
	0x02 - перейти в режим программирования
A	Load Command (загрузка команды в программируемый чип)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x08 - младшие 4 бита ('1000') показывают, какие уровни нужно установить
	0x0A - установить уровни на линиях Data[7:0]
	0x80 - значения, которые нужно установить (команда '1000 0000' - chip erase)
A'	0x08 - сформировать положительный импульс на линии XTAL1
	0x09 - сформировать отрицательный импульс на линии WR
	0x03 - выйти из режима программирования

[свернуть]

Запись дефолтных значений в младший байт фьюзов:
01 02 04 08 0A 40 08 04 04 0A 64 08 04 00 09 03

Расшифровка приведённой последовательности

	0x01 - установить на выходах начальные значения
	0x02 - перейти в режим программирования
A	Load Command (загрузка команды в программируемый чип)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x08 - младшие 4 бита ('1000') показывают, какие уровни нужно установить
	0x0A - установить уровни на линиях Data[7:0]
	0x40 - значения, которые нужно установить (команда '0100 0000' - write fuse bits)
A'	0x08 - сформировать положительный импульс на линии XTAL1
C	Load Data Byte (загрузка данных в программируемый чип)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x04 - младшие 4 бита ('0100') показывают, какие уровни нужно установить
	0x0A - установить уровни на линиях Data[7:0]
	0x64 - значения, которые нужно установить (соответствует значению младшего байта фьюзов по-умолчанию)
C'	0x08 - сформировать положительный импульс на линии XTAL1
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x00 - младшие 4 бита ('0000') показывают, какие уровни нужно установить
	0x09 - сформировать отрицательный импульс на линии WR
	0x03 - выйти из режима программирования

[свернуть]

Запись дефолтных значений в старший байт фьюзов:
01 02 04 08 0A 40 08 04 04 0A DF 08 04 01 09 03

Расшифровка приведённой последовательности

	0x01 - установить на выходах начальные значения
	0x02 - перейти в режим программирования
A	Load Command (загрузка команды в программируемый чип)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x08 - младшие 4 бита ('1000') показывают, какие уровни нужно установить
	0x0A - установить уровни на линиях Data[7:0]
	0x40 - значения, которые нужно установить (команда '0100 0000' - write fuse bits)
A'	0x08 - сформировать положительный импульс на линии XTAL1
C	Load Data Byte (загрузка данных в программируемый чип)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x04 - младшие 4 бита ('0100') показывают, какие уровни нужно установить
	0x0A - установить уровни на линиях Data[7:0]
	0xDF - значения, которые нужно установить (соответствуют значению старшего байта фьюзов по-умолчанию)
C'	0x08 - сформировать положительный импульс на линии XTAL1
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x01 - младшие 4 бита ('0001') показывают, какие уровни нужно установить
	0x09 - сформировать отрицательный импульс на линии WR
	0x03 - выйти из режима программирования

[свернуть]

Чтение фьюзов и lock-битов:
01 02 04 08 0A 04 08 05 00 04 00 0B 04 09 0B 04 08 0B 04 01 0B 05 01 03

Расшифровка приведённой последовательности

	0x01 - установить на выходах начальные значения
	0x02 - перейти в режим программирования
A	Load Command (загрузка команды в программируемый чип)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x08 - младшие 4 бита ('1000') показывают, какие уровни нужно установить
	0x0A - установить уровни на линиях Data[7:0]
	0x04 - значения, которые нужно установить (команда '0000 0100' - read fuse and lock bits)
A`	0x08 - сформировать положительный импульс на линии XTAL1
	0x05 - установить нужный уровень на линии OE
	0x00 - младший бит ('0') показывает какой уровень нужно установить (порт данных программируемого чипа - на выход)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x00 - младшие 4 бита ('0000') показывают, какие уровни нужно установить
	0x0B - считать значения линий Data[7:0] (первый принятый после этой команды байт содержит Fuse Low Bits)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x09 - младшие 4 бита ('1001' вместо '0011') показывают, какие уровни нужно установить
	0x0B - считать значения линий Data[7:0] (первый принятый после этой команды байт содержит Fuse High Bits)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x08 - младшие 4 бита ('1000' вместо '0010') показывают, какие уровни нужно установить
	0x0B - считать значения линий Data[7:0] (первый принятый после этой команды байт содержит Extended Fuse Bits)
	0x04 - установить нужные уровни на линиях XA1 / XA0 / BS2 / BS1
	0x01 - младшие 4 бита ('0001') показывают, какие уровни нужно установить
	0x0B - считать значения линий Data[7:0] (первый принятый после этой команды байт содержит Lock Bits)
	0x05 - установить нужный уровень на линии OE
	0x01 - младший бит ('1') показывает какой уровень нужно установить (порт данных программируемого чипа - на вход)
	0x03 - выйти из режима программирования

[свернуть]

Аналогичным образом можно составить последовательности для выполнения всех возможных команд чипа (запись/чтение заданных адресов flash/EEPROM, чтение байтов сигнатуры, чтение калибровочной константы…) Остаётся только написать выполняющее все нужные последовательности ПО верхнего уровня и мы получим полноценный параллельный программатор для чипов AVR, позволяющий удобно и быстро прошивать не только отдельные байты, но и всю память чипов целиком. Возможно, в недалёком будущем я именно этим и займусь, ну а на сегодня — всё.

P.S. Лайки и комментарии могут значительно ускорить разработку софта верхнего уровня 🙂

P.P.S. Все до одного китайские чипы оказались живые, но с «неправильными» фьюзами.

Параллельной программатор для AVR

В данной работе описывается конструкция параллельного программатора, единственной задачей которого является восстановление значений фьюзов микроконтроллера «по умолчанию», т.е. записанных на заводе. К достоинствам прибора следует отнести его простоту, автономность (независимость от ПК), а также возможность постоянно модернизировать и усовершенствовать, в зависимости от поставленных задач. Недостатком является, пожалуй, необходимость задействования достаточно большого количества линий связи с микроконтроллером, но иначе нельзя, ведь это — параллельное программирование.

Идея разработки этого устройства родилась после ошибочной записи значений фьюзов в ATmega8, после которой вывод сброса стал обычным вводом/выводом порта, синхронизация предусматривала внешний источник, да ещё и запрещалось программирование по SPI — короче говоря «полный набор». Поиск схем параллельного программатора по интернету и в печати не дал практически ничего, что удовлетворяло бы заданным условиям простоты и повторяемости. После изучения соответствующих даташитов решено было разработать устройство на одном микроконтроллере, которое восстанавливало бы значения фьюзов, необходимые для работы на обычном последовательном программаторе. Вообще-то, честно говоря, параллельный программатор больше ни для чего и не нужен в любительском конструировании — все функции программирования успешно выполняют широко распространённые последовательные «5 проводков», «STK-200», «AVR910», «usbasp» иже с ними.
Итак, задача поставлена — ищем решение. Начинаем, конечно, с выбора контроллера. Для параллельного программирования необходимо иметь как минимум 19 выводов ( см. таблицу).

Восьмивыводные кристаллы сразу отпадают. Можно, открывая ключи +5В и +12В от одного вывода, использовать 18 линий- в этом случае появляется возможность использовать 20-ти выводные корпуса, ATtiny2313, например. В своей же конструкции я использовал ATmega8515, исходя исключительно из удобства расположения портов (на одной стороне) и линий питания — всё для упрощения разводки печатной платы. Можно применить и 28-ми выводные контроллеры, но я изначально планировал последующее подключение LCD-индикатора и 4-х кнопочной клавиатуры. А, в принципе, собрать устройство можно на любом имеющемся кристалле с необходимым количеством выводов — длина кода — 330 байт.
Кроме того, для коммутирования напряжений питания 5 В и программирования 12 В необходимы соответствующие ключи. Изобретать велосипед я не стал, и использовал широко известное схемное решение в виде транзисторного ключа.
Как и в любой диалоговой системе необходимы устройства ввода и вывода — добавляем, соответственно, кнопку и светодиод.
В результате родилась схема, представленная на рисунке:

Схема, как вы видите, проста до безобразия и особых разъяснений не требует. Единственное, что вызовет определенные конструктивные затруднения — это подключение программируемых контроллеров к программатору. Можно это сделать, например, коммутацией проводниками на макетной плате, а можно (и гораздо удобнее) собрать универсальную плату расширения для основных типов контроллеров (или для тех, с которыми постоянно работаешь), подключаемую к программатору шлейфом.
Питать устройство необходимо от стабилизированного источника 12 В. На микросхеме IC1 собран стабилизатор напряжения питания 5 В. Кнопка SA1 «PROG»- даёт команду на перезапись фьюзов, светодиод зелёного свечения VD1 «DONE» — сигнализирует об успешном перепрограммировании. На транзисторах VT1 — VT4 собраны ключи для коммутации напряжений питания и программирования. Сразу оговорюсь, что схему можно совершенствовать сколько душе угодно. Допустим, установить стабилизатор на 12 В — в этом случае можно питать устройство от нестабилизированного источника 16-22 В. Возможно заменить транзисторные ключи на микросхему коммутатора тока и пр.
Конструкция программатора может быть любой — в зависимости от Ваших возможностей и умения. Я сам программатор сделал на печатной плате, а программируемые микроконтроллеры подключал через макетку. В дальнейшем планирую сделать универсальную плату расширения и подключать к программатору 20-ти жильным шлейфом. Детали любые малогабаритные, номиналы указаны на схеме.
Пару слов о программной части. Программа написана на языке С в оболочке WinAVR. Порядок действий в ней полностью соответствует даташиту ATmega8 (раздел о параллельном программировании).
Работать с программатором очень просто. Контроллер, в котором необходимо переписать фьюзы, вставляется в соответствующую панельку. Включается питание и нажимается кнопка «PROG». Загоревшийся светодиод «DONE» сигнализирует об успешной перезаписи. Питание выключается и, после изъятия из панельки, контроллер используется обычным способом.
В своей конструкции я подключал к программатору, кроме панели для ATmega8 ещё панель для ATmega16, поскольку алгоритм программирования для него почти такой же и прошиваемые значения фьюзов позволяют работать с последовательным программатором. В результате устройство даже в такой представленной «игрушечной» версии успешно «реанимирует» кроме ATmega8 ещё и ATmega8535, ATmega16, ATmega32 — это то, что я лично пробовал перепрограммировать
В дальнейшем я планирую дополнить программатор некоторыми функциями, расширить номенклатуру «реанимируемых» контроллеров. В планах добавить функцию считывания байта сигнатуры и, в зависимости от типа контроллера, прошивать его своими «даташитовскими» значениями. А, вообще, приведённых сведений более чем достаточно, чтобы пользователь мог сам модернизировать программатор — хоть в схемной, хоть в программной части.

Источник

Параллельный программатор

Параллельный программатор

Простой «параллельный» программатор для AVR

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

    Схема программатора представлена на рис. 1. Прежде чем приступать к его изготовлению, проверьте порт LPT своего компьютера. Если высокий логический уровень на выходных линиях порта не менее 3.5 В, буферные микросхемы DD1, DD2 можно не устанавливать, а провода, идущие к их выходам, соединить с правыми (по схеме) выводами резисторов R2—R9, R12, R13. Цепь ХТАL1 — с резистором R2, цепь ОЕ — с резистором R3 и так далее.


Рисунок 1

    На разъем Х1 подают от внешнего источника постоянное напряжение 15…18В Источник должен быть способен отдавать ток не менее 150 мА. Напряжение + 12 В и +5 В для питания узлов программатора и программируемой микросхемы получены с помощью интегральных стабилизаторов напряжения. Светодиод HL2 сигнализирует, что на программатор подано питание.
    Замена примененного в оригинальном устройстве для получения напряжения + 12 В импульсного преобразователя напряжения на микросхеме NJM2352D линейным стабилизатором позволила упростить программатор и заодно избавиться от некоторых дорогостоящих деталей.
    Напряжение питания +5В необходимое для включения режима программирования напряжение +12 В поступают на программируемую микросхему через коммутаторы на транзисторах VT1— VT4. Коммутаторами управляю) сигналы, формируемые компьютером на линиях STROBE и AUTOLF порта LPT. Включенный светодиод НL1 показывает. что МК переведен в режим программирования. Другие сигналы управления программированием поступают на МК с линий порта через буферные усилители DD1 и DD2 или непосредственно, если буферы отсутствуют.
    Преобразование сформированного компьютером гюследовательного кода в параллельный, подаваемый на восьмиразрядную шину данных (D0—D7) программируемого МК, производится с помощью сдвигового регистра DD3. Он же выполняет обратное преобразование при передаче информации из МК в компьютер.
    Внешний вид изготовленного программатора показан на рис. 2. К его вилке ХЗ. находящейся на правой боковой стенке, подключают переходники для программирования различных МК. На рис.3-8 показаны схемы переходников, состоящих (за исключением переходника для восьмивыводных МК) из соединенных соответствующим образом розетки X1, стыкуемой с вилкой ХЗ программатора, и панели Х2, в которую устанавливают программируемый МК. Типы МК, для которых предназначены переходники, указаны на схемах. Если изготовить нужные переходники, программатор сможет работать также с 64-выводными МК ATmega64, ATmega103, ATmega128, ATmega165, ATmega169, ATmega325, ATmega329, ATmega603, ATmega645, ATmega649 и со 100-выводными ATmega3250, ATmega3290, ATmega6450. ATmega6490.


Рисунок 2

  
Рисунок 3                                       Рисунок 4


Рисунок 5

 
Рисунок 6                                    Рисунок 7


Рисунок 8
 

    Налаживание программатора начинают с проверки правильности монтажа. Далее подключают вилку Х2 программатора к розетке порта LPT на системном блоке компьютера, работающего под управлением DOS или в DOS сессии Windows. Затем включают питание программатора, а на компьютере запускают программу AVRXCHK.COM, извлеченную из архива [2].
    Эта программа предназначена для проверки работоспособности программатора, т. е. с ее помощью можно изменять логические уровни сигналов на выходных гнездах панели для программируемой микросхемы и проверять их на входных. Учтите, что используемые в этой программе и упоминаемые далее в статье номера гнезд панели относятся к программатору с переходником, собранным по схеме, изображенной на рис. 3.
    Прежде всего проверяют выходные цепи. Клавишами управления курсором перемещают его по экрану, поочередно устанавливая под номером каждого проверяемого гнезда. Нажимая на клавишу «пробел», изменяют установленный на этом гнезде логический уровень: L — низкий (близкий к О В), Н — высокий (близкий к 5 В). На гнезде 1 напряжение уровня Н должно быть близким к 12 В.
    Если найдены гнезда, уровни напряжения на которых принимают промежуточные значения, следует найти и устранить причины этого дефекта, а затем повторить проверку. Одновременное изменение уровней на нескольких гнездах свидетельствует о наличии замыканий в монтаже, которые также следует найти и устранить.
    Добившись правильной работы выходов и установив на всех выходных гнездах уровни L, а на гнезде 20 — Н. нажимают на клавишу Enter и начинают проверку входов. Проводом, вставленным в гнездо to панели, поочередно соединяют с общим проводом ее гнезда 3. 12—19. при этом буква Н у номера проверяемого гнезда на экране компьютера должна сменяться буквой L Если изменения уровней фиксируются чегко, проверку можно считать успешной.
Иногда, особенно при соединении вилки Х2 программатора с портом LPT компьютера слишком длинным кабелем, наблюдаются сбои. Их удается, как правило, устранить, подключив конденсаторы емкостью 470…1000 пФ между контактами 10 и 11 вилки Х2 и общим проводом (ее контактами 18—25).
    На сайте <http://www.elm-chan.org> имеются два варианта бесплатной программы для управления описанным программатором. Один из них AVRXPCOM [2] работает под управлением MS DOS и Windows версий 3.Х, 95, 98. ME и позволяет программировать МК AT90S1200. AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega16, ATmega161, ATmega162, ATmega163, ATmega168, ATmega169, ATmega32, ATmega323, ATmega48, ATmega8, ATmega8515, ATmega8535, ATmega88, ATtiny10, ATtiny11, ATtiny12, ATtiny15, ATtiny22, ATtiny26, ATtiny28.
    В варианте для Windows 95. 98, ME. NT, 2000, XP к ним добавляются ATtiny13, ATtmy24, ATtiny25, ATtiny44, ATtiny45, ATtiny84, ATtiny85, ATtiny2313, ATmega64, ATmega103, ATmega128, ATmega165, ATmega325, ATmega329, ATmega406, ATmega603, ATmega640, ATmega645, ATmega649, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega3250, ATmega3290, ATmega6450, ATmega6490, AT90PWM2, AT90PWM3. Этот вариант программы называется AVRPP.EXE [3].
    По указанным ссылкам находятся не только исполняемые файлы указанных программ, но и их исходные тексты. Этим можно воспользоваться для совершенствования программ, хотя, по моему мнению, единственный их недостаток — довольно неудобный запуск: только из командной строки MS DOS или в окне MS DOS системы Windows. Опции командной строки для обеих программ одинаковы, за исключением того, что их признаком для программы AVRXPCOM служит знак «/» а для программы AVRPREXE — знак «минус».
    Чтобы программа AVRPREXE работала в среде Windows NT, 2000, ХР необходим драйвер GIVEIO.SYS. Его следует скопировать из архива [3] в папку WINDOWS/SYSTEM32/, а затем запустить программу AVRPPEXE с опцией -r (регистрация драйвера). Для этого нужно обладать правами администратора операционной системы.
    Прежде чем при включенном питании программатора вставлять в его панель подлежащий программированию МК, обязательно запустите на компьютepe программу, управляющую программированием. Она инициализирует программатор и установить на всех гнездах его панели безопасные для МК уровни напряжения. В противном случае комбинация уровней будет случайной и может оказаться такой, что содержимое памяти МК будет искажено, а сам он выведен из строя.
    Для программирования МК достаточно запустить программу одной из команд (в зависимости от используемой программы)
                    avrxp файл 1.hex файл2.еер
                    avrpp файл1.hex файл2.еер.
    где файл1, файл2 — имена НЕХ-фай-лов, содержащих информацию для записи соответственно во FLASH-память и в EEPROM МК. Указывать расширения имен этих файлов обязательно. После запуска управляющей программы на экран компьютера будет выведено сообщение, что микросхему можно вставить в панель. Тип установленного МК программа определит автоматически, прочитав код-идентификатор из специальной области его памяти. По завершении цикла программирования можно извлечь МК из панели, не отключая питание, и при необходимости вставить в нее другой МК. Уровни на гнездах панели остаются безопасными. По командам
            avrxp /v файл1.hех файл2.еер
            avrpp -v файл1.hex файл2.еер
будет произведено сравнение записанной в МК информации с содержимым НЕХ-файлов.
    Для чтения FLASH-памяти МК с записью ее содержимого в НЕХ-файл подают команды
            avrxp /rр > файл.hex
            avrpp -rр > файл.hex
    Команды для чтения EEPROM имеют вид
            avrxp /re > файл.еер
            avrpp -re > файл.еер
    Другие опции программ:
            е — стереть все содержимое памяти МК;
            с — копировать калибровочные байты;
            l<код> — установить блокировку памяти МК;
            rf — прочитать конфигурацию;
            f{l|h|x}<значение> — записать конфигурационный байт (l — младший, h — старший, х — расширенный).
    Конфигурационную и калибровочную информации при использовании программы AVRXR.COM вводят в шестнадцатиричном формате, например,
            avrxp fl12
а при использовании AVRPR.EXE — в двоичном: avrpp -fl10010
    В аварийных ситуациях обе программы выводят на экран компьютера сообщения об ошибках. Например, при попытке записать в МК информацию, объем которой превышает информационную емкость его памяти, будет выведено сообщение об этом и программа завершится, не выполнив программирование.
   
    1. Simple AVR Programmers. — <http://elm-chan.org/works/avrx/ report_e.html#AVRXP>
    2. DOS-based control programs for DOS, Wndows3.X/9X/Me and HP200LX. — <http://elm-chan.org/works/avrx/avrxtool.zlp>.
    3. Win32-based control programs lor Windows 9X/Me/NT/2k/Xp. — <http://elm-chan.org/works/avrx/avrxtool32.zip>

 

 




Программаторы / Arduino / RoboCraft. Роботы? Это просто!

Загрузить прошивку в МК AVR семейства Mega (а именно такой стоит в ардуине) можно разными способами(тремя видами программаторов):

Последовательным программатором по интерфейсу SPI
Через интерфейс JTAG
Параллельным (“высоковольтным”) программатором

Теперь по порядку.

SPI или ISP — внутрисхемное последовательное программирование(In-cirсuit Serial Programming).
Самый простой и распространённый, по-крайней мере у любителей, метод.
Как следует из названия — не нужно вынимать МК из платы — прошивка происходит прямо в схеме, через специальный разъём, что довольно удобно =) да и программатор довольно прост (естественно его можно просто купить):

STK200/300 — Наверное самый распространённый SPI-программатор для AVR. Это его буферизованная версия т.е LPT-порт компа защищён буферными элементами микросхемы 74LS244 от каких-либо непредвиденностей. Можно ещё добавить резисторы по 100-200 Ом между портом и микросхемой

вот попроще
, а вот знаменитые “пять проводков” проще некуда=), но и LPT ничто не спасёт в случае чего=)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Также есть COM-версия (прогромматор Громова)

Есть еще куча разных вариаций последовательных программаторов, через USB в том числе.

JTAG это собственно интерфейc (последовательный) для внутрисхемной отладки
(разработанный группой ведущих специалистов по проблемам тестирования электронных компонентов Joint Test Action Group), то есть прям почти на ходу можно в самые недра МК заглянуть — посмотреть что там во всех регистрах творится, ну и прошить можно заодно=) Но программатор относительно сложен (и весьма дорог) так что в любительских условиях это скорее экзотика.
Например AVR miniICE
.
.
.
.
.
.
.
.
.
.
.
.
Параллельный “высоковольтный” программатор стоит гораздо дороже, шьёт быстрее, и может помочь
“оживить” программно убитые МК.
Как, опять же, следует из названия данные в МК передаются параллельно т.е. требуется большое количество выводов МК, также требуется источник “высокого” напряжения 12в. Основное применение этого режима — массовая прошивка МК перед установкой в устройства в промышленных масштабах/условиях.
То есть схема посложнее будет=)
Вот например “Простой параллельный программатор для AVR” ну и конечно тут придётся МК из панельки выковыривать=)

DAPA
Ну а бутлоадер прошивается в ардуину через SPI.
Причём разработчики соригинальничали и придумали для этого свой программатор =)

Да ещё и периодически обзывают его ParallelProgrammer,(это у них сокращение такое — так он Parallel Port Programmer), а вообще зовётся он DAPA.

Про загрузку бутлодера и мои приключения с DAPA можно почитать здесь.

Программаторы для AVR — electronics

Программа для микроконтроллера пишется на любом удобном языке программирования, компилируется в бинарный файл (или файл формата intel HEX) и заливается в микроконтроллер посредством программатора.

Итак, первым шагом в освоении микроконтроллера обычно становится программатор. Ведь без программатора невозможно загнать программу в микроконтроллер и он так и останется безжизненным куском кремния.

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

Программаторы бывают разные под разные семейства контроллеров существуют свои программаторы. Впрочем, бывают и универсальные. Более того, даже ту же простейшую 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 FT232RL, да в таком мелком корпусе, что запаять ее без меткого глаза, твердой руки и большого опыта пайки весьма сложно. Шаг выводов около 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 чтобы облегчить и обезопасить первые шаги на пути освоения микроконтроллеров.

Программатор HVProg by Hammer — Микроконтроллеры и Технологии

Дата публикации: .

Функции и характеристики

— совместим с AvrStudio

— поддерживает основные AVR контроллеры

— параллельное и последовательное высоковольтное программирование

— собран из малого количества деталей

— STK500 протокол

— доступны схемы и печатные платы

Введение

Проект начинался как усовершенствование проекта Evertool Мартина Томаса. Он разбил стандартный AVRISP JTAG адаптер на несколько частей. К сожалению они оба не поддерживают режимы высоковольтного программирования -это единственная возможность «спасения » контроллеров AVR, когда , например неправильно запрограммированы фьюзы. Высоковольтным программированием обладал только адаптер STK500 от ATMEL.

HVProg является переработкой первоначального STK500 без некоторых компонентов. Он основан на оригинальных схемах от ATMEL, которые свободно доступны в интернете (например, на avrfreaks.net). Основной целью было сохранить все функции программатора и поддержку программирования всех доступных контроллеров AVR в каждом из режимов программирования, что поддерживает STK500.

Если вы только хотите изучать контроллеры AVR лучше купить оригинальный STK500. Если вам необходим адаптер ISP программирования, AVRISP включен в Evertool самое лучшее что подходит для Вас!

Программные интерфейсы

Basic-версия

— 6-контактный разъем 
— 10-контактный разъем 
— последовательное высоковольтнре программирование (нестандартный разъем) 
— параллельное высоковольтное программирование (STK500 совместимый разъем данных)

Расширенная версия

— 6-контактный разъем 
— 20-контактный разъем для ISP, параллельное и последовательное высоковольтное программирование

Авторское право

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

Схемы

Рис.1 Схема базовой версии

Рис.2 Схема расширенной версии

Описание разъемов

ISP: разъем совместим со стандартными Atmel (см. STK500 Руководство пользователя )

HV-Seriel: для точности подсоединения контактов смотрите описание микроконтроллера

Pin Name uC Pin
SWCLK XTAL1
TRST Reset (High Voltage Enable Jumper must be set)
PPD0 ‘Serial Data Input’ (usually PB0)
PPD1 ‘Serial Data Input’ (usually PB1)
PPD2 ‘Serial Data Input’ (usually PB2)

HV-Parallel:(см. STK500 Руководство пользователя )

Pin Name uC pin
VCC target supply voltage uC
GND ground
TRST Reset (High Voltage Enable Jumper must be set)
SWCLK XTAL1
PPC0 f BSEL2 then connect to PortA.0 otherwise not needed
PPC1 PortD.1: Rdy/Bsy
PPC2 PortD.2: OE
PPC3 PortD.3: WR
PPC4 PortD.4: BS1
PPC5 PortD.5: XA0
PPC6 PortD.6: XA1
PPC7 PortD.7: PAGEL
PPD0 PortB.0
PPD1 PortB.1
PPD2 PortB.2
PPD3 PortB.3
PPD4 PortB.4
PPD5/MOSI PortB.5
PPD6/MISO PortB.6; if PJUMP connect it to PortC.0
PPD7/SCK PortB.7; if PJUMP connect it to PortC.1

Внешний генератор которым можно реанимировать контроллер с неправильными настройками доступен с вывода SWCLK. Внешний генератор должен быть подсоединен к XTAL1 микроконтроллера и частота его может быть скорректирована до 3,69 МГц с STK500 плагин в AvrStudio.

Программное обеспечение

Микроконтроллер HVProg программируется оригинальной прошивкой ATMEL  в формате EBN, который поддерживается только AvrProg (входит в AvrStudio). Программируется оригинальным программатором Avr910 или улучшенной версией и программой AvrProg. Прошивка для микроконтроллера, схемы и макеты печатных плат выложены в архиве.

Источник: www.der-hammer.info, автор Tobias Hammer

Обсуждение статьи на форуме


Архив для статьи «Программатор HVProg от Der-Hammer »
Описание: Схема GIF, файл прошивки микроконтроллера ebn&hex, макет печатной платы SL5(2 варианта) и Eagle
Размер файла: 502.37 KB Количество загрузок: 3 481 Скачать

Создайте свой собственный, очень простой и универсальный программатор AVR !! — Блог о встроенной электронике

В этом посте мы увидим, как сделать свой собственный, сверхпростой и универсальный программатор AVR. Могут быть построены два типа программаторов AVR:

1) Параллельный порт
2) Последовательный порт


Программатор последовательного порта (ссылка: At-Prog) показан здесь. Основным преимуществом использования последовательного порта является длина кабеля до 2 м. Вы можете использовать программное обеспечение PonyProg2000 для программирования вашего AVR с помощью этого программатора.Последовательный порт генерирует + — 12В на своих выводах, поэтому диоды и стабилитрон используются для зажима + 12В до + 5,0В (4,7В из-за стабилитрона + 0,3В из-за bat85) и от -12В до -0,3В (из-за более низкого Bat85 ). Вы можете заменить Bat85 на 1n4148, однако это не рекомендуется, потому что этот диод будет зажимать +12 В и -12 В до + 5,4 В и -0,7 В, что нежелательно, согласно спецификации микроконтроллера. Дело не в том, что микро сгорит, если использовать диоды 1N4148, но зачем рисковать !!

СХЕМА:

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:

1) Резисторы 1K, 1/4 Вт 4
2) Конденсаторы 27пФ, диск 2
1 мкФ, электролитический 2
3) Кристалл 4 МГц ИЛИ 8 МГц 1
4) Регулятор напряжения 7805 1
5) Разъем D9 Женский 1
6) Диод Бат85 8
7) Стабилитрон 4.7В 1
8) Сетка PCB 3 ″ x 3 ″
9) Соединительные провода

примерная стоимость: 90 рупий

НАСТРОЙКА И ИСПОЛЬЗОВАНИЕ PONYPROG2000:

  1. Все шаги такие же, как описано в разделе программатора параллельного порта, однако на третьем шаге выполните следующие настройки: выберите «последовательный», из списка выберите «SI prog I / O», выберите «COM1» (обычно последовательный порт находится на COM1 , если на вашем компьютере несколько последовательных портов, будут активны несколько параметров.Выберите подходящий, если знаете, иначе выполните метод проб и ошибок), отметьте «Инвертировать сброс». Щелкните ОК.

Примечание: это уже устарело! Эта информация была сохранена здесь только для устаревших целей. Вместо этого используйте программатор на базе последовательного порта .

На следующей принципиальной схеме показан сверхпростой микроконтроллер AVR (ИСТОЧНИК: неизвестен). Он требует очень мало компонентов и его очень просто построить на матричной печатной плате общего назначения. Вы можете использовать программное обеспечение PonyProg2000 для программирования вашего AVR с помощью этого программатора.

СХЕМА:

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:

1) Резисторы 220 Ом, 1/4 Вт 4
2) Конденсаторы 27пФ, диск 2
1 мкФ, электролитический 2
3) Кристалл 4 МГц ИЛИ 8 МГц 1
4) Регулятор напряжения 7805 1
5) Разъем D25 Наружный 1
6) Сетка PCB 3 ″ x 3 ″
7) Соединительные провода

примерная стоимость: 55 рупий

• Поскольку схема программатора очень проста, вы можете использовать заменители, если конкретный компонент недоступен у вас.
• Вы не получите готовую плату GPCB размером 3 x 3 дюйма, вам придется вырезать печатную плату стандартного размера. 3 x 3 дюйма — это всего лишь приблизительная оценка

SNAPS:

На следующей фотографии показан программатор, который я сделал для микроконтроллеров AVR на 40 и 20 контактов. Контакты MISO, MOSI, SCK, RESET, X1, X2, VCC и GND 40-контактного и 20-контактного разъемов соединены вместе.

НАСТРОЙКА И ИСПОЛЬЗОВАНИЕ PONYPROG2000:

  1. Открыть PonyProg2000
  2. Выберите меню: Настройка> Настройка интерфейса
  3. Выберите «параллельно», в раскрывающемся списке выберите «Avr isp i / o», выберите «LPT1».Щелкните ОК.
  4. Теперь выберите меню «Настройка»> «Калибровка». В появившемся диалоговом окне нажмите ДА.
  5. Теперь PonyProg2000 настроен и готов к использованию.
  6. Чтобы записать файл .Hex в micro, выберите «Файл»> «Открыть файл программы (FLASH)».
  7. Выберите соответствующий микроконтроллер из списка устройств вверху справа. например>
  8. Подключите программатор ckt к ПК, затем вставьте микроконтроллер в программатор ckt и включите его питание.
  9. Теперь щелкните обведенный значок:
  10. Когда устройство будет запрограммировано, вы получите сообщение «Программа успешно завершена».

• Схемы, показанные выше, являются общими и подходят для любого микроконтроллера AVR, который поддерживает ISP (почти все AVR, вы можете обратиться на www.atmel.com).
• Подключите контакты (например, MISO, MOSI и т. Д.) AVR к соответствующим точкам показано на принципиальной схеме.
• Вы можете создать программатор для более чем одного устройства AVR, используя разные разъемы IC для каждого устройства и выполняя соответствующие соединения всех вышеперечисленных сигнальных линий (MISO, MOSI, SCK, RESET, X1, X2) и Vcc, Gnd каждого AVR.
• Предпочитайте использовать гнездо ZIF с основанием IC (см .: Как использовать гнездо ZIF в цепи без повторного сверления отверстий на печатных платах).Хотя это немного дорого, но оказывается чрезвычайно полезным.

[Всего: 7 Среднее: 3,1 / 5]

Нравится:

Нравится Загрузка …

Связанные

Программист ISP параллельного AVR в Саидапете, Ченнаи, Embedchip Technologies

Программист ISP параллельного AVR в Саидапете, Ченнаи, Embedchip Technologies | ID: 4874624991

Описание продукта

PARALLEL AVR ISP Programmer — простой и недорогой программатор для AVR.

ОСОБЕННОСТИ:

Подключается к ПК через параллельный порт (принтер) (обратите внимание, что он не будет работать с преобразователем USB в параллельный порт!)

AVR-PG2B совместим с программаторами ключей параллельного порта STK200.

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


Заинтересовал этот товар? Получите последнюю цену у продавца

Связаться с продавцом

Изображение продукта


О компании

Характер бизнеса Производитель, поставщик услуг

IndiaMART Участник с августа 2013 г.

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

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

  • Светодиодные фонари
  • Светодиодные аварийные лампы

и многое другое…

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

Вернуться к началу 1

Есть потребность?
Получите лучшую цену

1

Есть потребность?
Получите лучшую цену

Hieromon / ISP_FuseRescue: ATmega88 Высоковольтный параллельный предохранитель, записывающий экран

日本語 README_jp.мкр

Введение

AVR mcu имеет байт предохранителя, но обычно мы не видим его при работе Arduino с неизменным исходным состоянием. Это для настройки рабочего состояния микросхемы.
Если вы разрабатываете микроконтроллер AVR в исходном состоянии с помощью ATMEL Studio, в редких случаях он может случайно перезаписать бит предохранителя. Если его операция перезапишет биты, относящиеся к вектору сброса для источника синхронизации и загрузчика, MCU не сможет связываться с внешним миром через ISP, или он больше не сможет быть программированием ISP.В среде Arduino IDE при написании скетча возникнет ошибка, как показано ниже.

  avrdude: stk500_recv (): программист не отвечает
  

Эта ошибка появляется, когда загрузчик, записанный в микросхему ATmega328 Arduino, не отвечает. Есть разные причины. Даже если байты предохранителя ATmega328 не соответствуют схеме Arduino и сам чип не запускается, будут возникать такие ошибки. Когда это произойдет, он не сможет вернуть исходное состояние чипа методом последовательного программирования, потому что сам чип заблокирован.это нельзя записать загрузчиком.
Но чип можно использовать, если отменить байты предохранителя, потому что он еще не был уничтожен. Для этого вам нужно записать 8-битную параллельную байту предохранителя при подаче напряжения +12 В.

В таблице данных

ATmega88 / 168/328 описана спецификация параллельного программирования высокого напряжения, и микросхема будет в хорошем состоянии, если будет записано правильное значение предохранителя в соответствии с процедурой. Для этого у вас должна быть какая-то схема и программное обеспечение для записи предохранителя.Инструменты для параллельного программирования высокого напряжения микроконтроллера AVR были реализованы уже разными людьми, поэтому они были опубликованы SatE-o и лабораторией Юки.

ATmega88 Устройство записи высоковольтного параллельного предохранителя для Arduino — это экран и эскиз для записи высоковольтного параллельного предохранителя.

  • Поддерживает ATmega88A / 88PA / 168A / 168PA / 328 / 328P 28pin DIP
  • Щиток Arduino (требуется Arduino Uno)
  • Интерактивное управление с помощью последовательной связи с ПК
  • Arduino в качестве ISP также может использоваться в качестве экрана записи (переключите устройство записи предохранителя и устройство записи ISP с помощью ползункового переключателя на экране).

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

  • Чтение / запись байтов предохранителя и расширенного байта предохранителя
  • Запись байта предохранителя для загрузчика Arduino
  • Бит блокировки чтения / записи
  • Стирание микросхемы

Схема

Схема простая. Он имеет зарядный насос для генерации +12 В от Arduino + 5 В для параллельного программирования, а также имеет 2-канальный аналоговый мультиплексор для выбора писателя ISP или программатора высокого напряжения.
Зарядный насос MC34063 используется, но вы можете использовать второе устройство-источник как NJM2360.
Терминал выбора затвора аналогового мультиплексора привел к выбору + 5V / GND ползункового переключателя, и целью должен быть сброс микросхемы ATmega88. Когда выбрано напряжение +5 В, все сигнальные линии, необходимые для параллельного программирования, подключаются к Arduino и целевой микросхеме. И когда выбрано GND затвора, сигнальные линии для Arduino ISP подключаются к целевому чипу.

Эскиз Arduino

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

  • ISPFuseRescue: Основной скетч
  • FuseRescue: Схема параллельного программирования высокого напряжения
  • ArduinoISP: Arduino как эскиз ISP (пример самого эскиза, который поставляется с Arduino IDE)

Эскиз ISPFuseRescue будет храниться в папке эскизов Arduino, а также FuseRescure и ArduinoISP хранятся в папке пользовательской библиотеки Arduino.

Использование

Сначала вы компилируете ISPFuseRescure и записываете в Arduino Uno, который будет использоваться писателем.После этого установите на Arduino Uno экран высоковольтного параллельного предохранителя и подключите его к ПК через USB-порт.

Вы запускаете последовательный терминал на ПК и подключаетесь к ардуино. Сообщения, как показано ниже на экране терминала, можно будет вводить команды для программирования.

Команды

L : Запись байта нижнего предохранителя
H : Запись байта верхнего предохранителя
X : Запись байта расширенного предохранителя
K : Запись бит блокировки
W : Байт предохранителя по умолчанию (заводское значение) запись
A : Запись байта предохранителя Arduino
E : Стирание микросхемы
V : Проверить байт предохранителя или бит блокировки

Байт предохранителя и биты блокировки

ATmega88A / 168A Байт расширенного предохранителя
Имя Бит № Описание Значение по умолчанию
7-3 1
САПОГИ Z1 2 Выберите размер загрузки 0
САПОГИ Z0 1 Выберите размер загрузки 0
НАПОЛНИТЕЛЬ 0 Выбрать вектор сброса 1 (область применения)
ATmega88A / 168A Старший байт предохранителя
Имя Бит № Описание Значение по умолчанию
RSTDISBL 7 Отключение внешнего сброса 1 (СБРОС)
DWEN 6 debugWIRE Включить 1 (Отключить)
SPIEN 5 Разрешить последовательную загрузку программ и данных 0 (программирование SPI включено)
WDTON 4 Сторожевой таймер всегда включен 1 (на WDTCSR)
EESAVE 3 Память EEPROM сохраняется посредством Chip Erase 1 (EEPROM не зарезервирован)
BODLEVEL2 2 Уровень срабатывания детектора пониженного напряжения 1
BODLEVEL1 1 Уровень срабатывания детектора пониженного напряжения 1
BODLEVEL0 0 Уровень срабатывания детектора пониженного напряжения 1
ATmega328 Байт расширенного предохранителя
Имя Бит № Описание Значение по умолчанию
7-3 1
BODLEVEL2 2 Уровень срабатывания детектора пониженного напряжения 1
BODLEVEL1 1 Уровень срабатывания детектора пониженного напряжения 1
BODLEVEL0 0 Уровень срабатывания детектора пониженного напряжения 1
ATmega328 Старший байт предохранителя
Имя Бит № Описание Значение по умолчанию
RSTDISBL 7 Отключение внешнего сброса 1 (СБРОС)
DWEN 6 debugWIRE Включить 1 (Отключить)
SPIEN 5 Разрешить последовательную загрузку программ и данных 0 (программирование SPI разрешено)
WDTON 4 Сторожевой таймер всегда включен 1 (на WDTCSR)
EESAVE 3 Память EEPROM сохраняется посредством Chip Erase 1 (EEPROM не зарезервирован)
САПОГИ Z1 2 Выберите размер загрузки 0
САПОГИ Z0 1 Выберите размер загрузки 0
НАПОЛНИТЕЛЬ 0 Выбрать вектор сброса 1 (область применения)
Младший байт предохранителя
Имя Бит № Описание Значение по умолчанию
CKDIV8 7 Разделите часы на 8 0 (есть)
CKOUT 6 Тактовый выход 1 (отключено)
SUT1 5 Выберите время запуска 1
SUT2 4 Выберите время запуска 0
CKSEL3 3 Выбрать источник синхронизации 0
CKSEL2 2 Выбрать источник синхронизации 0
CKSEL1 1 Выбрать источник синхронизации 1
CKSEL0 0 Выбрать источник синхронизации 0
Фиксирующие биты
Имя Бит № Описание Значение по умолчанию
7-6 1
BLB12 5 Бит блокировки загрузки 1
BLB11 4 Бит блокировки загрузки 1
BLB02 3 Бит блокировки загрузки 1
BLB01 2 Бит блокировки загрузки 1
LB2 1 Замок бит 1
LB1 0 Замок бит 1
Байт предохранителя для Arduino

Если вы хотите, чтобы ATmega328 вел себя как Arduino, вам необходимо указать источник синхронизации и загрузчик в байтах fuse.Его значение описано в файле <системная папка Arduino> \ hardware \ arduino \ avr \boards.txt . (Путь в случае Arduino IDE 1.6.0)

  uno.bootloader.low_fuses = 0xFF
uno.bootloader.high_fuses = 0xDE
uno.bootloader.extended_fuses = 0x05
uno.bootloader.unlock_bits = 0x3F
uno.bootloader.lock_bits = 0x0F
  

Внимание !!!

Вы не можете использовать переключатель для смены записывающего устройства параллельного высоковольтного предохранителя и записывающего устройства ISP при подключении к ПК через USB.Короткое замыкание. Операция переключения должна быть в состоянии, когда питание не подается.

Приложение

Файлы Eagle Cad (схема и макет печатной платы)

Для справки будут размещены данные печатной платы Eagle cad. Эта печатная плата состоит из частей SMD.

Файл CAD Eagel (zip)

спецификация
Часть Значение Устройство Пакет
C1 330 мк Алюминиевый электролитический конденсатор SMD Φ6.3 мм x 7,7 мм
C2 100 мкм Алюминиевый электролитический конденсатор SMD Φ8,0 мм x 10,2 мм
C3 680пФ Керамический конденсатор 2012 SMD
C4 0,1 мкФ Керамический конденсатор 2012 SMD
C5 22 пФ Керамический конденсатор 1608 SMD
C6 22 пФ Керамический конденсатор 1608 SMD
C7 0.1 мкФ Керамический конденсатор 2012 SMD
C8 0,1 мкФ Керамический конденсатор 2012 SMD
D1 RSX101VA-30TR Барьерный диод Шоттки TUMD2
PGM зеленый светодиод 2012 SMD
PWR зеленый светодиод 2012 SMD
ERR Красный светодиод 2012 SMD
HB желтый светодиод 2012 SMD
RX желтый светодиод 2012 SMD
TX желтый светодиод 2012 SMD
IC1 74HC4053 АНАЛОГОВЫЙ МУЛЬТИПЛЕКСОР ЦСОП-16
IC2 74HC4053 АНАЛОГОВЫЙ МУЛЬТИПЛЕКСОР ЦСОП-16
L1 100 мкГн Индуктор 3225 SMD
1 квартал SI6544DQ МОП-транзистор с N- и P-каналом ЦСОП-8
2 квартал 16 МГц Кристалл HS-49 / S
R1 1 Ом Регистр 2012 SMD
R2 1 Ом Регистр 2012 SMD
R3 200 Ом Регистр 2012 SMD
R4 1.1 кОм Регистр 2012 SMD
R5 100 кОм Регистр 2012 SMD
R6 130 кОм Регистр 2012 SMD
R7 3,3 кОм Регистр 2012 SMD
R8 10 кОм Регистр 2012 SMD
R9 15 кОм Регистр 2012 SMD
R10 10 кОм Регистр 2012 SMD
R11 1 кОм Регистр 2012 SMD
R12 1 кОм Регистр 2012 SMD
R13 1 кОм Регистр 2012 SMD
R14 1 кОм Регистр 2012 SMD
R15 1 МОм Регистр 2012 SMD
R16 1 кОм Регистр 2012 SMD
R17 1 кОм Регистр 2012 SMD
R18 1 кОм Регистр 2012 SMD
R19 10 кОм Регистр 2012 SMD
R20 10 кОм Регистр 2012 SMD
R21 10 кОм Регистр 2012 SMD
S1 СС-22СДП2 Двухполюсный ползунковый переключатель включения-включения НКК SS22SDP2
S2 СБРОС Тактильный переключатель
Т1 2SC4116 NPN транзистор СОТ-23 (СК-70)
T2 2SC4116 NPN транзистор СОТ-23 (СК-70)
U2 MC34063ADG DC-DC преобразователь зарядного насоса SIOC-8
U3 IC-розетка 28-контактный разъем IC 300MIL DIP

Программатор параллельного порта — микроконтроллер для начинающих

Программатор параллельного порта — идеальное решение для начинающего.Предлагаю всем новичкам приступить к этому, если у них есть порт LPT1. Затем выберите последовательный порт и USB. AVR ISP параллельного порта — самый простой программатор, которого я когда-либо видел. Вот оно …

Или смотрите ниже, все одинаковы …..

Не говорите это как параллельный программатор . Он отправляет данные последовательно.

  • SCK: тактовый сигнал, который сдвигает биты, которые должны быть записаны в память, во внутренний регистр сдвига, и который сдвигает биты для чтения из другого внутреннего регистра сдвига,
  • MOSI: данные сигнал, который отправляет биты для записи в AVR,
  • MISO: сигнал данных, который принимает биты, считанные из AVR.

Всегда лучше использовать буфер в порту, например 74ls125 (щелкните, чтобы увидеть). Многие стандартные интернет-провайдеры используют 74ls245 передатчик / приемник восьмеричной шины, предназначенный для асинхронной двусторонней передачи данных между шинами данных. См. Внимательно 74ls125 и см. Ниже.

Не понимаю? Сделай первый !!

вот программатор, которым я пользовался долгое время…..

Сначала попробуйте это на макетной плате. Когда что-то начнет происходить, припаяйте его таким образом (это другая проводка, которую я дал выше)

Наш выглядит так …

Все эти компоненты,

  • Порт LPT1
  • Провода, Rebon
  • Резистор (47/56/470 Ом, работает любое значение Ом)
  • Паяльник и сопутствующий элемент733 9145
  • IC 7805
  • Адаптер

Доступен на стадионе, Навабпур, Патуатули.Предлагаю купить «фишку» от Telecom spares, Патуатули.

Мой провайдер для ATmega8: те же соединения, что и Mega16 / 32. Вам нужно только увидеть его выводы MOSI, MISO, SCK, RESET, эти выводы расположены по-разному на Atmega8. (щелкните, чтобы увидеть контактную схему)

Для загрузки программы на Mega8 / 32 необходим внешний источник питания. Небольшой чип, такой как ATtiny13, не требует внешнего источника питания, но лучше использовать источник питания.Схема источника питания представляет собой не что иное, как использование микросхемы регулятора и конденсатора. (От адаптера постоянного тока).

Использование PonyProg:

Для загрузки нашей программы в чип необходимо программное обеспечение. Ponyprog — это наиболее часто используемая программа для последовательного программирования. Загрузите Ponyprog с сайта

http://www.lancos.com/prog.html

и установите его. Откройте Ponyprog, перейдите в раздел «Настройка» и введите «Калибровка». Введите «Да». (Настройка> Калибровка)

Снова Перейдите к настройке и щелкните Настройка интерфейса.(Настройка> Настройка интерфейса) Вы увидите настройку порта ввода / вывода. нажмите «Параллельный» и установите «AVR ISP I / O» в следующем поле. Затем щелкните в LPT 1. Снимите все флажки в строках поля полярности и управления и нажмите кнопку ОК. Теперь посмотрите на рисунок ниже, справа вверху вы увидите «AVR micro» и «ATmega8» был выбран.

Теперь ваше программное обеспечение готово к написанию Atmega8 …

Я думаю, вы знаете, как создать файл Hex. (См. Раздел AVR GCC). Теперь мы собираемся открыть шестнадцатеричный файл для Atmega8 из нужного каталога, в котором был сохранен файл проекта.Одна важная вещь, если вы открываете шестнадцатеричный код, которого нет для Atmega8, программа не может писать. Если вы хотите написать другой микроконтроллер,

Я думаю, что изображения выше сказали вам все. А теперь скажите, что мы сгорим. Выберите микросхему, как указано выше. Затем введите Файл> Открыть файл устройства, перейдите в нужное расположение файла Hex и установите «Тип файлов» как * .hex.

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

Теперь Command> написать все.Программное обеспечение запросит у вас подтверждение. нажмите «Да».

Если ваш программатор, соединения и питание в порядке, программа начнет писать. После написания проверим в аналогичном окне. Затем он скажет либо успешно, либо запись не удалась. Если ваш программатор, соединения, источник питания или микросхема неисправны, программное обеспечение сообщит вам «Устройство отсутствует или неизвестно устройство (-24)»

Я всегда благодарен за использование специального программатора от производителя.Попробуйте AVR dragon

http://store.atmel.com/PartDetail.aspx?q=p:10500053

% PDF-1.6 % 1011 0 объект> эндобдж xref 1011 163 0000000016 00000 н. 0000004967 00000 н. 0000005104 00000 п. 0000005293 00000 п. 0000005321 00000 н. 0000005369 00000 н. 0000005405 00000 н. 0000005685 00000 н. 0000005770 00000 н. 0000005850 00000 н. 0000005932 00000 н. 0000006014 00000 н. 0000006096 00000 н. 0000006178 00000 п. 0000006260 00000 н. 0000006342 00000 п. 0000006424 00000 н. 0000006506 00000 н. 0000006588 00000 н. 0000006670 00000 н. 0000006752 00000 н. 0000006834 00000 н. 0000006916 00000 н. 0000006998 00000 н. 0000007080 00000 н. 0000007162 00000 н. 0000007244 00000 н. 0000007326 00000 н. 0000007408 00000 п. 0000007490 00000 н. 0000007572 00000 н. 0000007654 00000 н. 0000007736 00000 н. 0000007818 00000 н. 0000007900 00000 н. 0000007982 00000 н. 0000008064 00000 н. 0000008146 00000 п. 0000008228 00000 п. 0000008310 00000 н. 0000008392 00000 п. 0000008474 00000 п. 0000008556 00000 н. 0000008638 00000 н. 0000008720 00000 н. 0000008802 00000 н. 0000008884 00000 н. 0000008966 00000 н. 0000009048 00000 н. 0000009130 00000 н. 0000009212 00000 н. 0000009294 00000 п. 0000009376 00000 п. 0000009458 00000 п. 0000009540 00000 п. 0000009622 00000 н. 0000009704 00000 н. 0000009786 00000 н. 0000009868 00000 н. 0000009950 00000 н. 0000010032 00000 н. 0000010114 00000 п. 0000010195 00000 п. 0000010276 00000 п. 0000010357 00000 п. 0000010438 00000 п. 0000010520 00000 п. 0000010601 00000 п. 0000010655 00000 п. 0000012539 00000 п. 0000013191 00000 п. 0000013644 00000 п. 0000014282 00000 п. 0000014852 00000 п. 0000019290 00000 п. 0000024491 00000 п. 0000024953 00000 п. 0000025120 00000 н. 0000025564 00000 п. 0000025688 00000 п. 0000025746 00000 п. 0000025806 00000 п. 0000025892 00000 п. 0000025981 00000 п. 0000026083 00000 п. 0000026202 00000 п. 0000026314 00000 п. 0000026416 00000 н. 0000026525 00000 п. 0000026627 00000 н. 0000026739 00000 п. 0000026839 00000 п. 0000026982 00000 п. 0000027082 00000 п. 0000027187 00000 п. 0000027305 00000 п. 0000027416 00000 п. 0000027553 00000 п. 0000027695 00000 п. 0000027807 00000 п. 0000027916 00000 н. 0000028019 00000 п. 0000028126 00000 п. 0000028239 00000 п. 0000028374 00000 п. 0000028510 00000 п. 0000028637 00000 п. 0000028752 00000 п. 0000028868 00000 п. 0000028985 00000 п. 0000029099 00000 н. 0000029204 00000 п. 0000029309 00000 п. 0000029424 00000 п. 0000029529 00000 п. 0000029644 00000 п. 0000029760 00000 п. 0000029872 00000 н. 0000029997 00000 н. 0000030108 00000 п. 0000030215 00000 п. 0000030315 00000 п. 0000030428 00000 п. 0000030529 00000 п. 0000030637 00000 п. 0000030751 00000 п. 0000030863 00000 п. 0000030981 00000 п. 0000031096 00000 п. 0000031205 00000 п. 0000031333 00000 п. 0000031450 00000 п. 0000031566 00000 п. 0000031676 00000 п. 0000031787 00000 п. 0000031917 00000 п. 0000032035 00000 п. 0000032164 00000 п. 0000032290 00000 п. 0000032401 00000 п. 0000032532 00000 п. 0000032666 00000 п. 0000032788 00000 п. 0000032901 00000 п. 0000033019 00000 п. 0000033144 00000 п. 0000033275 00000 п. 0000033385 00000 п. 0000033511 00000 п. 0000033634 00000 п. 0000033753 00000 п. 0000033865 00000 п. 0000033965 00000 п. 0000034096 00000 п. 0000034218 00000 п. 0000034325 00000 п. 0000034441 00000 п. 0000034557 00000 п. 0000034663 00000 п. 0000034763 00000 п. 0000034873 00000 п. 0000034988 00000 п. 0000003638 00000 н. трейлер ] >> startxref 0 %% EOF 1173 0 obj> поток 96 ی; х?

Что такое программатор AVR?

Микроконтроллеры AVR бывают разных размеров и спецификаций.Они обладают большим набором функций и возможностей.

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

Но эти микроконтроллеры не поставляются с заранее запрограммированным программным обеспечением / программами, готовыми взять на себя любую текущую задачу.

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

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

Вот где на помощь приходит программист AVR. Основная роль программиста AVR заключается в том, чтобы иметь возможность переносить написанный им код на микроконтроллер.

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

Допустим, вы только что завершили простую программу, которую только что написали, для мигания светодиода. У вас все оборудование подключено. Теперь осталось только загрузить программу в микроконтроллер с помощью AVR Programmer.

В этой статье будут рассмотрены различные типы программистов AVR, разница между программистом AVR и отладчиком, а также многие другие ключевые моменты.

Что такое программирование AVR?

Термин AVR относится к архитектуре, используемой многими микроконтроллерами Atmel.

Существует множество различных типов микроконтроллеров и программаторов, поэтому программирование AVR относится к программированию микроконтроллеров, использующих архитектуру типа AVR.

С разными архитектурами приходят разные формы программирования.Далее я буду рассматривать только программирование AVR.

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

Программирование AVR — это, по сути, акт написания программы с последующим «программированием» вашего микроконтроллера с помощью соответствующего программатора AVR.

Что такое программа?

Итак, первым шагом к программированию АРН является «Программа».

Первым шагом программы является то, что пользователь пишет свою программу, используя программный язык.

У вас есть много вариантов, в зависимости от самого микроконтроллера. Они включают двоичные, ассемблерные, C, C ++, Python, Java и многие другие.

Двоичный — это то, что изначально использовалось на заре микроконтроллеров и больше не используется из-за своей неэффективности и сложности.

Ассемблерный язык также довольно примитивен и используется не так часто, как C, C ++, Python и Java.

C , C ++ , Python и Java — это языки более высокого уровня, которые читаются человеком.

Удобочитаемость для микроконтроллера не годится. Микроконтроллер может интерпретировать только машиночитаемый код.

Двоичный код и ассемблер — машиночитаемые языки. Однако в наши дни писать программы в машиночитаемом коде довольно редко.

Итак, если вы написали свой код с «читаемым человеком» кодом, он должен быть преобразован в «машиночитаемый» код, который является двоичным (нули и единицы).

Программное обеспечение или компилятор, в котором вы пишете свой код, должны уметь «компилировать» ваш код.Компиляция вашего кода состоит из преобразования вашего проекта в машиночитаемый код.

Список программного обеспечения, которое может это сделать, включает:

  • WinAvr
  • Arduino IDE
  • Visual Studio
  • Atmel Studio
  • Codevision AVR
  • VMLAB

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

Следующим шагом будет передача .hex во флэш-память микроконтроллера.

Что такое вспышка?

Flash — это память, в которой хранится ваша программа.

Когда вы включаете микроконтроллер, он выполняет все, что хранится во флэш-памяти.

Возможность записи во флэш-память — вот что важно.

Каждый микроконтроллер AVR имеет набор контактов, которые используются для программирования.

Итак, чтобы запрограммировать флеш-память микронтроллера, вам необходимо подключить программатор AVR к этим конкретным контактам.

Эта форма программирования известна как в системном программировании (ISP) или в схемном системном программировании (ICSP). Это наиболее распространенный способ программирования микроконтроллера.

Все выводы программирования микроконтроллеров AVR не совпадают. Вам нужно будет свериться с таблицей микроконтроллера, который вы программируете, чтобы выяснить, какие контакты подходят.
Контакты, связанные с программированием: GND, VCC, RESET, SCK, MOSI и MISO.

Что такое программатор AVR?

Программист AVR играет решающую роль в процессе программирования.

Он обеспечивает прямое соединение между вашим компилятором и микроконтроллером.

Без программатора AVR ваша программа осталась бы просто программой. Вы не сможете загрузить его в микроконтроллер.

Существует множество типов интерфейсов программирования: ISP, PDI, UPDI, высоковольтный последовательный, высоковольтный параллельный, загрузчик и ПЗУ.

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

Каждый вариант имеет разные характеристики, а также свои плюсы и минусы.

Различные варианты включают; Последовательный / параллельный порт, плата ISP и макетные платы

Программатор последовательного / параллельного порта, побитовый сигнал

Этот тип программатора подключается к последовательному или параллельному порту ПК.

Он обменивается данными с параллельным / последовательным портами для отправки данных на микроконтроллер.

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

Плюсы

  • Дешево
  • Легко понять, так хорошо для новичков
  • Отлично для простых проектов

Минусы

  • Не очень умно, поэтому не идеально для сложных проектов
  • Требуется компьютер имеет параллельный / последовательный порты. К сожалению, MAC несовместим.

    Есть две разные версии.

    Один использует последовательный порт для связи, а другой — USB.

    Есть много вариантов программистов ISP, но наиболее распространенными являются AVR ISP v1 и v2.

    V1 использует последовательный разъем, а V2 использует USB.

    Плюсы

    • Умнее
    • Простота в использовании
    • Возможны сложные проекты

    Минусы

    • Немного дороговато
    Платы разработчика, контроллеры

    Если вы начинаете с микроконтроллеров

    доски для разработки — отличное место для начала.

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

    Макетная плата может быть такой же простой, как микроконтроллер и схема синхронизации.

    Или он может включать в себя выходы, такие как светодиоды, двигатели, ЖК-дисплеи, а также входы, такие как переключатели, кнопки и датчики.

    Таким образом, устраняются все догадки, связанные с настройкой периферийных схем.

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

    Сегодня доступно множество плат для разработки.

    Но самые распространенные — это STK500 и AVR Dragon.

    STK500 — это плата разработки, которая поддерживает большинство микроконтроллеров Atmel.

    Этот программатор используется вместе с AVR Studio (среда программирования, разработанная Atmel).

    Протокол связи, который он использует для связи с компьютером, известен как «STK500».

    Другая распространенная плата разработки — AVR Dragon.

    AVR Dragon имеет множество разъемов для различных микроконтроллеров, а также включает в себя программатор.

    Однако AVR Dragon действует скорее как программист, чем как плата для разработки.

    Плюсы

    • Отлично подходит для новичков
    • Нет необходимости в настройке периферийных схем
    • Включен программатор

    Минусы

    • Может быть довольно дорого
    • Хотя это может быть хорошо для начала, это может быть хорошо для начала немного сложный

    Что такое отладчик?

    Возможность загружать программы в микроконтроллер — важный шаг в программировании.

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

    Здесь пригодится отладчик.

    Как следует из названия, отладчик позволяет вам «отлаживать» ваш код.

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

    Вы также можете заглянуть внутрь микроконтроллера на его внутреннюю работу, включая его ввод / регистры, переменные, значения часов и многое другое.

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

    Он также может реагировать на внешние события, такие как нажатия кнопок.

    Преимущество состоит в том, что он не только позволяет вам отлаживать код, но и позволяет программировать микроконтроллер.

    Наиболее часто используемые и доступные отладчики — это JTAG (Joint Test Action Group).

    Компания Atmel предлагает ряд адаптеров JTAG для микроконтроллеров AVR, в которые входят Atmel-ICE, JTAG-ICE, JTAG-ICE mkII и AVR Dragon.

    Что мне нужно: программатор AVR или отладчик?

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

    Отладчики из-за своих возможностей могут быть довольно дорогими.

    Итак, если вы только новичок, изучающий тонкости программирования своего первого проекта микроконтроллера, вам не потребуется отладчик. Программист AVR — это все, что вам нужно для начала.

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

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

    Программное обеспечение, используемое для программирования

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

    Самый знакомый код для написания — C.Существуют и другие IDE, которые предлагают базовый уровень, java, C ++ и т. Д.

    При приобретении IDE убедитесь, что у нее есть возможность компилировать код для создания файла .HEX и есть возможность разговаривать с вашим программистом.

    Хорошая новость заключается в том, что Atmel создала собственную линейку IDE, специально предназначенных для использования с ее программистами AVR.

    Вы можете написать код, скомпилировать его, запрограммировать свой микроконтроллер и отладить его. IDE — это Atmel AVR Studio.

    Доступно много версий, но подойдет Atmel AVR Studio 6 или любая более поздняя версия.
    Другие распространенные IDE включают Codevision AVR , WinAVR , BASCOM-AVR , и MikroC.

    Могу ли я использовать свой программатор AVR с любым микроконтроллером AVR?

    Поскольку доступно множество программистов / отладчиков, все зависит от того, какие микроконтроллеры поддерживает конкретный программист / отладчик.

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

    В качестве примера ниже приведены возможности программирования и отладки ATMEL-ICE (взяты из таблицы данных ATMEL-ICE):

    UPDI TPI SPI debugWI JTAG PDI aWIRE SWD
    tinyAVR Новые устройства Некоторые устройства Некоторые устройства Некоторые устройства Некоторые устройства Некоторые устройства
    megaAVR Все устройства Некоторые устройства Некоторые устройства
    AVRxMEga Некоторые устройства Все устройства
    UC 9010 Все устройства 9 0020 Некоторые устройства
    SAM Некоторые устройства Все устройства

    Нужен ли для Arduino специальный программист?

    Хотя сама Arduino не является частью семейства AVR (AVR — это ветвь микроконтроллеров, производимых Atmel), в основе каждого (если не большинства) Ardunios лежит микроконтроллер AVR.

    Arduino — это аппаратная и программная платформа, построенная на основе AVR.

    Для автономного микроконтроллера AVR требуется программист (программисты, подобные упомянутым выше).

    Однако большинство плат Arduino имеют те же функции, что и программаторы AVR.

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

    Характерным признаком того, что на плате Arduino есть встроенный программатор, является наличие на ней USB-порта.Все, что вам нужно для программирования, — это USB-кабель.

    Однако в некоторых Ardunios для экономии средств встроенный программатор отсутствует. Вместо USB-порта у них будет заголовок ISP, к которому вы можете подключить программатор AVR.

    Ardunio можно рассматривать как плату для разработки. За исключением того, что он не имеет встроенных дополнительных компонентов, таких как двигатели, датчики, переключатели.

    Можно ли использовать программаторы AVR для программирования микроконтроллеров других производителей?

    Микроконтроллер AVR — это семейство интегрированных микросхем производства Atmel.

    Но это не единственные микроконтроллеры, доступные на рынке. Есть и другие компании, производящие микроконтроллеры других типов.

    К наиболее распространенным из них относятся PIC и 8051 .

    Процесс программирования этих микросхем такой же, как и для AVR (напишите код, скомпилируйте его в файл .hex и затем загрузите этот файл в микроконтроллер). Большинство из них также используют ISP как средство программирования чипа.

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

    Таким образом, для программирования микроконтроллеров AVR следует использовать программатор AVR.

    Заключение

    Итак, вы можете видеть, что программатор AVR является ключевым элементом, когда дело доходит до процесса программирования микроконтроллера AVR.

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

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

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

    Программатор параллельного порта AT89LP2052 / AT89LP4052

    Программирование флэш-памяти AT89 LP2052 / LP4052, битов блокировки и пользовательских предохранителей

    Микроконтроллер AT 89LP2052 / 89LP4052 предоставляет два интерфейса с одинаковым форматом команд для программирования устройства.Последовательный интерфейс программирования ISP нового микроконтроллера 2052/4052 требует одного дополнительного сигнала SS для программирования устройства. Этот сигнал SPI будет добавлен в ближайшем будущем к существующему кабелю AT89ISP и программному обеспечению (драйверу) для IDE. Вы можете найти более подробную информацию в спецификациях Atmel.
    Эта конструкция программатора 2052/4052 использует режим параллельного программирования через параллельный порт. Только параллельное программирование может повторно включить предохранитель ISP. Этот программатор также полезен, если вам нужно написать пользовательские предохранители для отключения предохранителя XTAL Osc Bypass — e.грамм. для тестирования LP2052 в существующих 2051 конструкциях оборудования.

    Аппаратное обеспечение программатора
    Порт данных подключается через защелку 574 с 3 выходами состояний. Строб-сигнал параллельного порта используется для фиксации данных. Сигналы CS / Signal и Powerupply Vcc / Vpp микроконтроллера управляются с помощью устройства HC273. Сигнал инициализации параллельного порта используется для управления этими линиями с помощью программного обеспечения хоста. Состояние Vcc и Vpp отображается двумя светодиодами на плате программатора.Внешний осциллятор не требуется. На микроконтроллер Atmel подается импульсный сигнал Select_In из параллельного порта.
    Внешний источник питания (16 В =) необходим для генерации напряжения программирования 12 В.

    Посетите сайт www.atmel.com, чтобы найти информацию о применении параллельного порта для существующих устройств Atmel AT89 C / LV 51/52.
    Опрос данных в настоящее время не поддерживается, чтобы уменьшить количество компонентов на плате. Чтобы проверить данные, нам все еще нужно протестировать интерфейс SPI через параллельный порт.
    Чтобы минимизировать влияние неопределенных состояний, необходимо запустить программное обеспечение хоста (чтобы отключить Vcc и Vpp!) До того, как устройство 2052/4052 LP будет вставлено в сокет.


    Для получения дополнительной информации: AT89LP2052 / AT89LP4052 Программатор параллельного порта

    .

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *