Atmega8 не соответствует частота

3d_killer
Offline
Зарегистрирован: 13.06.2018

Здравствуйте, попробовал на 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

-NMi-
Offline
Зарегистрирован: 20.08.2018

1 подай внешнюю тактовку в 8 мГц.

2 есть фьюз (непомню, чото clkout) который выводит тактовку на пин (см. датащи) и измерь его осциллом

3 если нет пунктов 1 и 2 - на любом таймере аппаратными прескалерами сделай вывод ~~1 Гц и измеряй. (на 8мГц "ровной" секунды не будет)

4 забить!!!

Гриша
Offline
Зарегистрирован: 27.04.2014

-NMi- пишет:

1 подай внешнюю тактовку в 8 мГц.

2 есть фьюз (непомню, чото clkout) который выводит тактовку на пин (см. датащи) и измерь его осциллом

3 если нет пунктов 1 и 2 - на любом таймере аппаратными прескалерами сделай вывод ~~1 Гц и измеряй. (на 8мГц "ровной" секунды не будет)

4 забить!!!

5 поставить ядро minicore :) и еще немного... того этого... с мозгом... до просветления :) 

Plasteroid
Plasteroid аватар
Offline
Зарегистрирован: 15.07.2020

Гриша пишет:

5 поставить ядро minicore :) и еще немного... того этого... с мозгом... до просветления :) 

Гриш, тута люди простых путей не  исчут.

Гриша
Offline
Зарегистрирован: 27.04.2014

Plasteroid пишет:

Гриша пишет:

5 поставить ядро minicore :) и еще немного... того этого... с мозгом... до просветления :) 

Гриш, тута люди простых путей не  исчут.

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

А про наборы готовых загрузчиков, для несколько нестандартного применения МК (в смысле для ардуино) в инете глаза разбегаются...