Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

jeka101 хоть мегу, хоть тини: настраиваешь таймер на генерацию прерываний, по ним идут пара программных счётчиков и программное же сравнение с уставками, всё.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Re: Таймеры/счётчики в AVR

Сообщение Feruz »

[uquote="jeka101",url="/forum/viewtopic.php?p=3251185#p3251185"]Всем добрый день.
Вопросик есть, мне нужен таймер, с 2мя каналами на atmega8 или 328, к сожалению программную среду атмег я почти не знаю. Тем не менее хочу спросить может кто поможет.
Суть, нужно что-бы канал работал допустим 10ч а потом был выключен 14ч, 2й так-же но независимо от первого, и фоторезистор который не останавливает таймеры но блокирует работу обоих каналов, то есть если я посветил светом, канал отключиться но когда наступит темнота если время рабочего состояния на таймере еще не истекло он включит канал.

Я поискал на просторах интернета и нашел некоторые схемы и прошивки к ним но они все с дисплеями и ручными настройками, я ищу вариант без дисплея где у меня есть 1 кнопка RESET которая коротким нажатием запускает таймер одного канала и начинает его отсчет а последующим коротким нажатием запускает таймер второго канала и начинает его счет, а долгим нажатием сбрасывает оба, настройка интервалов таймеров через исходники.
Схему вроде собрать могу а вот программную часть не знаю как реализовать...[/uquote]

Можно сделать на одной atmega8, вешаем на нее часовой кварц, запускаем таймер в асинхронном режиме так, чтобы прерывание возникало раз в секунду. На каждом прерывании инкрементируем необходимые счетчики и проверяем достигли порога или нет (10ч = 36000с). Кнопки и инициализация каналов рулится через флаги, например. :)
Читать здесь http://easyelectronics.ru/avr-uchebnyj- ... jmera.html
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

[uquote="Feruz",url="/forum/viewtopic.php?p=3282827#p3282827"]Может неправильная последовательность запуска и очистки?[/uquote]
Попробуйте так

Код: Выделить всё

	ldi temp, (1<<OCIE0A) //Включаем прерывание по OCIE0A
	out TIMSK0, temp
;	ldi temp, (1<<OCF0A) //Очищаем флаг требования прерывания
	out TIFR0, temp
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Re: Таймеры/счётчики в AVR

Сообщение Feruz »

[uquote="akl",url="/forum/viewtopic.php?p=3283055#p3283055"][uquote="Feruz",url="/forum/viewtopic.php?p=3282827#p3282827"]Может неправильная последовательность запуска и очистки?[/uquote]
Попробуйте так[/uquote]

Так еще одно лишнее прерывание появляется. Скидываю проект в 4й студии и 7м протеусе чтобы Вы попробовали сами. На скрине красным обведено прерывание которое возникать не должно.
Вложения
6. timer bug.rar
(16.68 КБ) 186 скачиваний
Снимок.JPG
(51.5 КБ) 429 скачиваний
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Прерывание возникает т.к. нет глобального запрета. Попробуйте так.

Код: Выделить всё

//Разрешаем прерывания
	sei
MAIN:
	sbrs flag, flg_interval	
	rjmp MAIN				
//Стоп таймер
	CLI
;
;
;
	RJMP MAIN-1
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Re: Таймеры/счётчики в AVR

Сообщение Feruz »

Конечно все можно исправить с помощью cli. Но дело то в другом, по теории прерывание не должно возникать потому что таймер был остановлен, сброшен, очищен флаг прерывания и запущен заново. Ну не может оно возникнуть с режиме стс на первом такте в то время как сравнение идёт не с 1 а с числом 124. Я пока что расцениваю это явление как очередной баг протеуса, тк симулятор студии этого прерывания не показывает. Постараюсь проверить в железе этот код, отпишусь.
Последний раз редактировалось Feruz Пн янв 15, 2018 12:55:39, всего редактировалось 1 раз.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение prinv »

А это вообще нормально - использовать cli для остановки таймера?
Разве запрет прерываний остановит таймер?
Никакая контра не уйдёт от нас
Feruz
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Re: Таймеры/счётчики в AVR

Сообщение Feruz »

Все подтвердилось. В железе прерывание не происходит (в прикреплении). В протеусе происходит (скрин парой постов выше).
Вложения
jgJ8si6HgUk.jpg
(53.66 КБ) 540 скачиваний
darktime
Родился
Сообщения: 1
Зарегистрирован: Ср ноя 23, 2011 10:36:42

