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

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

В итоге выплыло: sts etimsk,r16 Зачем тогда out нужен? Старая версия? :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

OUT выполняется в 2 раза быстрее и занимает в 2 раза меньше памяти.
Это как JMP и RJMP.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Подскажите, пожалуйста, бывает ли в серии МК AVR такие счётчики, которые принимают два сигнала от квадратурного энкодера и считают с учётом направления? С прерываниями и так далее.
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Смотрите в сторону 32бит АРМ.... Там может быть дофига энкодеров. Хотя можно и на 2313 организовать до 4х осей.... Вопрос скорости изменения... Если менее 10/4 мгц, то и на тини можно софтверно
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

B@R5uk писал(а):...бывает ли в серии МК AVR такие счётчики, которые принимают два сигнала от квадратурного энкодера и считают с учётом направления? С прерываниями и так далее.
Такого модуля в AVR нет. Придётся самому...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Понятно, спасибо всем.
Реклама
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Сб май 03, 2014 20:01:51
Откуда: Ижевск

Сообщение ZyaK »

Всем доброго времени суток
сейчас мучаю таймеры в тиньке 24-й, вроде все работает в эмуляторе, но жесть как долго, поставил в программе точку останова когда он будет прибавлять секунду, запустил программу и сижу.... сижу... сижу... жду.... жду...
прошло минут 10, дай ка думаю паузу поставлю, поставил, время работы процессора он насчитал 73 092, 75 Микросекунд! и это за 10 минут 0_о как ускорить сей процесс? есть какие то варианты?
привожу код

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

#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char Bat1;
unsigned char Bat2;
unsigned char t=0;
unsigned char T1=0;
unsigned char TN1=0;
unsigned char T2=0;
unsigned char TN2=0;
unsigned short temp;
unsigned char adc_step=0;

ISR (TIM0_OVF_vect)
{
	t++;
	if (t==242)
	{
		T1++;t=0;//T1 минуты, надо опросить bat1 или bat2
		if (T1==60)
		{
			TN1++;T1=0;//часы Максимум 255 часов
		}

	}

}
ISR (ADC_vect)
{
	
	ADMUX = (1<<MUX1);//включить ацп на pa1
	((unsigned char*)&temp)[0] = ADCL;
    ((unsigned char*)&temp)[1] |=ADCH;
	Bat1 = temp;
	adc_step++;
}
int main(void)
{
	TCCR0A = (1<<WGM01)|(1<<WGM00);
	TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00);//делитель 64
	TIMSK0 = (1<<TOIE0); // Запускаем таймер
	// настройка АЦП
	ADMUX = (0<<REFS1)|(1<<REFS0);//внешнее напряжение Aref на пин PA0
	ADCSRA = (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN)|(1<<ADATE)|(1<<ADIE);//делитель частоты 128//запуск ацп, автомат запуск преобразования//разрешение прерываний ацп
	ADCSRB = (1<<ADTS2);//запуск по переполнению timer0

	asm("sei");

	while(1)
	{
		asm("nop");  //TODO:: Please write your application code
	}
}
Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Студия 4.19 при такой тактовой отрабатывает секундный интервал за 25 секунд.
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

ckdiv8 ??????
Контактная информация:
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Сб май 03, 2014 20:01:51
Откуда: Ижевск

Сообщение ZyaK »

Ск див отключен, студию юзаю 6.0
Плюнул на это дело, подключил драгон по 1debug wire и понеслась в реальном времени, единственное такты не считает :(
Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

Если тебе нужно отладить прерывание то проще самому флаг выставить.
И предварительно счётчик и всё что нужно для твоего кейса.
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Сб май 03, 2014 20:01:51
Откуда: Ижевск

Сообщение ZyaK »

Да как бы хотелось еще по мимо прерываний поглядеть время по шагам, влом на калькуляторе считать:)
Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

На атмеге 8 есть ножка ICP1 (input capture).
При изменение уровня на этой ножке данные из регистра TNT1 записываются в регистр ICR1
Но если я конфигурирую регистр ICR1 как топ для ШИМ. Тогда в случае подергивания ножки ICP1 данные из TNT1 запишутся в ICR1 или нет?
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Рассматривайте как альтернативный вариант OCR1A, т.е. загружая данные для сравнения в ICR1 и выбирая соответствующий режим битами WGM3...0 получаете дополнительный, но не одновременно работающий канал сравнения.
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

