Перейти к содержанию

Использование Таймера T0 Attiny13


-=FISHER=-

Рекомендуемые сообщения

Приветствую всех!

Знающие люди подскажите пожалуйста, как организовать на C следующий алгоритм действий:

при появление на входе PB0 кратковременной единицы, запускается таймер

при повторном появлении на PB0 единицы
{
если прошло менее 5 секунд то на выходе PB1 появляется единица на 3 секунды и таймер сбрасывается в ноль
}

если в течении 5 секунд единица на PB0 так и не появилась, то таймер сбрасывается

Прошу простить если не корректно описал задачу, спросите, попробую по другому объяснить. Заранее спасибо!

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Зачем нужен таймер, что он должен отсчитывать. Для его использования нужно знать частоту на которой работает МК. Эту задачу можно решить и на задержках, если это всё что нужно от МК.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Некорректно, скорее не задача описана, а вопрос. Не понятно, что значит "как" ? Расписать алгоритм на бумажке и перевести его на любой язык. Это если в голове не можете держать алгоритм. Если можете, тогда просто взять и написать его.

И ещё, причём тут Т0 ?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Зачем нужен таймер, что он должен отсчитывать.

Ну в моем понимании он должен отсчитывать время, которое прошло после первого нажатия на кнопку. И если повторное нажатие произошло ранее чем пройдет 5 секунд, то выполняется действие. Если прошло меньше 5 секунд то ничего не происходит и опять начнается отсчет 5 секунд итд

Такую задачу можно решить без таймера? Да это это всё что требуется от МК.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Такую задачу можно решить без таймера?
Конечно можно. Временные интервалы то огромные.

Тут даже дело не в огромности, а в точности этих интервалов. Не думаю, что Вам нужна точность до микросекунды.

Ссылка на комментарий
Поделиться на другие сайты

Конечно можно. Временные интервалы то огромные. Не думаю, что Вам нужна точность до микросекунды.

Нет не нужна конечно такая точность. Будьте добры, укажите вектор по которому я найду решение.

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Тогда обычный опрос ПИНа и задержки на delay_ms'ах.

А как примерно будет выглядеть алгоритм в таком случае?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Примерно - так, как Вы описали в первом посте.

ждём нажатия кнопки ;
небольшая задержка, для устранения дребезга ;
ждём отжатия кнопки ;
цикл с задержкой 5 секунд {
 если нажали на кнопку{
   включаем что-то там ;
   небольшая задержка, для устранения дребезга ;
   ждём отжатия кнопки ;
   выходим из цикла задержки ; // команда break;
 }
}

Ссылка на комментарий
Поделиться на другие сайты

Ваш таймер интереснее организовать как таймаут. Пришла "1" - запустили отсчёт. Ну а далее по обстоятельствам.

ждем "1";

если таймаут невзведён, то запускаем на 5 сек;

иначе взвести на 3с порт РВ1

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

Ваш таймер интереснее организовать как таймаут. Пришла "1" - запустили отсчёт. Ну а далее по обстоятельствам.

Если Вас не затруднит, могли бы Вы чуть-чуть конкретнее описать Ваше предложение. Я пока ещё не "славливаю на лету".

Примерно - так, как Вы описали в первом посте.

