roboforum.ru

Технический форум по робототехнике.

MiniBot Bootloader

Готовая электроника для самодельного робота. Уровень от начинающих до опытных конструкторов.

Re: MiniBot Bootloader

Сообщение SMT » 13 янв 2009, 20:01

2Vooon: спасибо за твой труд - твой бутлоадер в Минибот успешно зашил :beer:
Наверное у всех уже роботы бутлоадерами оборудованы :D Вот и мне надоело программатор подключать/отключать. Да и "таргет-группа" не одобрит такую мороку.
Бутлоадер из примеров BASCOM-а демо версией не скомпилился.
Начал с твоим разбираться. Прошиваю AVRDude. Сначала установил в опции avr109, но получил ошибку. Теперь использую avr911.
Для интересующихся:
Минибот подключен через USB2UART переходник, представленный на компьютере как COM4
На компе установлена WinAVR, в соств которого входит утилита AVRDude.
В папке с проектами создается командный файл файл bl.cmd
Код: Выделить всёРазвернуть
@copy %1 tmp.hex
@echo Reset of the Minibot and during 1 second...
@pause
@echo S >com4
@C:\WinAVR\bin\avrdude.exe -p m32 -P com4 -b 9600 -c avr911 -u -U flash:w:tmp.hex
@pause

пояснения:
командный файл получает параметром имя файла прошивки (hex-файла). Затем он его копирует в промежуточный файл tmp.hex - это для решения проблемы длинных имен.
@copy %1 tmp.hex
затем исполнение останавливается: нужно нажать на роботе Reset - запустится бутлоадер, который 1 секунду будет ожидать символ S из UART-а, чтобы начать программирования, в ином случае просто запускается существующая программа. Вот в течение этой секунды и нужно нажать на любую клавишу, чтобы выполнились следующие команды:
посылаем символ S в COM4
@echo S >com4
запускаем AVRDude
@C:\WinAVR\bin\avrdude.exe -p m32 -P com4 -b 9600 -c avr911 -u -U flash:w:tmp.hex
получаем на экране
AVRDudeWithBootloader.png

останавливаемся, если интересно (не обязательно)

Для прошивки робота бутлоадером из BASCOM-а настраивается "внешний программатор"
Menu\Options\Programmer
BascomExtProgrammerOption.png
Настройка внешнего программатора в BASCOM


Немного напрягает то, что нужно торопиться за 1 секунду нажать кнопку.

Интересно как в Мниботе 2 это реализовано
SMT
 
Сообщения: 1158
Зарегистрирован: 23 авг 2008, 22:28
Откуда: Санкт-Петербург
ФИО: Сергей

Re: MiniBot Bootloader

Сообщение Vooon » 13 янв 2009, 20:34

Небольшой хинт:

Если сделать прием команд в основной программе, то можно не париться с 1 сек.

Просто выбрать комманду, по которой робот уйдет в RESET (для моей прошивки это 'Q00FF50A055AA').

Но потребуется малюсенькая програмка загоняющая бота в режим программирования.

Выглядит примерно так:
Код: Выделить всёРазвернуть
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from serial import Serial
from optparse import OptionParser

def dev_start_bootloader(ser):
    ser.setTimeout(0.300)               # set readlines timeout 300 ms
    ser.write("QFF0050A055AA\n")        # reset
    ser.readlines()                     # flush input buffer && wait 300 ms
    ser.write("SSSSSSSSSSSSSSSSSSS")    # enter to bootloader
    if "AVRBOOT" in ser.readlines()[0]: # test bootloader output
        return True
    else:
        return False
       
def main():
    parser = OptionParser()
    parser.add_option("-p", "--port", dest="port", help="communication port",
                      metavar="FILE", default=CDEV)
    parser.add_option("-b", "--baud", dest="baud", help="baud rate",
                      metavar="N", default=BAUD)
    (options, args) = parser.parse_args()
   
    ser = Serial(options.port, options.baud)
   
    if dev_start_bootloader(ser):
        print "Started"
    else:
        print "Error"

if __name__ == "__main__":
    main()
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: MiniBot Bootloader

Сообщение SMT » 13 янв 2009, 22:53

что значит
Vooon писал(а):для моей прошивки это 'Q00FF50A055AA'

идея послать роботу командную последовательность - это в основную программу? Чтобы заработал загрузчик - МК нужно перестартовать. В какой прошивке анализируется эта драматичная последовательность? В коде main.c такого вроде не обнаружил.
SMT
 
Сообщения: 1158
Зарегистрирован: 23 авг 2008, 22:28
Откуда: Санкт-Петербург
ФИО: Сергей

Re: MiniBot Bootloader

Сообщение MiBBiM » 13 янв 2009, 23:36

прошивка - [[MiniBot-SerControl]]
файл config.h - настройка кодового слова:
Код: Выделить всёРазвернуть
/// Soft RESET -> QFF0050A055AA
#define QRESET      0x50
#define QRES_CMP1   0xA0
#define QRES_CMP2   0x55
#define QRES_CMP3   0xAA

