Выкладываю свою версию этого программатора:
1. Исходник переделан под IAR.
2. Структура программы приведена к нормальному виду. Ну и бардак там был!
Теперь текст разбит на логически завершенные модули. Интерфейс каждого
модуля максимльно простой и находится в соответствующем h-файле.
Никаких переменных с видимостью больше, чем в одном модуле.
Никаких магических чисел, все вычисляется на основе заданных констант.
3. Операция чтения байта по UART сделана неблокирующей. Это позволило
выполнять в фоне другие задачи. Пока это только управление светодиодом.
Для парсера команд введен таймаут, который задается константой в тексте.
4. Светодиод теперь делает короткие вспышки, когда программатор
находится в standby (питание подано, а кабель не подключен).
Когда кабель правильно подключен, светодиод горит непрерывно.
Когда программатор находится в режиме терминала, светодиод равномерно мигает.
5. Немного изменен формат сообщений в режиме терминала. Выкинуто всё лишнее.
Переписана обработка вводимых пользователем цифр.
6. Разводка платы сделана так, что для тактирования target-а
задействован вывод OC1A. Туда все время выдается частота 1 МГц.
7. Исправлен пересчет длительности SCK. В исходном варианте длителности
брались для AVR ISP, а не для STK-500. Правда, максимальную скорость
1.8 МГц получить не удалось, получилось максимум 600 кГц на кварце 14.7456 МГц.
8. Еще исправлено и переделано много чего.
9. Плата разведена под стандартный корпус 50 x 35 x 20 мм.
Плата односторонняя. Добавлен выключатель, который может подавать питание
на target от USB.
В архиве проект для IAR, печатная плата и схема в формате PCAD 2006 и в Adobe PDF.
P.S. Прошивка пока протестирована слабо, нет под рукой широкого выбора кристаллов.
Upd:
+ На схеме исправлена частота кварца на 14.7456 МГц, так как
hex-файл сделан именно для этой частоты.
+ Добавлена реализация команд CMD_SET_PARAMETER/CMD_GET_PARAMETER для
PARAM_OSC_PSCALE и PARAM_OSC_CMATCH. Теперь частота на выходе OC1A
задается из окна HW Settings.
По умолчанию задал CONFIG_PARAM_OSC_PSCALE = 1, CONFIG_PARAM_OSC_CMATCH = 1,
что соответствует частоте на выходе 1.843 МГц.
+ Изменено имя с AVRISP_2 на STK500_2, это позволило считывать VTarget.
Upd:
+ Изменено вычисление частоты SPI согласно параметру PARAM_SCK_DURATION.
В оригинальном STK-500 используется аппаратный модуль SPI, значения
параметра 0, 1, 2, 3 соответствуют значениям делителя 4, 16, 64, 128.
Дальше деление производится примерно на 24 * PARAM_SCK_DURATION.
Добавил пересчет с учетом реальной тактовой частоты F_CLK и длины
программного цикла формирования SCK (26 + 6 * (delay - 1)) тактов.
+ Задал частоту SPI по умолчанию 460.8 кГц.
+ Добавил эхо светодиода в ответ на команду компьютера (светодиод
гаснет на то время, пока парсер разбирает команду и она выполняется).
Upd:
+ Изменил логику мигания светодиода. Теперь период мигания не связан
с периодом опроса состояния динии RESET. Это дает возможность изменением
констант устанавливать любой период и длительность мигания светодиода.
При изменении состояния программатора происходит сброс таймера мигания.
Период мигания в IDLE увеличил до 2 сек.
+ Исправил ошибку, возникавшую при попытке работы с программатором при
отстутствующей связи с target. Теперь по таймауту линии SPI переводятся
в Z-состояние.
Upd:
+ Добавил в архив файл этикетки в формате Corel Draw 11 и pdf.
Upd:
+ Добавил в архив папку hex, в которой прошивки для кварцев 11.0592 МГц, 14.7456 МГц, 18.432 МГц.
Upd:
+ Добавил архив hex.zip, где только прошивки. Сделал версию со скоростью SPI 230.4 кГц, которую сделал по умолчанию, чтобы шить кристаллы с тактовой 1 МГц (так они обычно идут с завода, 8 МГц / 8 ). Такой скорости в оригинальном STK-500 нет, я ее ввел вместо 115.2 кГц. Студия будет говорить 115.2 кГц, но это на самом деле будет 230.4 кГц.
+ Добавил в hex.zip прошивку, которая позволяет из терминала менять имя устройства (STK500_2 или AVRISP_2).
Upd:
+ Убрал лишние прошивки, чтобы не путались. Оставил последнюю, где ряд скоростей SPI такой:
0 - 740 kHz*, 1 - 460.8 kHz, 2 - 230.4 kHz, 3 - 57.6 kHz и т.д.
+ Увеличил максимальную скорость (код скорости 0):
для кварца 11.059 МГц получается 580 кГц, для 14.7456 МГц - 740 кГц, для 18.432 МГц - 921 кГц