Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 07.03.2017, 19:26  
индюк
Заблокирован
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Запутался с volatile...

Сообщение от NewWriter Посмотреть сообщение
whattafakatimer.preset
и охота те было столько букаф писать.......
Реклама:
индюк вне форума  
Непрочитано 07.03.2017, 21:24  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Запутался с volatile...

Ну а че б и не написать, мне букаф не жалко...
Сообщение от MikhailSh Посмотреть сообщение
несколько видов с разным количеством
мне кажется, здесь что-то не так вообще с самой задачей. Несколько видов таймеров с разным количеством... количеством "чего"? Быть может, можно как-то проще решить, без перемудривания?
NewWriter вне форума  
Непрочитано 09.03.2017, 10:23  
MikhailSh
Временная регистрация
 
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
MikhailSh на пути к лучшему
По умолчанию Re: Запутался с volatile...

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

Например объявлены 2 группы (могут быть и другие) программных таймеров с разными единицами счета:
Код:
typedef struct
{
	unsigned int Count; //Текущее значение таймера
	unsigned int Preset; //Конечное значение таймера для определения события
	unsigned char Mode; //Режим таймера
	unsigned char Status; //Состояние таймера
} T_TIM; 

typedef struct
{
	unsigned char NumTim;
	T_TIM * ptrTim;
} T_TIM_GROUP; 

#define NUM_1    5
#define NUM_2    20