файл requests.c - реализация:
Код: Выделить всёРазвернуть
static inline bool local_request(int address, uint8_t* request, int req_len,
        uint8_t* answer, int ans_len)
    {

    // RESET?
    if ( request[0] == QRESET && req_len == 4 )
        {
        if ( (request[1] == QRES_CMP1)||(request[2] == QRES_CMP2)||(request[3] == QRES_CMP3) )
            {
            wdt_enable(WDTO_15MS);
            while ( true )
                { // wait reset on wdt
                };
            }
        else
            puts("X12ResetNCmp");

        return false;
        }

классный ход - активировать собачку :good:

Добавлено спустя 17 минут 3 секунды:
добавил в интерпретатор. команда "Reset", перезагрузка через 128мс
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: MiniBot Bootloader

Сообщение SMT » 14 янв 2009, 01:42

класс :)
а сброс возможен только через WatchDog timer, я так понимаю.
софт-резет мне нравится, но есть вопросы.

насколько я понял, если нам нужно обновить прошивку - действуем так:
I) в роботе который постоянно общается по UART
1. управляющая программа, которая общается c роботом отпускает порт
2. запускается некая утилита, которая в порт робота посылает кодовое слово "Сброс" (набор байт), о которому его МК сбрасывается и активируется бутлоадер
3. посылаем символ(ы?) S
4. отпускаем порт и запускаем [например] AVRDude. Здесь не знаю в какой момент это можно сделать - я знаю, что бутлоадер на символ S возвращает AVRBOOT, но вот нужно ли это слово программатору или его можно использовать утилитой сброса как признак готовности бутлоадера - не знаю.
5. по окончании работы AVRDude возвращаем управление управляющей программе

II) в автономном роботе который не нуждается в общении по UART постоянно
1. подключаемся к UART робота (проводом, BT или ZigBee)
а) ожидая, что робот периодически читает UART
б) заставляем робота читать UART кнопкой (на борту или ИК-пульте)
2,3,4 как в предыдущем варианте
5. отключаемся от UART-а робота

а еще такой вариант
III) в автономном роботе который не нуждается в общении по UART постоянно
1. подключаемся к UART робота (проводом, BT или ZigBee)
2. запускается некая утилита, которая в порт робота циклически посылает кодовое слово "Ожидаю бутлоадер" (набор байт)
3. нажимаем на Reset робота - запускается бутлоадер, который читает слово "Ожидаю бутлоадер", возвращает "Готов" и ждет 1 секунду символ S
4. роботу посылаем символ S (мы знаем, что бутлоадер ждет его прямо сейчас)
5. отпускаем порт и запускаем [например] AVRDude
6. отключаемся от UART-а робота

для "потрещать", наверное, напомню как программируется iRobot Create (по проводу, во всяком случае - не знаю как по BT)
- "коммандный модуль поставляется с бутлоадером (BL), предустановленным во flash-память, позволяет загружать собственные программы используя Programmers Notepad и avrdude [теперь знаю что это] способен апдейтировать оставшуюся память модуля (Flash и EEPROM)".условия запуска BL или собственной программы:
* USB кабель подключен когда к.модуль сбрасывается (reset) - BL стартует, иначе - стартует программа
* Каждый раз, когда USB кабель подключается, BL стартует, даже в середине запущенной программы
* С подключенным USB кабелем - если удерживается "soft"-кнопка и сбрасывается (reset) к.модуль - программа стартует
SMT
 
Сообщения: 1158
Зарегистрирован: 23 авг 2008, 22:28
Откуда: Санкт-Петербург
ФИО: Сергей

Re: MiniBot Bootloader

Сообщение Vooon » 14 янв 2009, 03:11

Символ 'S' совпадает с запросом программатора/бутлоадера «кто ты?» (протокол avr911/avr109)
На что он всегда отвечает «AVRBOOT»
А после того как входим в режим программирования, приняв первый 'S' бутлоадер будет ждать команд до посинения (или пора не сбросят).
Посылаю несколько 'S' для надежности: один символ по USB-UART или BT-UART может долго не передаваться,
а как бонус получаем назад строку "AVRBOOTAVRBOOTAV..." и можно простым сравнением строк проверить,
что мы действительно вошли в режим программирования.

Алгоритм прошивки (с главной программой на ПС):
  1. Даем команду сброса.
  2. Ждем 300 — 600 мс.
  3. Отправляем "SSSSSSSS...".
  4. Читаем строку, если в ней не находятся подстроки "AVRBOOT", значит повторить действия начиная с 1.
  5. Отпускаем порт
  6. Запускаем avrdude с нужными параметрами (на самом деле конечно можно встроить это в свою программу, но зачем?)
  7. По завершению avrdude переинициализируем программу, продолжаем управлять

А в случае автономного бота, думаю проще воспользоваться кнопкой ресета.
Хотя можно и повесить прерывание по приходу байта, по получению определенной последовательности делать софт-ресет.
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Пред.

Вернуться в МиниБот — национальный класс роботов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3