Вопрос
- Войдите на сайт для отправки комментариев
Чт, 13/04/2017 - 15:42
Господа, если запустить атмегу на встроенном кварце 1 мгц, то секунда в millis будет уже не 1000, а в 16 раз больше?
Или я что то не так думаю? Надо сделать задержку в секунду
если тупо поменять кварц, то - да.
если скомпиллировать для частоты 1 мгц, то - нет.
Понял. Спасибо
А вот что то мне подсказывает что все таки нет. Скомпилировал, работает медленнее
А вот что то мне подсказывает что все таки нет. Скомпилировал, работает медленнее
ты фьюзы настроил, что бы 1 мегагерц было?
Надо:
1) Настроить фьюзы на 1МГц
2) В файле boards.txt для выбранного варианта платы указать частоту 1МГц в параметре .build.f_cpu=
Все, спасибо, разобрался
Странно, но программа постоянно перезагружается. Надо ли ставить кварц при прошивке?
Какая програма?
Надо ли ставить кварц при прошивке?
Тактирование при прошивке не отличается от тактирования при обычной работе микроконтроллера. Как настроены фьюзы, так и надо делать.
Кварц я убрал при прошивке.
Программа простая. Несколько вариантов мигания диодами по принципу on-delay-off.
Кварц я убрал при прошивке.
Ещё раз:
1) Если фьюзы настроены на внешний кварц, то должен обязательно стоять внешний кварц.
2) Если фьюзы настроены на внутренний осциллятор, то внешний кварц не нужен.
Вне зависимости, прошивка это или обычная работа микроконтроллера, система тактирования не различает этих процессов.
Фьюзы на внутреннем кварце, при прошивке внешний кварц убираю
Фьюзы на внутреннем кварце, при прошивке внешний кварц убираю
можно не убирать кварц
а чем прошиваете?
Ардуина как isp. Софт тоже ардуина
вот для IDE хорошая штука, и бутлоадеры есть для всех часто используемых частот и фьюзы правильные
https://github.com/MCUdude/MiniCore
Спасибо. Вот код. Это просто моргалка на 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); } } } }Извините за беспокойство, разобрался. Всегда ставьте кондер 0,1мкф под ногами питания проца :)