Re: Таймеры/счётчики в AVR

Сообщение darktime »

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

Основные задачи:

1.Режим включение на 15мин. одного из трех режимов вентилятора.
2.Режим включения на 2 минуты подсветки, при чем не зависимо от 1 пункта.
3.Режимы оповещения т.к. моргание светодиодов (короткое, длинное, плавное) и звуки динамика (короткие, длинные).

Почитав литературу понял, что правильно это реализовывать через таймеры, но как правильно пока не понимаю, из просмотра форума понял что мигание и опрос кнопок лучше реализовать через создание одного таймера как системный, а как правильно формировать временные задержки на выполнение?
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2179
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение watchmaker »

А это вообще нормально - использовать cli для остановки таймера?
Разве запрет прерываний остановит таймер?
Не остановит! Он только перестанет плевать прерываниями, но продолжит работать. Чтобы его остановить, надо или явно прописать это в регистр, или остановить соответствующий тактовый генератор.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение alex38779 »

Сижу туплю. Есть таймер, прерывание раз в 10мкс. Как сделать аппаратный delay при помощи таймера?

Т.е. мне нужно взять текущее значение которое на тикал таймер, и отсчитать от этого значение времени задержки? Или управлять таймером - включать и выключать его на нужно время?
Последний раз редактировалось alex38779 Вс фев 18, 2018 16:39:53, всего редактировалось 1 раз.
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Re: Таймеры/счётчики в AVR

Сообщение dgrett »

А диапазон делая какой?
Я всё-всё узнAю и стану профессором.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение alex38779 »

10мкс мин. задержка, таймер на стм32.

Мне интересен принцип построения такой функции. Как сделать правильно все.
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Re: Таймеры/счётчики в AVR

Сообщение dgrett »

10мкс задержка на секундном таймере? Это как?
Если не нужны задержки мкс и сек, минуты одновременно, то таймер настраиваем на соответствующий диапазон. Напр, надо 120 мкс, настраиваем таймер на 10мкс, в переменную заносим 12 и в прерывании декремент, если переменная=0, выставляем некий флаг, на который в основном теле обратите внимание.
Т.е.:
1. Каждые 10 мкс по таймеру возникает прерывание
2. В прерывании проверяем переменную. Если 255 - выходим ничего не делая, те вам не нужна задержка.
3. Вам потребовалась задержка. Переменной присваиваем значение равное нужной задержке /на частоту прерывания, те 120/10=12
4. В прерывании обнаруживаете, что переменная не равна 255 и декрементируете её, проверяете на 0, выходите из прерывания
5. Как только переменная стала =0 выставляете флаг и выходите. В следующем прерывании переменная декрементируется и автоматом станет=255
6. В теле по флагу запускаете/останавливаете свой процесс и сбрасываете флаг

Пременная может быть и 2хбайтовой, в этом случае я проверяю оба байта.
Если надо секунды-минуты-часы и т.д. настраиваем соответственно и таймер, а то замучаетесь по 10мкс насчитать десяток часов
Взяв несколько переменных можно организовать несколько задержек одновременно
Если одновременно должны тикать и минуты и микросекунды, может рациональнее задействовать другой таймер?
Я всё-всё узнAю и стану профессором.
ZyaK
Потрогал лапой паяльник
Сообщения: 361
Зарегистрирован: Сб май 03, 2014 20:01:51
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение ZyaK »

я проще сделал, если надо считать время и точность не особо важна (розетка с таймером для подогрева машины и соседу делал управление светом в курятнике) использовал ватчдог, настроил на пол секунды, и в каждом прерывании по ватчдогу добавляю переменные. только плавает время в зависимости от температуры на улице. но от этого никуда не деться если только часы реального времени использовать. за неделю разбег в час не особо напрягает, тем более есть кнопки, которыми можно время поправить.
Спойлер

Код: Выделить всё

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/wdt.h> // здесь организована работа с ватчдогом
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include <util/delay.h>