цикл с задержкой 5 секунд {

Цикл с задержкой в 5 секунд это вот так будет выглядеть?

for(sec=1; sec<6;sec++)

{

delay(1000);

}

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Цикл с задержкой в 5 секунд это вот так будет выглядеть?

for(sec=1; sec<6;sec++)

{

delay(1000);

}

Да, он самый.

Только дискретность, наверное, нужно поменьше поставить, чтобы успевалась кнопка обрабатываться. Например, 50-100 мс.

Ссылка на комментарий
Поделиться на другие сайты

Только дискретность, наверное, нужно поменьше поставить, чтобы успевалась кнопка обрабатываться. Например, 50-100 мс.

Если я правильно понял Вашу мысль, то вот как-то так?

for(sec=1; sec<21;sec++)

{

delay(50);

}

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

при появление на входе PB0 кратковременной единицы, запускается таймер

Кратковременной - это какие временные рамки? Дребезг контактов учитываем?

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

Кратковременной - это какие временные рамки? Дребезг контактов учитываем?

Ну вот как раз чтобы исключить дребезг.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

for(sec=1; sec<21;sec++)
{
delay_ms(50);
if PINB.0==1 \\отслеживаем нажатие кнопки
{
delay_ms(50); \\задержка для устранения дребезга
if PINB.0==1 \\фиксируем истинное нажатие
{
PORTB.1=1;\\включаем что-то там
delay_ms(3000); \\удерживаем что-то там включенное в течении 3х секунд (так нужно по ТЗ)
POTDB.1=0; \\выключаем что-то там
}
}

Мне кажется здесь совсем не подходит метод с ипользованием обычного delay_ms, ибо общее время задержки в цикле увеличивается с каждой задержкой....

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

//========================================================================
#include "proc_device.h"
//========================================================================
//========================================================================
enum
{
BTN_NONE = 0,
BTN_DOWN,
BTN_WAIT_UP,
BTN_UP,
};
void proc_button (void)
{
static u08 _proc_button;
static soft_timer ST_PROC_BUTTON;
switch (_proc_button)
{
 case BTN_NONE:
	 if (PINB & (1<<PB0))
	 {
	 set_soft_timer (ST_PROC_BUTTON, 40, 0);
	 _proc_button = BTN_DOWN;
	 }
	 break;
 case BTN_DOWN:
	 if (handle_soft_timer (ST_PROC_BUTTON))
	 {
	 if (PINB & (1<<PB0))
	 {
		 Set_Event (EV_ID_KEY_PRESSED);
		 _proc_button = BTN_WAIT_UP;
	 }
	 else
		 _proc_button = BTN_NONE;
	 }
	 break;
 case BTN_WAIT_UP:
	 if (!(PINB & (1<<PB0)))
	 {
		 set_soft_timer (ST_PROC_BUTTON, 40, 0);
		 _proc_button = BTN_UP;
	 }
	 break;
 case BTN_UP:
	 if (handle_soft_timer (ST_PROC_BUTTON))
	 {
	 if (!(PINB & (1<<PB0)))
	 {
		 Set_Event (EV_ID_KEY_UNPRESSED);
		 _proc_button = BTN_NONE;
	 }
	 else
		 _proc_button = BTN_WAIT_UP;
	 }
	 break;
 default:
	 break;
}
}
//========================================================================
//========================================================================
void proc_device (void)
{
static u08 _proc_device;
static soft_timer ST_PROC_DEVICE;
proc_button ();
switch (_proc_device)
{
 case 0:
	 set_bit (DDRB, 1); // Светодиод.
	 _proc_device = 1;
	 break;
 case 1:
	 if (Get_Event (EV_ID_KEY_PRESSED)) // Ждем нажатия кнопки.
	 {
		 _proc_device = 2;
	 }
	 break;
 case 2:
	 if (Get_Event (EV_ID_KEY_UNPRESSED)) // Ждем отжатия кнопки.
	 {
		 set_soft_timer (ST_PROC_DEVICE, 5000, 0); // Установка таймера на 5 с.
		 _proc_device = 3;
	 }
	 break;
 case 3:
	 if (Get_Event (EV_ID_KEY_PRESSED)) // Ждем повторное нажатие кнопки.
	 {
	 _proc_device = 4;
	 }
	 if (handle_soft_timer (ST_PROC_DEVICE)) // Если 5 с истекло, начинаем сначала.
	 {
	 _proc_device = 1;
	 }
	 break;
 case 4:
	 if (Get_Event (EV_ID_KEY_UNPRESSED)) // Ждем отжатия кнопки.
	 {
	 set_bit (PORTB, 1); // Включаем светодиод.
	 set_soft_timer (ST_PROC_DEVICE, 3000, 0); // Установка таймера на 3 с.
	 _proc_device = 5;
	 }
	 break;
 case 5:
	 if (handle_soft_timer (ST_PROC_DEVICE)) // Если 3 секунды истекло,
	 {
	 clr_bit (PORTB, 1); // то отключаем светодиод.
	 _proc_device = 1; // и начинаем сначала.
	 }
	 break;
}
}
//========================================================================

TEMPLATE_FORUM_CXEM.rar

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

общее время задержки в цикле увеличивается с каждой задержкой....
А как оно должно быть ?

С каждой интерацией цикла, задержка увеличивается на 50 мс. Всё верно.

А при нажатии на кнопку, уже пофиг сколько там она будет потом идти, общее время всё равно сбрасывается.

Кстати, у Вас нет выхода из цикла.

Что не так?

Слишком многабукафф, ради элементарной задачи :)

кстати, и вот это :

delay_ms(50); \\задержка для устранения дребезга
if PINB.0==1 \\фиксируем истинное нажатие
{

наверное, всё таки, ни к чему. Особенно вторая проверка. В течении последующих 3-х секунд, всё равно кнопка будет отжата.
Ссылка на комментарий
Поделиться на другие сайты

А как оно должно быть ?

Цикл ведь получится не 5 секундный тогда, а наверное минимум 8 секундный, разве нет?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
    • поняли неправильно. У ТЛ494 никакой защиты нет, усилители ошибки не защита, они не должны приводить к ложным импульсам. Причем тут "микруха" ?  надо нагружать ВСЁ. До сих пор вообще непонятно о каком ИИП идет речь и сколько у него каналов. Бесполезно схему рисовать? - Помогать так бесполезно. Картина кривая по самое "немогу" продолжаются картинки, снятые через ногу и без цены деления.
×
×
  • Создать...