akl писал(а):Рассматривайте как альтернативный вариант OCR1A
К сожалению выход OCR1A задействован для ШИМ
а выход OCR1B используется для SPI.

А частоту нужно смоделировать нужную и вынужден использовать ICR1 регистр.

А ножку ICP1 (удобна при разводке платы) - рассматриваю только как необходимую для вызова прерывания, нет необходимости сохранить значения TNT1 в момент события.

Просто я подозреваю что в момент события в ICR1 попадут данные из TNT1 и как следствие изменится частота ШИМ.

Верны ли мои подозрения либо при конфигурировании использования ICR1 как ТОП для таймера при событии ICP1 в этот регистр данные не будут помещаться?
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

100% не могу утверждать, но аппаратное занесение значения TCNT1 при использовании ICR1 в качестве регистра сравнения нелогична и должна быть исключена битами WGM3...0.
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

Сделал тесты.
Если назначить ICR1 как топ для таймера, тогда постоянно срабатывает прерывание по ICP1 без никаких движений по входу ICP1
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Тоже сделал тестовую программу и проверил на макете для tiny2313, т.к. режимы таймера 1 у tiny2313 и mega8 одинаковые. Переноса другого значения в ICR1 при спаде сигнала на PD6/ICP1 не происходит, что вполне ожидаемо.
Спойлер

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

	.INCLUDE "tn2313def.inc"
.equ	delta=4

.CSEG

.ORG	$0000

	RJMP	START

.ORG	$0003
	OUT	PINB,R18
	RETI

START:
	LDI	XL,LOW(RAMEND)
	OUT	SPL,XL

	LDI	R18,0b00011000
	OUT	DDRB,R18
	LDI	R17,0b00010000
	OUT	PORTB,R17		; начальный вывод 10
	LDI	R19,0b01000000
	OUT	DDRD,R19

	LDI	R22,1<<SE
	OUT	MCUCR,R22		; режим SLEEP IDLE

	LDI	R22,1<<ICIE1
	OUT	TIMSK,R22
	OUT	TIFR,R22		; разрешение прерывания по сравнению с ICR1

	LDI	R21,HIGH(128-delta)
	OUT	ICR1H,R21	
	LDI	R21,LOW(128-delta)
	OUT	ICR1L,R21		; значение сравнения

	LDI	R20,1<<WGM11					;
	OUT	TCCR1A,R20						;
	LDI	R20,1<<WGM13|1<<WGM12|1<<CS10	; режим 14 FAST PWM ICR1
	OUT	TCCR1B,R20

	SEI
WAIT_TEST:
	SLEEP
	OUT	PIND,R19		; переключатель лапы PD6/ICP1.Каждый спад на ней
;обычном режиме вызывает аппаратное занесение содержимого TCNT1 в ICR1, но
;в режиме компаратора этого не происходит.

	RJMP	WAIT_TEST
Мучитель микросхем
Аватара пользователя
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря

Сообщение Jman »

Всем привет. Нашел в нете пример работы Т1 Atmega8, перекинул это дело в проект под Atmega16. Не могу понять, как мне сделать тактовый сигнал на любой ножке, неважно какой с частотой 500Гц, и не обнуляя таймер. Такт 8МГц, прескалер 1024 (7813 записал в регистр сравнения что бы мигать раз в секунду), по регистру совпадения. Прошу объяснить, как посчитать правильно...

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

/*Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/
#include <mega16.h>
#define pulse PORTA.0
// Timer1 output compare A interrupt service routine
int s = 0; // переменная для хранения секунд
// Обработка прерывания по совпадению
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   s++; // увеличиваем переменную каждую секунду
   if(s>59) // обнуляем секунды после 59
   {
      s=0;
      pulse = ~pulse;
   }
TCNT1=0; //обнуляем таймер
}
void main(void)
{
PORTA=0x1F;
DDRA=0x1F;
PORTB=0x0F;
DDRB=0x00;
TCCR1A=0x00; //настройка таймера
TCCR1B=0x05;
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x1E85; //записываем число в регистр сравнения
TIMSK=0x10; //запускаем таймер
// Global enable interrupts
#asm("sei")

while (1)

{

}
};
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Контактная информация:
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Задаём в OCR1A значение K=(1000*Fclk/1000000-1). В каждом прерывании инвертируем состояние выбранной ножки и увеличиваем значение OCR1A на K.
Ответить

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