Вопрос

Megawollt
Offline
Зарегистрирован: 06.12.2015

Господа, если запустить атмегу на встроенном кварце 1 мгц, то секунда в millis будет уже не 1000, а в 16 раз больше?

Или я что то не так думаю? Надо сделать задержку в секунду

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

если тупо поменять кварц, то - да.

если скомпиллировать для частоты 1 мгц, то - нет.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Понял. Спасибо

Megawollt
Offline
Зарегистрирован: 06.12.2015

А вот что то мне подсказывает что все таки нет. Скомпилировал, работает медленнее

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Megawollt пишет:

А вот что то мне подсказывает что все таки нет. Скомпилировал, работает медленнее

ты фьюзы настроил, что бы 1 мегагерц было?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Надо:

1) Настроить фьюзы на 1МГц

2) В файле boards.txt для выбранного варианта платы указать частоту 1МГц в параметре .build.f_cpu=

Megawollt
Offline
Зарегистрирован: 06.12.2015

Все, спасибо, разобрался

Megawollt
Offline
Зарегистрирован: 06.12.2015

Странно, но программа постоянно перезагружается. Надо ли ставить кварц при прошивке?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Megawollt пишет:
Странно, но программа постоянно перезагружается.

Какая програма?

Megawollt пишет:

Надо ли ставить кварц при прошивке?

Тактирование при прошивке не отличается от тактирования при обычной работе микроконтроллера. Как настроены фьюзы, так и надо делать.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Кварц я убрал при прошивке. 

Программа простая. Несколько вариантов мигания диодами по принципу on-delay-off. 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Megawollt пишет:

Кварц я убрал при прошивке. 

Ещё раз:

1) Если фьюзы настроены на внешний кварц, то должен обязательно стоять внешний кварц.

2) Если фьюзы настроены на внутренний осциллятор, то внешний кварц не нужен.

Вне зависимости, прошивка это или обычная работа микроконтроллера, система тактирования не различает этих процессов.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Фьюзы на внутреннем кварце, при прошивке внешний кварц убираю

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Megawollt пишет:

Фьюзы на внутреннем кварце, при прошивке внешний кварц убираю

можно не убирать кварц

а чем прошиваете?

Megawollt
Offline
Зарегистрирован: 06.12.2015

Ардуина как isp. Софт тоже ардуина

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

вот для IDE хорошая штука, и бутлоадеры есть для всех часто используемых частот и фьюзы правильные

https://github.com/MCUdude/MiniCore

Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо. Вот код. Это просто моргалка на 4 канала с 4мя разными вариантами. Вариант 0 это выкл для всего. После 5-6 сек работы проц сваливается в перезагрузку и возвращается к программе 0. Бесит уже :)

class BUTTON {
public:
static const byte bounce_            =   100; // длительность отслеживания дребезга.
static const byte doubleclick_       =  250; // длительность отслеживания двойного нажатия.
static const unsigned long timer_    = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_ = 1500; // длительность отслеживания нажатия и удержания.
unsigned long start; // старт отсчёта времени.
boolean p;           // состояние пина кнопки.
boolean s;           // программное состояние кнопки.
boolean b;           // состояние таймера фильтра дребезга.
byte    c;           // переменная счётчика двойного нажатия.
boolean t;           // состояние таймера неактивности.
boolean r;           // состояние таймера нажатия и удержания.
boolean click_down;  // событие нажатия.
boolean click_up;    // событие отпускания.
boolean doubleclick; // событие двойного нажатия.
boolean timer;       // событие неактивности.
boolean retention;   // событие нажатия и удержания.
byte _pb;
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
start = millis();
p     = digitalRead(_pb);
s     = p;
b     = 0;
c     = 0;
t     = 0;
r     = 0;
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
}

void read() {
boolean np = digitalRead(_pb); // текущее состояние пина кнопки.
unsigned long stop = millis(); // стоп отсчёта времени.
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
if (np != p) {p = np; click(); start = stop; b = 1; t = 1; r = 1;} // состояние цифрового пина изменилось.
if (b != 0          ) {if (stop - start > bounce_     ) {b = 0; click();      }} // фильтр дребезга.
if (c != 0          ) {if (stop - start > doubleclick_) {c = 0;               }} // обнуление счётчика двойного клика.
if (t != 0 && s == 1) {if (stop - start > timer_      ) {t = 0; timer     = 1;}} // неактивность.
if (r != 0 && s == 0) {if (stop - start > retention_  ) {r = 0; retention = 1;}} // нажатие и удержание.
}

void click() { // нажатие, отпускание, двойное нажатие.
if (b == 0 && s != p) {s = p;
if (s == 0) {click_down = 1; ++c; if (c == 2) {c = 0; doubleclick = 1;}}
if (s == 1) {click_up   = 1;                                           }
}
}

};
class noDELAY {

public:
unsigned long previous;
unsigned long interval;
boolean s;
boolean tick;

noDELAY() {
previous = millis();
s        =        0;
tick     =        0;
}
void  stop()                        {s =  0;                      }
void start()                        {s =  1;                      }
void  read(unsigned long _interval) {
              interval = _interval;
unsigned long current  =  millis();                      tick = 0;
if (s == 0) {previous = current;          }
if (current - previous >  interval) {previous = current; tick = 1;}
}
};

noDELAY timer1; 
noDELAY timer2; 
noDELAY timer3; 
noDELAY timer4; 

byte prog =0;

BUTTON BUTTON_01(7);
BUTTON BUTTON_02(5);
void setup() {
digitalWrite(16,LOW);
digitalWrite(19,HIGH);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
pinMode(14,OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(6,OUTPUT);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(14,LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
timer1.start(); 
timer2.start(); 
timer3.start(); 
timer4.start(); 
}

void loop() {
BUTTON_01.read();
BUTTON_02.read();
timer1.read(random(500,3000));  
timer2.read(random(1500,2500));  
timer3.read(200);  
timer4.read(100);  
  
if (BUTTON_01.click_down) {
prog+=1;
}
if (BUTTON_01.retention) {
prog = 1;
}
if (prog > 4) {prog = 1;}

if(prog ==0){
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(14,LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
}
if(prog ==1){
digitalWrite(9,HIGH);
if(timer1.tick){
digitalWrite(random(11,14),HIGH);
}
if(timer2.tick){
digitalWrite(random(11,14),LOW);
}
}

if(prog ==2){
digitalWrite(9,HIGH);
if(timer1.tick){
digitalWrite(random(11,14),LOW);
digitalWrite(random(11,14),HIGH);
}
if(timer3.tick){
digitalWrite(random(11,14),HIGH);
digitalWrite(random(11,14),LOW);
}
if(timer2.tick){
digitalWrite(random(11,14),LOW);
digitalWrite(random(11,14),HIGH);
}
} 

if(prog ==3){
digitalWrite(9,HIGH);
if(timer4.tick){
digitalWrite(random(11,14),HIGH);
}
if(timer4.tick){
digitalWrite(random(11,14),LOW);
}
if(timer4.tick){
digitalWrite(random(11,14),HIGH);
}
if(timer4.tick){
digitalWrite(random(11,14),LOW);
}
if(timer4.tick){
digitalWrite(random(11,14),HIGH);
}
if(timer4.tick){
digitalWrite(random(11,14),LOW);
}
}

if(prog ==4){
if(timer3.tick){
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
digitalWrite(14,HIGH);
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
if(timer3.tick){
digitalWrite(11,LOW);
digitalWrite(14,LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
}
}
}
}

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

Извините за беспокойство, разобрался. Всегда ставьте кондер 0,1мкф под ногами питания проца :)