Atmega8 не соответствует частота
- Войдите на сайт для отправки комментариев
Вс, 02/08/2020 - 09:38
Здравствуйте, попробовал на Atmega8 сделать диммер, взял код из интернета собрал схему, установил кварц на 8 мгц, прошил фьюзы, долго возился пока понял частота не соответствует установленной не пойму где что поправить вроде работает с устанокой delay больших задержек, но лампа все равно немного помигивает, не могу разобраться как исправить тайминги и убрать мерцание.
Вот такой delay соответствует примерно 1 секунде: delay(100000);
Фьюзы:https://yadi.sk/i/kij2_p8uA4VJ6w
Boards:
############################################################## 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=8000000L 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=0xF8 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.extended_fuses= atmegang.menu.cpu.atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex atmegang.menu.cpu.atmega8.build.mcu=atmega8 ##############################################################
Код программы:
/* Диммер переменки на Arduino. Симистор через оптопару подключен к 4 пину, детектор нуля ко 2 пину. Переменная Dimmer - величина диммирования, от 0 до 255 В этом коде на пин А0 подключен потенциометр для управления яркостью Также можно вводить число для переменной Dimmer через монитор порта, для этого в лупе надо раскомментировать код */ #define dimPin 4 #define zeroPin 3 #include "TimerMy.h" volatile int tic, Dimmer; void setup() { pinMode(dimPin, OUTPUT); digitalWrite(dimPin, 0); pinMode(zeroPin, INPUT); // настраиваем порт на вход для отслеживания прохождения сигнала через ноль attachInterrupt(1, detect_up, FALLING); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень TimerNew.initialize(40); TimerNew.attachInterrupt(timer_interrupt); TimerNew.stop(); // остановить таймер } void loop() { // раскомментировать для ввода числа диммирования чеерез монитор порта (0 - 255) Dimmer = 1800; delay(50000); Dimmer = 200; delay(100000); Dimmer = 220; delay(50000); // раскомментировать для управления потенциометром (аналоговый А0) // Dimmer = map(analogRead(0), 0, 1023, 240, 0); } //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ-------------------------- void timer_interrupt() { // прерывания таймера срабатывают каждые 40 мкс tic++; // счетчик if (tic > Dimmer) // если настало время включать ток digitalWrite(dimPin, 1); // врубить ток } void detect_up() { // обработка внешнего прерывания на пересекание нуля снизу tic = 0; // обнулить счетчик TimerNew.resume(); attachInterrupt(1, detect_down, RISING); // перенастроить прерывание } void detect_down() { // обработка внешнего прерывания на пересекание нуля сверху tic = 0; // обнулить счетчик TimerNew.stop(); digitalWrite(dimPin, 0); // вырубить ток attachInterrupt(1, detect_up, FALLING); // перенастроить прерывание } //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
Выбрано Arduino NG or older и проц Atmega8
1 подай внешнюю тактовку в 8 мГц.
2 есть фьюз (непомню, чото clkout) который выводит тактовку на пин (см. датащи) и измерь его осциллом
3 если нет пунктов 1 и 2 - на любом таймере аппаратными прескалерами сделай вывод ~~1 Гц и измеряй. (на 8мГц "ровной" секунды не будет)
4 забить!!!
1 подай внешнюю тактовку в 8 мГц.
2 есть фьюз (непомню, чото clkout) который выводит тактовку на пин (см. датащи) и измерь его осциллом
3 если нет пунктов 1 и 2 - на любом таймере аппаратными прескалерами сделай вывод ~~1 Гц и измеряй. (на 8мГц "ровной" секунды не будет)
4 забить!!!
5 поставить ядро minicore :) и еще немного... того этого... с мозгом... до просветления :)
5 поставить ядро minicore :) и еще немного... того этого... с мозгом... до просветления :)
Гриш, тута люди простых путей не исчут.
5 поставить ядро minicore :) и еще немного... того этого... с мозгом... до просветления :)
Гриш, тута люди простых путей не исчут.
ИМХО. на пороге вхождения в программирования МК очень многое не понятно. Вопрос поставлен достаточно адекватно, посчитать фьюзы самому, то еще удовольствие - если этого не делал. И один из простых путей - как раз спросить на форуме. Тут ведь в большинстве приходят радиоГубители, а некоторые даже перспективные :) Если человек не строит умный дом с нулем знаний в своей первой теме на форуме, можно попробовать помочь.
А про наборы готовых загрузчиков, для несколько нестандартного применения МК (в смысле для ардуино) в инете глаза разбегаются...