Ардуино Уно Таймер

Nickel
Offline
Зарегистрирован: 02.06.2016

Привет всем.

С недавнего времени открыл для себя Ардуино и выходя за рамки стандартных примеров столкнулся со следующей проблемой:

Таймер1 (16 Бит) после 8.38 секунд начинает счет с нуля. Есть ли способы обойти эту проблему (расширить диапазон до 20-30 секунд) ?

Заранее спасибо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nickel пишет:

Привет всем.

С недавнего времени открыл для себя Ардуино и выходя за рамки стандартных примеров столкнулся со следующей проблемой:

Таймер1 (16 Бит) после 8.38 секунд начинает счет с нуля. Есть ли способы обойти эту проблему (расширить диапазон до 20-30 секунд) ?

Заранее спасибо

Вы сами так настроили (ну или тот, чей скетч Вы используете). 

1. Скетч в студию
2. Описание задачи (чего нужно-то?) тоже в студию.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Таймер должен генерировать прерывание при переполнении. Изменяйте значение переменной в соотвествующем векторе прерывания. Каждая единица переменной будет соотвествовать полным 16 битам таймера.

 

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

Nickel пишет:

Таймер1 (16 Бит) после 8.38 секунд начинает счет с нуля.

А по идее при тактовой частоте 16МГц вообще дожен переполнятся за 4,19 секунд, даже если взять самый большой прескалер (1024): 16000000/1024=15625 - частота, поступающая на таймер. Максимально возможное значение 16-битного таймера 65535, итого получаем: 65535/15625=4,19 секунды.

Nickel пишет:

Есть ли способы обойти эту проблему (расширить диапазон до 20-30 секунд) ?

Таймер считать дольше физически не может. Выход - добавить переменную, которую инкрементировать таймером и ориентироваться уже на неё при подсчете времени. Ну и естественно настроить таймер на переполнение или сравнение с ровным количеством секунд/миллисекунд (для удобства).

Nickel
Offline
Зарегистрирован: 02.06.2016

Спасибо за ответы!

Задумка следующая: фиксируется время между нажатием и отпусканием кнопки. На этот интервал ставится таймер, который попеременно переключает 2 светодиода (LEFT_PIN, RIGHT_PIN). Решено прерыванием. Кажется работает, только вот таймер подкачал.

Логика:

Кнопка нажата - включается левый светодиод и фиксируется время нажатия. Кнопка отпущена - выключается левый светодиод и включается правый, фиксируется время и интервал и ставится таймер, который с этого времени перенимает переключеие светодиодов до следующего нажатия кнопки.

Nickel
Offline
Зарегистрирован: 02.06.2016
#include <TimerOne.h>

const int INPUT_PIN = 2;
const int LEFT_PIN = 7;
const int RIGHT_PIN = 8;
const long BOUNCE_DELAY = 15000; // "Дребезжание" кнопки 15ms.

volatile  long startTime = 0;
volatile  long endTime = 0;
volatile  long timeInterval = 0;
volatile int state = 0;
volatile int state_LEFT_PIN = 0;

// ###### Переменная для "дребезжания" кнопки ######
volatile  long lastmicrosDebounced; 


void setup(){
  pinMode(INPUT_PIN, INPUT);
  pinMode(LEFT_PIN, OUTPUT);
  pinMode(RIGHT_PIN, OUTPUT);

  // ###### Сперва выключить оба светодиода ######
  digitalWrite(RIGHT_PIN, LOW);
  digitalWrite(RIGHT_PIN, LOW);

  Timer1.initialize(1000); 
  Timer1.attachInterrupt(proc_ToggleLED);
  Timer1.stop();

  attachInterrupt(0, proc_SetTimer, CHANGE);
}

void loop()
{

}

void proc_ToggleLED(){

  // ###### Переключаем светодиод ######
  state_LEFT_PIN = digitalRead(LEFT_PIN);
  digitalWrite(RIGHT_PIN, state_LEFT_PIN);
  digitalWrite(LEFT_PIN, state_LEFT_PIN ^ 1); 
}


void proc_SetTimer()
{
  // ###### Debouncing ##################
  long temp = micros() - lastmicrosDebounced;
  if((temp >= BOUNCE_DELAY)){
    proc_UserInterrupt();
  }
  lastmicrosDebounced = micros();
}

void proc_UserInterrupt(){
  // ###### Если кнопка нажата ######
  if(state == 0){
    Timer1.stop();
    startTime = millis();

    // ###### Статус = "Кнопка нажата" ######
    state = 1;

    // ###### Включаем левый светодиод ######
    digitalWrite(RIGHT_PIN, LOW);
    digitalWrite(LEFT_PIN, HIGH);
  }

  // ###### Если кнопка отпущена ######
  else if(state == 1){
    endTime = millis();
    timeInterval = endTime - startTime;

    // ###### Ставим Таймер ######
    Timer1.setPeriod(timeInterval*1000);
    Timer1.start();

    // ###### Статус = "Кнопка отпущена" ######
    state = 0;

    // ###### Включаем правый светодиод ######
    digitalWrite(LEFT_PIN, LOW);
    digitalWrite(RIGHT_PIN, HIGH);
  }
}

 