volatile T_TIM_GROUP	TIM_TimGroup_1;  //10ms
volatile T_TIM		TIM_Tim_1[NUM_1 ];
volatile T_TIM_GROUP	TIM_TimGroup_2;  //100ms
volatile T_TIM		TIM_Tim_1[NUM_2 ];
В обработчике прерывания от таймера происходит вызов ф-и обработки программых таймеров (одна для всех):
Код:
void TIM4_IRQHandler(void)
{
...
	//Обработка программных таймеров с единицей счета 10 мс
	TIM4_Count_1++;
	if (TIM4_Count_1 == 10) //10*1ms=10ms
	{
		TIM4_Count_1 = 0;
		TIM_Work(&TIM_TimersGroup_1); //Ф-я обработки
	}
	
        //Обработка программных таймеров с единицей счета 100 мс
	TIM4_Count_2++;
	if (TIM4_Count_2 == 100) //100*1ms=100ms
	{
		TIM4_Count_2 = 0;
		TIM_Work(&TIM_TimersGroup_2); //Ф-я обработки
	}
...
В самой ф-и обработки перебираются все прог. таймеры из текущей группы:
Код:
void TIM_Work(volatile T_TIM_GROUP *TIM_GroupTimers)
{
	unsigned short i = 0;
	volatile TIM_STRUCT *TIM_Timer;
	unsigned char NumTimers;
	
	TIM_Timer = TIM_GroupTimers-›ptrTimers;
	NumTimers = TIM_GroupTimers-›NumTimers;
	
	for (i = 0; i ‹ NumTimers; i++)
	{
		if (TIM_Timer-›Mode == TIM_MODE_EMPTY)
		{
			TIM_Timer++;
			continue;
		} 

		if (TIM_Timer-›Mode == TIM_MODE_ON_DELAY) //Если таймер на задержку включения
		{ 
...
}
Не хотел я передавать в эту ф-ю доп. параметр - как количество таймеров в группе (просто не нравится такая запись). А передать указатель на массив типа:
volatile T_TIM TIM_Tim_ХХХ[NUM_ХХХ ];
то нет данных о числе прог. таймеров в группе для цикла FOR(). Делать одинаковым количество во всех группах тож не хочу, они могут значительно отличаться. А так же самих групп может быть несколько. Поэтому нашел выше приведенный способ.
MikhailSh вне форума  
Непрочитано 09.03.2017, 11:08  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Запутался с volatile...

Мдяяя.... Конечно же, вовсе не обязательно накручивать столь хитрозапутанную систему с излишними параметрами типа режима, начального и конечного значения счета. Ведь что нужно от таймера? Чтобы он отсчитал от начального значения до 0 и каким-либо образом оповестил о завершении счета. Это и будет являться истечением заданного интервала.
Вполне достаточно того, что использовать один таймер SysTick с периодом счета 1 мс. И 32-битной переменной в счетчике миллисекунд вам уж точно хватит, чтобы отсчитать любой интервал времени от 1 мс до чето около полутора месяцев непрерывной работы. Хватит? Вот. Поэтому группы таймеров с разной единицей счета сразу отпадают.
Конечное состояние - удобнее всего =0. Посему, потребуется только начальное состояние, от которого будет считать вниз.
Флаг состояния - да, нужен. Режимы работы - хм? типа однократный/циклический? Хм.
Не пытайтесь создать универсальный на все случаи жизни код. Делайте только то, что действительно необходимо в конкретной задаче.
NewWriter вне форума  
Непрочитано 09.03.2017, 14:51  
MikhailSh
Временная регистрация
 
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
MikhailSh на пути к лучшему
По умолчанию Re: Запутался с volatile...

Да, возможно так лучше будет.
Режимов пока всего два: задержка включения и выключения может еще добавлю...

https://habrahabr.ru/post/273077/
MikhailSh вне форума  
Непрочитано 09.03.2017, 15:31  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 822 раз(а) в 386 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: Запутался с volatile...

Где-то на просторах инета (ссылки на текущий момент нет; кажется, на форуме радиокот )
попадался красивейший пример реализации программного таймера от ЛИ (участник форума).
Практически полный программный аналог general-purpose timer-а STM32, базируется на СисТик-е
и не требует прерываний. Приведенный фрагмент кода был написан на C++ для обработки
ввода от энкодера, но ведь тут важна сама идея

Организовывается необходимое количество таймеров без вмешательства в кристалл )
Если посчастливится найти - то, как говорится, must have.
j-Roger вне форума  
Непрочитано 09.03.2017, 16:28  
hacker7
Вид на жительство
 
Регистрация: 07.01.2007
Адрес: Ленинградская обл
Сообщений: 428
Сказал спасибо: 147
Сказали Спасибо 71 раз(а) в 56 сообщении(ях)
hacker7 на пути к лучшему
По умолчанию Re: Запутался с volatile...

Сообщение от MikhailSh Посмотреть сообщение
Вопрос разве volatile на структуру не передается на все ее переменные?
Вот Вы экспериментально и изучаете, что передаётся
Передаваться может что угодно. Стандарта нет. Есть "понятия" той или иной C среды для группы микропроц.
volatile - это не значит "так, как представляется мне"

Судя по нескольким таймерам, задача ещё не продумана
По моему опыту - даже один аппаратный таймер не работает как надо (пр-ммы - в кодах). Даже так. Не стоит на это рассчитывать...
hacker7 вне форума  
Непрочитано 09.03.2017, 18:52  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Запутался с volatile...

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

Сообщение от j-Roger Посмотреть сообщение
Организовывается необходимое количество таймеров без вмешательства в кристалл
Это, простите, как - "без вмешательства в кристалл"? В "кристалл" никто отверткой и паяльником не лезет и без того.

Сообщение от j-Roger Посмотреть сообщение
базируется на СисТик-е и не требует прерываний.
Нууу как же это не требует? Хоть какое-то прерывание быть должно хоть как. Иначе грош цена такому таймеру, он будет считать что угодно, только не желаемый интервал времени.
Сообщение от j-Roger Посмотреть сообщение
на C++ для обработки
ввода от энкодера
Для этого предназначен аппаратный таймер в режиме работы с энкодером. Тут даже мудрить ничего не надо.
Кто такой этот ЛИ (китаец, чтоль? или индус?) я не знаю, но видно, что он че-то недоперемудрил, эт точняк. Ибо для энкодера больше подходят внешние прерывания, нежели программный таймер.
Сообщение от j-Roger Посмотреть сообщение
красивейший
Скорее - глупейший и жутко прожорливый на ресурсы ЦП.
NewWriter вне форума  
Непрочитано 09.03.2017, 22:45  
dgrishin
Почётный гражданин KAZUS.RU
 
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: Запутался с volatile...

Сообщение от j-Roger Посмотреть сообщение
Практически полный программный аналог general-purpose timer-а STM32, базируется на СисТик-е
Разрешение такого таймера не будет выше чем 1мС. Так что до general-purpose ему далековато.
dgrishin вне форума  
Непрочитано 09.03.2017, 23:04  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 822 раз(а) в 386 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: Запутался с volatile...

Сообщение от NewWriter Посмотреть сообщение
Это, простите, как - "без вмешательства в кристалл"?
Вы не процитировали последний символ в строке - символ ")"
j-Roger вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Амперметр на МК whoim Электроника - это просто 239 07.08.2017 09:12
Keil C51 и volatile. Массив, изменяемый в обработчике прерывания - volatile? ArtemKolesnikov Микроконтроллеры, АЦП, память и т.д 3 07.01.2017 23:14
volatile unsigned char bass1981 Песочница (вопросы новичков) 2 12.03.2014 00:30
Когда нужно volatile? neox-neox Микроконтроллеры, АЦП, память и т.д 18 23.08.2011 12:40
Копировщик ЕЕПРОМ russo_turisto Микроконтроллеры, АЦП, память и т.д 14 04.06.2011 12:30


Часовой пояс GMT +4, время: 23:13.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot