Jump to content
-=FISHER=-

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

Recommended Posts

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

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

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

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

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

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


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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

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

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

Share this post


Link to post
Share on other sites

Вебинар «Практическое использование TrustZone в STM32L5»(10.12.2020)

Приглашаем на вебинар, посвященный экосистеме безопасности и возможностях, которые появились у разработчиков благодаря новой технологии TrustZone в микроконтроллерах STM32L5. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

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

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

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


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

Share this post


Link to post
Share on other sites

Снижена цена на AC/DC и DC/DC преобразователи Mornsun в Компэл!

Компэл и компания Mornsun снизили цены на преобразователи AC/DC-преобразователи семейств LS и LDE. По привлекательной цене также предлагаются DC/DC-преобразователи изолированных семейств поколений R2 и R3 различного конструктивного исполнения.

Подробнее

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

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

Share this post


Link to post
Share on other sites

Материалы вебинара: «Силовые компоненты Wolfspeed на основе карбида кремния (SiC)»

Вы можете посмотреть видеозапись вебинара «Силовые компоненты Wolfspeed на основе карбида кремния (SiC)», ознакомиться с ответами на вопросы и презентацией, в которой вы найдете много полезных ссылок, в том числе подробнее раскрывающих ответы на вопросы.

Подробнее

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

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

Edited by -=FISHER=-

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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


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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

ждем "1";

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

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


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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

{

delay(1000);

}


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

Share this post


Link to post
Share on other sites

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

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

{

delay(1000);

}

Да, он самый.

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

Share this post


Link to post
Share on other sites

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

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

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

{

delay(50);

}


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

Share this post


Link to post
Share on other sites
при появление на входе PB0 кратковременной единицы, запускается таймер

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

Edited by demiurg1978

Share this post


Link to post
Share on other sites

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

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


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

Share this post


Link to post
Share on other sites

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, ибо общее время задержки в цикле увеличивается с каждой задержкой....

Edited by -=FISHER=-

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

Share this post


Link to post
Share on other sites
//========================================================================
#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

Edited by demiurg1978

Share this post


Link to post
Share on other sites
общее время задержки в цикле увеличивается с каждой задержкой....
А как оно должно быть ?

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

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

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

Что не так?

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

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

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

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

Share this post


Link to post
Share on other sites

Дело не в элементарной задаче, пусть ТС ознакомится с конечными автоматами и программными таймерами.

Share this post


Link to post
Share on other sites

Вы шутите ? Он сейчас тупит с элементарным, а Вы ему события да автоматы подсовываете для изучения :vava:

Вы ему ещё ОСь предложите для решения :)

Share this post


Link to post
Share on other sites

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

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


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...