Nickel
Offline
Зарегистрирован: 02.06.2016

NeiroN пишет:

Таймер должен генерировать прерывание при переполнении. Изменяйте значение переменной в соотвествующем векторе прерывания. Каждая единица переменной будет соотвествовать полным 16 битам таймера.

 

А это идея, не додумался, спасибо

Nickel
Offline
Зарегистрирован: 02.06.2016

@Jeka_M

Да, я того-же мнения. Может быть особенности библиотеки "TimerOne"? Хотя и здесь тоже пишут, что 8.38 секунды. Я что-то не понимаю

ra9mli
Offline
Зарегистрирован: 26.10.2015
0

Привет всем, помогите со скетчем вот такого таймера.

таймер с выдержкой в 12-13 секунд по такому принципу:


Включаю устройство и оно ждет команды, допустим нажимаю на кнопку и через 12-13 секунд оно издает звуковой сигнал допустим в течении 2 сек. и опять ждет команды. Нажал еще раз на кнопку оно опять через 12 сек пищит в течении 2х сек и опять ждет команды.

Думаю что тут совсем всё просто, но пока не шибко силен в программировании. 

Заранее благодарен.

bwn
Offline
Зарегистрирован: 25.08.2014

А сами вы что-то написали? Рекомендую заглянуть в приколоченную песочницу, первый пост. Там есть рекомендации. Хотя и неудобно, с трехлетним стажем, туда посылать.

ra9mli
Offline
Зарегистрирован: 26.10.2015

Извеняюсь за флуд в теме, но дата регистрации у меня не совпадает со сроком стажа. (

Всё было заброшено с пополнением в семье. )) 

Так-что сейчас можно сказать у меня всё с нуля.

Сейчас всё пробую заного, что-то вспоминаю, где-то читаю, где-то прошу помощи. )

bwn
Offline
Зарегистрирован: 25.08.2014

Вы заглянули, куда рекомендовал? С нынешней постановкой вопроса, только в "Ищу исполнителя", там за несколько тыщь рупий напишут, могут даже на чистом Си.))))

bwn
Offline
Зарегистрирован: 25.08.2014

ОК, т.к. программирование в песочнице еще не написал, немного помогу.
1. При разработке алгоритма, нет слова "допустим". Есть четкие критерии: когда, сколько, почему.
2. Устранить неопределенные ситуации. Ваша программа может состоять из одного ифа и двух делеев, боюсь это не то, что вы хотели. Внести в алгоритм, что делать, если кнопка нажата еще раз во время ожидания, во время сигнала, совсем не отпустилась и т.д.
3. Подключение кнопок в "Работа с кнопками.....", первая страница.
4. Отработка таймингов на неблокирующем "Блинк без делей".
5. Про конченные автоматы и классы, не буду, Винни пускай рассказывает.

ra9mli
Offline
Зарегистрирован: 26.10.2015

bwn пишет:

1. При разработке алгоритма, нет слова "допустим". Есть четкие критерии: когда, сколько, почему.

Алгоритм у меня получается такой.

1) нажимаю на кнопку и тут же отпускаю.

2) ардуинка выдерживает тринадцать секунд

3) По истечению тринадцати секунд, включается пассивный buzzer на две секунды.

4) ардуинка возвращается в режим ожидания нажатия кнопки.

Такая вотпростая работа. )

sadman41
Offline
Зарегистрирован: 19.10.2016

Кухонный таймер в Икее приобретите (вот это простая работа).

ra9mli
Offline
Зарегистрирован: 26.10.2015

sadman41 пишет:

Кухонный таймер в Икее приобретите (вот это простая работа).

 

Интересное предложение для ресурса где разговаривают про Arduino. )))

bwn
Offline
Зарегистрирован: 25.08.2014

ra9mli пишет:

Такая вотпростая работа. )

Сами напросились.

void setup() {
  //Инициацию сами пропишите

}

void loop() {
  if (!digitalRead(pinButt)){ //Кнопка тянет к нулю
    delay(13000);
    digitalWrite(pinBuz,HIGH); //Активное пищало на пине с резистором
    delay(2000);
    digitalWrite(pinBuz,LOW)
  }

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

ra9mli пишет:

Интересное предложение для ресурса где разговаривают про Arduino. )))

Чем плохо? Корпусировано, отлажено - бери и используй. Или, если сайт про ардуино, то любой мигающий сваетодиод или NE555 ардуиной заменять надо, токо чтобы было "по форме"?

