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 :) и еще немного... того этого... с мозгом... до просветления :)
Гриш, тута люди простых путей не исчут.
ИМХО. на пороге вхождения в программирования МК очень многое не понятно. Вопрос поставлен достаточно адекватно, посчитать фьюзы самому, то еще удовольствие - если этого не делал. И один из простых путей - как раз спросить на форуме. Тут ведь в большинстве приходят радиоГубители, а некоторые даже перспективные :) Если человек не строит умный дом с нулем знаний в своей первой теме на форуме, можно попробовать помочь.
А про наборы готовых загрузчиков, для несколько нестандартного применения МК (в смысле для ардуино) в инете глаза разбегаются...