Таймер Atmega8 на скетче от IDE 1.6.5

Тема в разделе "Arduino & Shields", создана пользователем DrProg, 15 окт 2015.

  1. DrProg

    DrProg Вечный нерд

    С Атмегой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
     
    Последнее редактирование: 15 окт 2015
    ИгорьК нравится это.
  2. 9xA59kK

    9xA59kK Гик

    Не правильно прошил fuse HiGH и LOW byte , в них же и выставляется частота и прочее. Посмотри FUSE калькулятор. И отредактируй txt файл в соответствии с этим калькулятором.
    Немного про фъюзы
     
  3. DrProg

    DrProg Вечный нерд

    Всеправильно выставил и по калькулятору и проверил по даташиту. 8МГц внутренний.
    [​IMG]
     
    ИгорьК нравится это.
  4. AlexU

    AlexU Гуру

    Есть мнение, что Вы двигаетесь в правильном направлении.
    Согласно исходников функция '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'. Поэтому можно сделать следующие выводы:
    1. либо с настройками таймера, что-то не так;
    2. либо IDE по своему разумению переопределяет константу 'F_CPU'.
    И скорее всего второе, т.к. при компиляции скетча с фрагментом кода:
    Код (C++):
    #define F_CPU 300

    #define F_CPU 600
    IDE не выдало ни каких предупреждений, в то же время комптлятор 'g++' выдает предупреждение о переопределении константы.
     
  5. DrProg

    DrProg Вечный нерд

    Ну и вот как заставить компилятор принять мой F_CPU? В стандартном наборе МК у IDE есть одна единственная Atmega8, и она настроена на 16МГц. В boards.txt об этом ничего нет, не понимаю откуда оно берет настройки.
     
    ИгорьК нравится это.
  6. AlexU

    AlexU Гуру

    В описании по ссылке 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-я запись сверху.....
     
    DrProg нравится это.
  7. DrProg

    DrProg Вечный нерд

    Попробую. Я на это даже внимания не обратил, она и на 168 и на 8 распространяется что ли?
     
    ИгорьК нравится это.
  8. AlexU

    AlexU Гуру

    Честно говоря не знаю.
    Пользую Eclipse (Atmel Studio что-то не хочет в Linux через Wine запускаться) -- в нем отдельно для каждого проекта можно настроить параметры контроллера и более гибко управлять опциями компиляции.
     
  9. DrProg

    DrProg Вечный нерд

    Отлично! Именно то что нужно!. Это называется "слона то я и не заметил", искал всю ночь, а оно было на несколько строк выше. Вот теперь все замечательно, спасибо большое!
     
    ИгорьК нравится это.
  10. 9xA59kK

    9xA59kK Гик

    Когда я прошивал мегу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
    Сверь с таким. Только надо путь к бутлоадеру вставить.
     
    Последнее редактирование: 16 окт 2015
  11. DrProg

    DrProg Вечный нерд

    Фьюзы разве шьются из HEX? Я вот что вручную выставил, то и осталось несмотря на настройки компилятора. Во всяком случае через AVRDUDE.

    И еще, зачем бутлоадер, если шьется программатором?
     
    ИгорьК нравится это.
  12. 9xA59kK

    9xA59kK Гик

    Я использовал бутлоадер ардуиновский под мегу8. Если ты перепрошиваешь через ардуино ISP с помощью AVRDUDE то и фъюзы прошиваешь с помощью нее. А как можно подругому? Я пробовал только так, ну и как находил примеры и все работает нормально.
     
  13. DrProg

    DrProg Вечный нерд

    На IDE делаю HEX, его прошиваю при помощи AVRDUDE, фьюзы им же подкручиваю. Немного дольше, но во-первых 8 не шьется через IDE почему то, во-вторых через дудку гибче и понятнее,
     
    ИгорьК нравится это.
  14. 9xA59kK

    9xA59kK Гик

    Где то мне попадалось в инете почему такое бывает, может со скоростью порта надо по экспериметировать .
    Если шить с помощью ардуины которая выступает в роли программатора с загруженым в нее скетч ARDUINO ISP, то можно что угодно накрутить. И заливается скетч только с помощью AVRDUDE. IDE использует AVRDUDE для прошивки ардуино и прочих атмеловских контроллеров. Я пробовал ATtiny8, мегу8, мегу328 с кварцем и без , все шьются с помощью ардуины отлично. Можно и отдельно HEX залить через ардуино ISP.
     
    DrProg нравится это.
  15. DrProg

    DrProg Вечный нерд

    У меня пока не получилось, tiny 85 без проблем, а эта нет, надо разбираться.
     
    ИгорьК нравится это.
  16. 9xA59kK

    9xA59kK Гик

    Я пробовал tiny85, там не надо указывать бутлоадер, а вот с мегой8 у меня не работало без него. Поэтому я остановился пока на том что работает. И собрал кормушку для аквариума на меге8 без кварца и на 1МГц.
    Я пробовал прошить мегу по этой статье, там пример без бутлоадера. У него же интересный конструктор загрузчика посмотри. Там настройки частоты и делителя есть и как это все будет выглядеть.
     
    Последнее редактирование: 16 окт 2015
    DrProg нравится это.
  17. DrProg

    DrProg Вечный нерд

    Спасибо, статьи очень интересные и полезные. Но для данных готовых устройств загрузчик пока не нужен, поработают на голом коде. Атмега 8 прекрасно работает без бутлоадера. Буду в ряде случаев заменять ей Про Мини, на которой раньше базировался чаще всего.
     
    ИгорьК нравится это.