Фишка в том, что Arduino IDE всегда использует "дудку" для прошивки плат. Только по умолчанию используется программатор типа 'arduino', но среда позволяет шить и с помощью других типов программаторов. Поэтому, если кому-то нравиться использовать внешние программаторы, то пожалуйста... Не знаю как в версии 1.5.5, но в последних версиях (1.6.11 и 1.6.12) есть команда "Скетч" -> "Экспорт бинарного файла". Данная команда сохранит два *.hex файла: *.standart.hex -- содержит только скетч и *.with_bootloader.standard.hex -- содержит скетч и бутлоадер. Первый шьётся программатором 'arduino' (этот программатор использует бутлоадер МК), второй любым другим. Первый так же можно прошить любым другим, но МК останется без бутлоадера. Навскидку: Код (C++): uint16_t regUBRR = UBRRH; regUBRR <<= 8; regUBRR |= UBRRL; serial.print("UBRR = 0x"); serial.println(regUBRR, 16); serial.print("F_CPU = "); serial.println(F_CPU); последовательный порт пусть и криво, но всё-таки работает, поэтому может выдать отладочную информацию.
Всё равно не понял-ну да ладно Человек на меня обиделся (Малышеву выложил) а мне и вправду интересно было. Наверное память на бутлоадере экономит. Сейчас тоже сделал показометр на LCD. Писать на нормальном Си не стал потому что влом плату разводить а в Wiring проще просто нацепил "нужные" выводы к "нужным" и вуаля! У Меги 8 под это дело памяти немеренно.....Вдул скетч через USB откатал. На этом вроде и всё..Прибор работает. Причём прошивку можно на ходу модифицировать особо не парясь опять же через USB. Но вот понадобилось на Форуме выложить НЕХ чтоб народ смог "голую" Мегу прошить пятью проводками например не вдаваясь в дебри Ардуино. Но конечно через Бут шить удобнее да и шанс накосячить меньше. Всё нашёл папку!Спасибо Вам огромное!Искал долго и мучительно но нашёл.НЕХ лежат в папке C:\Documents and Settings\Alexx\Local Settings\Temp\build4084106313691437242.tmp
К сожалению, они лежат каждый раз в разных папках. Я пользуюсь поиском, если нужен hex, далеко не все ядра его выкладывают в папку проекта.
Потому что в контроллере два интерфейса USART, а я это не учёл -- код брал из оф.документации, а в ней похоже ошибка. Правильней будет так: Код (C++): uint16_t regUBRR = UBRR0H; // используется USART_0, для USART_1 -- UBRR1H regUBRR <<= 8; regUBRR |= UBRR0L; // используется USART_0, для USART_1 -- UBRR1L serial.print("UBRR = 0x"); serial.println(regUBRR, 16); serial.print("F_CPU = "); serial.println(F_CPU); serial.print("CLKPR = "); // На всякий случай проверим реальную частоту, на которой serial.println(CLKPR); // работает контроллер Только внимательно посмотрите какой USART используете... Пока сочинял пришёл к мысли: а Вы случайно не USART_1 используете? Тогда нужно использовать Serail1 вместо Serial: Код (C++): Serial1.begin(9600); Это временная папка, создается в момент компиляции (кстати содержит интересные для пользователя Arduino IDE вещи, которые много чего объясняют). После закрытия Arduino IDE папка удаляется, при запуске создаётся новая с новым именем.
Да спасибо!Я так и понял.А у Kosss я так понял "голая" мега без платы (я сначала попутал с Мегой 168 в ардуине и не мог понять почему он так шьёт теперь всё понял). Сбил меня он с толку этой фразой "В файле boards.txt стоит правильная частота 16000000L" Т-е ему нужен только НЕХ а далее всё понятно.
Всем огромное спасибо. В итоге я разобрался, что для моей ситуации UBRR должен быть равен 0x67. Сделал такой костыль Код (C++): void setup() { // put your setup code here, to run once: Serial.begin(9600); UBRR0H = 0x00; UBRR1H = 0x067; } void loop() { // put your main code here, to run repeatedly: Serial.write("Hello"); delay(500); } Работает теперь нормально, правда не совсем эстетично (для ситуации, когда я собираюсь залить скетч и забыть на века, в принципе пойдет) Всем еще раз огромное спасибо!)
Вы допустили ошибку -- должна быть пара регистров H и L: Код (C++): UBRR0H = 0x00; UBRR0L = 0x067; Не смотря на то, что проблема решена, но она решена не верным способом (Вам просто повезло), ситуация до конца не прояснилась -- суть проблемы не выявлена. Это может стать причиной не понятных проблем в будущем.
Решение найдено! Идем в папку с ардуино C:\Users\<username>\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino Там открываем HardwareSerial.cpp и находим такую вот хрень #if defined(__AVR_ATmega8__) config |= 0x80; #endif Заменяем/дописываем, без разницы, должно быть в итоге так: #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__) || defined(__AVR_ATmega16__)|| defined(__AVR_ATmega162__) config |= 0x80; #endif Усе. Все будет огонь.
А вот это уже грамотное решение. Проблема в том, что регистр UBRRH и регистр UCSRC имеют один и тот же адрес, и что бы контроллер знал какой из них менять используется старший (7) бит значения -- что собственно и делает код 'config |= 0x80;' -- "1" в 7мом бите означает, что нужно менять UCSRC. До этого исправления попытка записи в регистр UCSRC в реальности изменяла UBRRH, что приводило к установке некорректной скорости.