Микроконтроллеры | Софтовая часть программатора для ATMega16 |
|
---|---|---|
Всем привет, Скажу сразу - делаю курсовик, поэтому выбор лпт порта и "изобретание велосипеда" - самому не особо нравиться, но теперь уже разбираюсь и пытаюсь с этим бороться. Задача: Программа, написанная на одном из языков высокого уровня для ПК, которая осуществляет запись скомпилированной программы с использованием одного из стандартных портов (LPT) в микроконтроллер (ATMEGA16). Записанная программа должна быть представлена в HEX коде. Ситуация на данный момент следующая: 1. Задача по прежнему - написать софтину, которая прошивает амегу16 Локальная задача, которую необходимо решить: Алогритм входа в режим программирования (из даташита): Вот, т.е хорошей проверкой того правильно я сделал или нет - будет то что при посылке 3его байта я получу в ответ $53. Но увы, пока этого не происходит, с чем и прошу помочь разобраться. Прошу посмотрите как делаю в коде, возможно логика не та у меня и делаю не правильно: Решился писать в Дельфях, потому что удобную либо под лпт нашел, если у кого то неприязнь к паскалю - заранее сорри. Комментарии к коду справа, после // Да и ещё, - по даташиту: Запись в контроллер происходит по фронту, а чтение из мк по спаду. Т.е если я правильно понял, чтобы мк считал 1 например - я сначала её выставляю, а потом подаю положительный импульс на SCK. Поигрался с задержками импульсов, временем чтения выхода (MISO) - резульатат по прежнему один: в контроллер байты передаются от контроллера отклика не получаю. (Проверял это дело этой софтиной - xlpt - в мк байты идут, отклика нет) Привожу ниже листинг того, что в коде творится теперь: В глобальных переменных имеем 2 массива на входные и выходные 4 байта инструкций:
Процедура SPISend(spi_cmd); - которой в качестве параметра дается массив с 4мя байтами инструкции.
Небольшое пояснение:
Теперь инструкция на Programming Enable [1010 1100 | 0101 0011 | xxxx xxxx | xxxx xxxx] выглядит так:
Значение на выходе MISO не меняется вообще. Как стоит 1 так до конца и не меняется. В результате чего значение spi_out: Пытался читать и вовремя прихода импульса и до и после - нужного результата не дало. Прошу помощи и свежего взгляда со стороны. |
|
|
Первое, что бросается в глаза - у Вас задержка только между фронтом и спадом. Добавьте еще и между спадом и фронтом, т.е. в конце цикла перед чтением входа. А еще лучше так: Выставили Дайте время отработать драйверам и железу. |
|
|
Кстати данные надо пихать и читать начиная со старшего бита (MSB). При этом первый бит СЧИТЫВАЕТСЯ еще до первого фронта SCK. (может я не ту диаграмму смотрю?) |
|
|
Ну и тактовый сигнал Вы не забыли на XLAT1 подать? |
|
|
Ув zi4rox, если интересно, могу выложить исходники своего программатора для Mega128 через COM, а также исходники еще одного своего, "автономного", программатора. Во вложении - его внешний вид. |
|
|
Dron_Gus, спасибо за идею - попробую поиграться с задержками. А вот про порядок чтения битов это я дал маху - поправлю. chav1961, было бы просто здорово если бы вы смогли выложить ваши исходники. Будет очень полезно. |
|
|
В архиве - исходник для Mega128 и проект для WinAVR GCC. Меговский исходник постарее и с багом - не пишет несколько фузов подряд. Проект поновее и баг в нем устранен, но он не виндовый - его нужно для работы загружать в мегу8. Думаю, разберетесь Тактовый сигнал ни в том, ни в другом программаторе я на XLAT не подаю - программаторы ориентированы на внутрисхемное программирование, поэтому предполагается, что если тактовые импульсы нужны, то их источник в схеме присутствует. |
|
|
Получилось войти в режим программирования! Отклик получил. Через пару дней продолжу работу. Буду пробывать считать прошивку с мк. Если что не получиться - я к вам за помощью. Ещё раз всем спасибо за дельные идеи и советы. |
|
|
Разорабрался, как и читать и ситрать и записывать прошивку в память. Конечно же первое время прыгал до потолка от радости - но тут же перестал, потому что работала прога совершенно неприемлимо долго! открыл для себя удивительный мир двоичной математики и переписал главную процедуру записи 4 байтов инструкции в память. [code]
[/code] Работать стало быстрее, но все равно до приемлимых скоростей ещё далековато. Меня больше всего волнует чтение. Потому что приходиться читать все 16кб памяти в идеале - и никаких тебе ухищрений - поэтому нужен оптимальный алгоритм. [для записи - я сделал так что записываю в память не все подряд каждый байт по своему адрему, а только то что нужно. Т.е - если сама прошивка весит 200байт - то 200 байт и запишется, а не все 16кбайт вместе с пустыми яйчекйками] - так что основная цель - сделать так чтобы была приемлимая скорость чтения Ребят помогите пожалуйста - из за чего может тормозить, направьте плиз в сторону более оптимального кода. Сейчас процедура чтения выглядит так: [code]
[/code] * 4 байта инструкции на чтение выглядят так: Вот такие пироги - я и правда сейчас в ступоре и как улучшить произовдительность не знаю. Есть мысль, что не высокая скорость работы - вызвана нехорошей реализацией класса для работы с LPT. Текущие характеристики: * Насколько мне известно у лпт потолок около 2мб/сек - но таких больших то и не надо. Но 4 минуты - это невыносимо =(( |
|
|
Боюсь, что здесь уже ничем не помочь - манипуляции ногами портов (что LPT, что COM) под Виндой свежее Win98 идут очень медленно. Я писал программаторы под COM-порты, там картина почти та же самая. Можно вытащить за цикл вызов функции GetCurrentPort (а лучше - вообще за функцию), но вряд ли это серьезно поможет. |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |