С Атмегой8 по большому счету разобрался. Остался открытым вопрос: как сделать так, чтобы ее внутренняя жизнь соответствовала реальному течению времени? Поясню. По умолчанию Атмаге8 работает на внутренней частоте 1МГц. При заливе тестового скетча blink, в котором вкл-выкл светодиода чередуется каждую 1 сек, светодиод переключался каждые 16 сек (то есть Атмега думает что работает на 16МГц). Поковыряв фьюзы я установил внутреннюю частоту на 8МГц, светодиод стал мигать быстрее, т.е. раз в 2 сек. Но это тоже не правильно. Возлагал надежду на эту настройку: Код (C++): #define F_CPU 8000000 Которая, якобы, должна указать программе частоту МК. Но ничего не изменилось. Так каким образом вернуть ее в реальный мир? И вот еще что, в boards.txt нет установок частоты: Код (C++): atmegang.menu.cpu.atmega8=ATmega8 atmegang.menu.cpu.atmega8.upload.maximum_size=7168 atmegang.menu.cpu.atmega8.upload.maximum_data_size=1024 atmegang.menu.cpu.atmega8.bootloader.low_fuses=0xe4 atmegang.menu.cpu.atmega8.bootloader.high_fuses=0xca atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex atmegang.menu.cpu.atmega8.build.mcu=atmega8
Не правильно прошил fuse HiGH и LOW byte , в них же и выставляется частота и прочее. Посмотри FUSE калькулятор. И отредактируй txt файл в соответствии с этим калькулятором. Немного про фъюзы
Есть мнение, что Вы двигаетесь в правильном направлении. Согласно исходников функция 'delay()' использует функцию 'micros()', код которой: Код (C++): unsigned long micros() { unsigned long m; uint8_t oldSREG = SREG, t; cli(); m = timer0_overflow_count; #if defined(TCNT0) t = TCNT0; #elif defined(TCNT0L) t = TCNT0L; #else #error TIMER 0 not defined #endif #ifdef TIFR0 if ((TIFR0 & _BV(TOV0)) && (t < 255)) m++; #else if ((TIFR & _BV(TOV0)) && (t < 255)) m++; #endif SREG = oldSREG; return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); } Код макроса 'clockCyclesPerMicrosecond()': Код (C++): #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) Константа 'F_CPU' влияет на результат функции 'micros()', так же как и конфигурация таймера 'TIMER 0'. Поэтому можно сделать следующие выводы: либо с настройками таймера, что-то не так; либо IDE по своему разумению переопределяет константу 'F_CPU'. И скорее всего второе, т.к. при компиляции скетча с фрагментом кода: Код (C++): #define F_CPU 300 #define F_CPU 600 IDE не выдало ни каких предупреждений, в то же время комптлятор 'g++' выдает предупреждение о переопределении константы.
Ну и вот как заставить компилятор принять мой F_CPU? В стандартном наборе МК у IDE есть одна единственная Atmega8, и она настроена на 16МГц. В boards.txt об этом ничего нет, не понимаю откуда оно берет настройки.
В описании по ссылке file:///home/alexandr/work/electric/arduino-1.6.5-r5/reference/arduino.cc/en/Guide/Environment.html в разделе про поддерживаемые платы можно найти такую запись: Содержание boards.txt в моей системе 'Arduino IDE 1.6.5 for Linux': Код (Text): atmegang.name=Arduino NG or older atmegang.upload.tool=avrdude atmegang.upload.protocol=arduino atmegang.upload.speed=19200 atmegang.bootloader.tool=avrdude atmegang.bootloader.unlock_bits=0x3F atmegang.bootloader.lock_bits=0x0F atmegang.build.mcu=atmegang atmegang.build.f_cpu=16000000L atmegang.build.board=AVR_NG atmegang.build.core=arduino atmegang.build.variant=standard ## Arduino NG or older w/ ATmega168 ## -------------------------------- atmegang.menu.cpu.atmega168=ATmega168 atmegang.menu.cpu.atmega168.upload.maximum_size=14336 atmegang.menu.cpu.atmega168.upload.maximum_data_size=1024 atmegang.menu.cpu.atmega168.bootloader.low_fuses=0xff atmegang.menu.cpu.atmega168.bootloader.high_fuses=0xdd atmegang.menu.cpu.atmega168.bootloader.extended_fuses=0x00 atmegang.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_ng.hex atmegang.menu.cpu.atmega168.build.mcu=atmega168 ## Arduino NG or older w/ ATmega8 ## ------------------------------ atmegang.menu.cpu.atmega8=ATmega8 atmegang.menu.cpu.atmega8.upload.maximum_size=7168 atmegang.menu.cpu.atmega8.upload.maximum_data_size=1024 atmegang.menu.cpu.atmega8.bootloader.low_fuses=0xdf atmegang.menu.cpu.atmega8.bootloader.high_fuses=0xca atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex atmegang.menu.cpu.atmega8.build.mcu=atmega8 Может попробывать поправить то, что выделил жирным. (Но на Ваш страх и риск) Аааа, выделение в разделе кода не работает -- 9-я запись сверху.....
Честно говоря не знаю. Пользую Eclipse (Atmel Studio что-то не хочет в Linux через Wine запускаться) -- в нем отдельно для каждого проекта можно настроить параметры контроллера и более гибко управлять опциями компиляции.
Отлично! Именно то что нужно!. Это называется "слона то я и не заметил", искал всю ночь, а оно было на несколько строк выше. Вот теперь все замечательно, спасибо большое!
Когда я прошивал мегу8 , тоже самое получил как у вас. Когда разбирался с фъюзами и прошивал на версии IDE 1.0.5, там все понятно куда и чего вставлять в .txt файле. А с IDE 1.6.5 пока не разобрался. Посмотри может поможет. У меня на 1MГц lfuse:w:0xE1 hfuse:w:0xD9 Не могу проверить точнее , все на работе лежит. IDE 1.0.5 Код (C++): ############################################################## atmega8o.name=[Optiboot] Arduino NG or older w/ ATmega8 atmega8o.upload.protocol=arduino atmega8o.upload.maximum_size=7680 atmega8o.upload.speed=115200 atmega8o.bootloader.low_fuses=0xE1 atmega8o.bootloader.high_fuses=0xD9 atmega8o.bootloader.path= Ввести сюда ПУть к БУТЛОАДЕРУ!!!!! atmega8o.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex atmega8o.bootloader.unlock_bits=0x3F atmega8o.bootloader.lock_bits=0x0F atmega8o.build.mcu=atmega8 atmega8o.build.f_cpu=100000L atmega8o.build.core=arduino:arduino atmega8o.build.variant=arduino:standard Сверь с таким. Только надо путь к бутлоадеру вставить.
Фьюзы разве шьются из HEX? Я вот что вручную выставил, то и осталось несмотря на настройки компилятора. Во всяком случае через AVRDUDE. И еще, зачем бутлоадер, если шьется программатором?
Я использовал бутлоадер ардуиновский под мегу8. Если ты перепрошиваешь через ардуино ISP с помощью AVRDUDE то и фъюзы прошиваешь с помощью нее. А как можно подругому? Я пробовал только так, ну и как находил примеры и все работает нормально.
На IDE делаю HEX, его прошиваю при помощи AVRDUDE, фьюзы им же подкручиваю. Немного дольше, но во-первых 8 не шьется через IDE почему то, во-вторых через дудку гибче и понятнее,
Где то мне попадалось в инете почему такое бывает, может со скоростью порта надо по экспериметировать . Если шить с помощью ардуины которая выступает в роли программатора с загруженым в нее скетч ARDUINO ISP, то можно что угодно накрутить. И заливается скетч только с помощью AVRDUDE. IDE использует AVRDUDE для прошивки ардуино и прочих атмеловских контроллеров. Я пробовал ATtiny8, мегу8, мегу328 с кварцем и без , все шьются с помощью ардуины отлично. Можно и отдельно HEX залить через ардуино ISP.
Я пробовал tiny85, там не надо указывать бутлоадер, а вот с мегой8 у меня не работало без него. Поэтому я остановился пока на том что работает. И собрал кормушку для аквариума на меге8 без кварца и на 1МГц. Я пробовал прошить мегу по этой статье, там пример без бутлоадера. У него же интересный конструктор загрузчика посмотри. Там настройки частоты и делителя есть и как это все будет выглядеть.
Спасибо, статьи очень интересные и полезные. Но для данных готовых устройств загрузчик пока не нужен, поработают на голом коде. Атмега 8 прекрасно работает без бутлоадера. Буду в ряде случаев заменять ей Про Мини, на которой раньше базировался чаще всего.