bwn
Offline
Зарегистрирован: 25.08.2014

Не, ведь красиво, вкорячить сторублевый чип, обвязать кварцем, добавить БП, я бы еще кнопку на аналоговый пин повесил, с зазором в пару единиц, тогда можно будет полностью использовать мощь Aref. И вся х-ня, чтобы пискнуть при нажатии.))))

sadman41
Offline
Зарегистрирован: 19.10.2016

И на форуме еще полдня попереписываться...

ra9mli
Offline
Зарегистрирован: 26.10.2015

sadman41 пишет:

И на форуме еще полдня попереписываться...

 

Да с этим всё нормально. )) Не думаю что пол дня переписки, вызавет какие либо заболевания. )))

ra9mli
Offline
Зарегистрирован: 26.10.2015

В общем чего-то почитал, чего-то наваял. 

Поставил антидребезг.

Вот что у меня получилось.

из команды if (!digitalRead(switchPin)) сделал  if (digitalRead(switchPin)) иначе всё было зациклено.

 

Только не надо смеяться)))) так сразу всё вспомнить, а тем более научиться мне не под силу.

int switchPin = 13;
int zooPin = 8;
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean zooOn = false;

void setup()
{
  pinMode(switchPin, INPUT);
  pinMode(zooPin, OUTPUT);
}

boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin);
  }
  return current;
}

void loop()
{

  {
  if (digitalRead(switchPin))
  { 
    delay(3000);
    digitalWrite(zooPin,HIGH); 
    delay(2000);
    digitalWrite(zooPin,LOW);
  }

  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Работает антидребезг?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

bwn пишет:
Винни пускай рассказывает.
Что плохого сделал тебе ra9mli?

bwn
Offline
Зарегистрирован: 25.08.2014

ra9mli пишет:

Поставил антидребезг.

Зря, это мегакод, антидребезг заложен изначально и работает на 147%.)))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ra9mli пишет:

1) нажимаю на кнопку и тут же отпускаю.

А чё делать, если юзверь не отпустил? Активировать кнопку у него в стуле?

ra9mli пишет:

2) ардуинка выдерживает тринадцать секунд

А чё делать, если в это время ещё раз нажали кнопку? А два раза? А десять раз?

ra9mli пишет:

3) По истечению тринадцати секунд, включается пассивный buzzer на две секунды.

А если в эти две секунды кнопку опять клацают?

ra9mli пишет:

4) ардуинка возвращается в режим ожидания нажатия кнопки.

А если её всё ещё не отпустили и она таки нажата? Это как? Нещитова?

 

ra9mli
Offline
Зарегистрирован: 26.10.2015

sadman41 пишет:

Работает антидребезг?

Пока на эмуляторе, под рукой ардуинки нет. Всё дома. В понедельник принесу на работу опробую.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ra9mli пишет:

чего-то наваял. 

Темы "12-13 сек" и "на 2-3 сек" не раскрыты.

Подсказка - для этого есть функция random.

ra9mli
Offline
Зарегистрирован: 26.10.2015

ЕвгенийП пишет:

ra9mli пишет:

чего-то наваял. 

Темы "12-13 сек" и "на 2-3 сек" не раскрыты.

Подсказка - для этого есть функция random.

13 сек ожидания, 2 секунды работы после того, как нажали и отпустили кнопку.

Длительное время ее держать ни кто не будет.

Задача под одного конечного пользователя, которому можно рассказать нюансы работы. На массовость задумка не предполагается.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ворота пишет:

bwn пишет:
Винни пускай рассказывает.
Что плохого сделал тебе ra9mli?

Сделал бы плохо - разговаривал с ALEGYR, а так - простой предупредительный...

bwn
Offline
Зарегистрирован: 25.08.2014

Да, и строки 27,36, это для закрепления результата?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ra9mli пишет:

13 сек ожидания, 2 секунды работы 

Чёт ты на ходу показания меняешь. Раньше было

ra9mli пишет:

0

таймер с выдержкой в 12-13 секунд

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

bwn пишет:

Да, и строки 27,36, это для закрепления результата?

Не, это чтобы антидребезг работал.

bwn
Offline
Зарегистрирован: 25.08.2014

Ворота пишет:

ra9mli пишет:

13 сек ожидания, 2 секунды работы 

Чёт ты на ходу показания меняешь. Раньше было

ra9mli пишет:

0

таймер с выдержкой в 12-13 секунд

Лана, не наезжай, вот окончательное ТЗ. Сижу, баксики жду.)))

ra9mli
Offline
Зарегистрирован: 26.10.2015

Ворота пишет:

ra9mli пишет:

13 сек ожидания, 2 секунды работы 