unsigned char tc=0;
unsigned char tm=0;
unsigned char th=0;
// Массив значений для индикатора
//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// Функция вывода 1 разряда
void write_byte_1(char data)
{
	for(char i = 0; i < 8 ; i++)
	{
		if((data & 0x80)!= 0) // Сравниваем 8-й бит с нулем
		PORTA |= (1 << PA0); // DATA 1
		else
		PORTA &= ~(1 << PA0); // DATA 0
		PORTA &= ~(1 << PA1); // CLK 0
		PORTA |= (1 << PA1); // CLK 1
		data = data << 1; // Сдвигаем биты
	}
}
	
// Функция вывода 2 разряда
void write_byte_2(char data)
{
	for(char i = 0; i < 8 ; i++)
	{
		if((data & 0x80)!= 0) // Сравниваем 8-й бит с нулем
		PORTA |= (1 << PA0); // DATA 1
		else
		PORTA &= ~(1 << PA0); // DATA 0
		PORTA &= ~(1 << PA1); // CLK 0
		PORTA |= (1 << PA1); // CLK 1
		data = data << 1; // Сдвигаем биты
	}
}
// Функция вывода 3 разряда
void write_byte_3(char data)
{
	for(char i = 0; i < 8 ; i++)
	{
		if((data & 0x80)!= 0) // Сравниваем 8-й бит с нулем
		PORTA |= (1 << PA0); // DATA 1
		else
		PORTA &= ~(1 << PA0); // DATA 0
		PORTA &= ~(1 << PA1); // CLK 0
		PORTA |= (1 << PA1); // CLK 1
		data = data << 1; // Сдвигаем биты
	}
}

ISR (WDT_vect)
{
	
	tc++;
	
	if (tc==54)
	{
		tm++;
		tc=0;
		
	}
	if (tm==60)
	{
		th++;
		tm=0;
		tc=0;
		
	}
	if (th==24)
	{
		th=0;
		tm=0;
		tc=0;
		
	}
	
	if ((PINB&(1<<PB0))==0)
	{
		th++;
	}
	
	if ((PINB&(1<<PB1))==0)
	{
		th--;
	}
	if (th>24)
	{
		th=0;
	}
	if ((3<=th)&&(th<=5))
	{
		PORTB |= (1 << PB2);
	
	}
	else
	{
		 PORTB &= ~(1 << PB2);
	} 
	
	
	WDTCSR |= (1 << WDIE);
	
	
}


int main(void)
{
	DDRB = 0b00000100;
	PORTB = 0b00000011;
	DDRA = 0b00011111;
	PORTA = 0b00000000;
	wdt_reset(); // сбрасываем
	wdt_enable(WDTO_1S); // разрешаем прерывания по ватчдогу. Иначе будет резет.
	WDTCSR |= (1<<WDIE);
	sei(); // разрешаем прерывания
	
	while(1)
	 {
		 write_byte_1(SEGMENTE[th%100/10]);
		 PORTA |= (1 << PA2); // Выводим 1 разряд
		 _delay_us(5000);
		  PORTA &= ~(1 << PA2);
		 write_byte_2((SEGMENTE[th%10])|0x80); // Выводим 2 разряд
		 PORTA |= (1 << PA3); // Включаем индикатор
		 _delay_us(5000);
		  PORTA &= ~(1 << PA3);
		 write_byte_3(SEGMENTE[tm%100/10]); // Выводим 3 разряд
		  PORTA |= (1 << PA4); // Включаем индикатор
		 _delay_us(5000);
		  PORTA &= ~(1 << PA4);
			 		
	 }
}
Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2179
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение watchmaker »

Существует ли достаточно мелкий AVR контроллер (чтобы не совать M88), который имеет минимум два независимых таймера с ШИМ-выходами? Нужно именно два отдельных таймера - мне надо выдавать две частоты одновременно. Лучше, если хотя бы один из них будет 16-битным, но это не столь критично.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

Ищите в поисковике сводную таблицу мк авр.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

тини 25: 8 ног два таймера по 8 бит, по два ШИМ выхода ADC, AC, внешние прерывания... (по памяти, на всяк скачай ДШ, проверь)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2179
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение watchmaker »

Да, это была первая мысль, но немного не хватает ног. В крайнем случае придётся на этом, не получится - тогда на 2313.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Таймеры/счётчики в AVR

Сообщение Ivanoff-iv »

тини 24 побольше ног...

Добавлено after 1 minute 2 seconds:
а с 2313й по размерам уже и мега 8 сравнится (даже мельче будет)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»