Чёт ты на ходу показания меняешь. Раньше было

ra9mli пишет:

0

таймер с выдержкой в 12-13 секунд

 

Не, не меняю, корректирую то, что ранее неверно выразил. Изначально предполагал "К примеру 12 или 13", а написал так, что другим непонятно. 
Готов объяснять вразумительнее. 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Работает антидребезг?

Конечно, работает!

1. Функция для подавления дребезга в коде присутствует? Да!
2. Устройство функционирует безо всякого дребезга? Да!

Всё! Смело вставляем "подавление дребезга" в смету и выставляем счёт заказчику. Учитесь!

sadman41
Offline
Зарегистрирован: 19.10.2016

ra9mli пишет:

Не, не меняю, корректирую то, что ранее неверно выразил. Изначально предполагал "К примеру 12 или 13", а написал так, что другим непонятно. 

Готов объяснять вразумительнее. 

Вам бы в правительство одной страны пойти работать. Там тоже сначала неверно навыражают, а потом корректируют так, что кладбище первее пенсии вырисовывается.

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Всё! Смело вставляем "подавление дребезга" в смету и выставляем счёт заказчику. Учитесь!

Для этого и спрашивал... а то я всё недокладываю в скетчи, забочусь о бюджете :(

ra9mli
Offline
Зарегистрирован: 26.10.2015

Мне бы еще местный менталитет понять и освоить. А то иногда страшновато становится выражаться. ))))

 

bwn
Offline
Зарегистрирован: 25.08.2014

ra9mli пишет:

Мне бы еще местный менталитет понять и освоить. А то иногда страшновато становится выражаться. ))))

Так чего его понимать? Я вам написал х-ню, которая делает то, что вы озвучили в ТЗ. Антидребезг в таком коде идет бонусом: как только поймается первый блымк, МК превращается в кирпич на период заданный делеями. Все.))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ra9mli пишет:

bwn пишет:

1. При разработке алгоритма, нет слова "допустим". Есть четкие критерии: когда, сколько, почему.

Алгоритм у меня получается такой.

1) нажимаю на кнопку и тут же отпускаю.

2) ардуинка выдерживает тринадцать секунд

3) По истечению тринадцати секунд, включается пассивный buzzer на две секунды.

4) ардуинка возвращается в режим ожидания нажатия кнопки.

Такая вотпростая работа. )

я тут недавно зуммер к действующей конструкции прикручивал, использовал таймер, где-то код лежит, показать?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ra9mli пишет:

Мне бы еще местный менталитет понять и освоить. А то иногда страшновато становится выражаться. ))))


...с этим без 100 грамм не одолеть )))

ra9mli
Offline
Зарегистрирован: 26.10.2015

ua6em пишет:

я тут недавно зуммер к действующей конструкции прикручивал, использовал таймер, где-то код лежит, показать?

Буду признателен.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bwn пишет:
Антидребезг в таком коде идет бонусом: как только поймается первый блымк, МК превращается в кирпич на период заданный делеями. Все.))))

Ну, вот, взял и раскрыл все секреты мастерства :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

...с этим без 100 грамм не одолеть )))

Боюсь, 100 грамм - маловато будет.

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Ну, вот, взял и раскрыл все секреты мастерства :(

Так тонкий расчет, с дребезгом уже за дэнги. )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, хорошая пятничная тема :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

...с этим без 100 грамм не одолеть )))

Боюсь, 100 грамм - маловато будет.


 С Вашими темпами в эфире не с кем работать будет )))

ra9mli
Offline
Зарегистрирован: 26.10.2015

ua6em пишет:

ЕвгенийП пишет:

ua6em пишет:

...с этим без 100 грамм не одолеть )))

Боюсь, 100 грамм - маловато будет.


 С Вашими темпами в эфире не с кем работать будет )))

С удовольствием бы пообщался на тему Ардуинки в эфире, вот только на данный момент у меня двойка ))

КВ отцу в деревню отдал. )

К стати как у вас с двойкой? У нас она совсем мертва. (

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ra9mli пишет:

ua6em пишет:

ЕвгенийП пишет:

ua6em пишет:

...с этим без 100 грамм не одолеть )))

Боюсь, 100 грамм - маловато будет.


 С Вашими темпами в эфире не с кем работать будет )))

С удовольствием бы пообщался на тему Ардуинки в эфире, вот только на данный момент у меня двойка ))

КВ отцу в деревню отдал. )

К стати как у вас с двойкой? У нас она совсем мертва. (

Постоянно шуршит, репитер работает превосходно, установлен на высоте 1100 так что по прохождению даже Украина входит, раньше, когда SDR был в Ростовской области можно было себя послушать через репитер в Ростове (500 км)

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Блин, хорошая пятничная тема :)

Ну да, хоть срача нет.)))