Таймеры/счётчики в AVR
Re: Таймеры/счётчики в AVR
В итоге выплыло: sts etimsk,r16 Зачем тогда out нужен? Старая версия? 
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Таймеры/счётчики в AVR
OUT выполняется в 2 раза быстрее и занимает в 2 раза меньше памяти.
Это как JMP и RJMP.
Это как JMP и RJMP.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Таймеры/счётчики в AVR
Подскажите, пожалуйста, бывает ли в серии МК AVR такие счётчики, которые принимают два сигнала от квадратурного энкодера и считают с учётом направления? С прерываниями и так далее.
- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Таймеры/счётчики в AVR
Смотрите в сторону 32бит АРМ.... Там может быть дофига энкодеров. Хотя можно и на 2313 организовать до 4х осей.... Вопрос скорости изменения... Если менее 10/4 мгц, то и на тини можно софтверно
Re: Таймеры/счётчики в AVR
Такого модуля в AVR нет. Придётся самому...B@R5uk писал(а):...бывает ли в серии МК AVR такие счётчики, которые принимают два сигнала от квадратурного энкодера и считают с учётом направления? С прерываниями и так далее.
- B@R5uk
- Собутыльник Кота
- Сообщения: 2896
- Зарегистрирован: Сб ноя 13, 2010 12:53:25
- Откуда: приходит весна?
Re: Таймеры/счётчики в AVR
Понятно, спасибо всем.
-
ZyaK
- Потрогал лапой паяльник
- Сообщения: 361
- Зарегистрирован: Сб май 03, 2014 20:01:51
- Откуда: Ижевск
Re: Таймеры/счётчики в AVR
Всем доброго времени суток
сейчас мучаю таймеры в тиньке 24-й, вроде все работает в эмуляторе, но жесть как долго, поставил в программе точку останова когда он будет прибавлять секунду, запустил программу и сижу.... сижу... сижу... жду.... жду...
прошло минут 10, дай ка думаю паузу поставлю, поставил, время работы процессора он насчитал 73 092, 75 Микросекунд! и это за 10 минут 0_о как ускорить сей процесс? есть какие то варианты?
привожу код
сейчас мучаю таймеры в тиньке 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
}
}Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
Re: Таймеры/счётчики в AVR
Студия 4.19 при такой тактовой отрабатывает секундный интервал за 25 секунд.
- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Таймеры/счётчики в AVR
ckdiv8 ??????
-
ZyaK
- Потрогал лапой паяльник
- Сообщения: 361
- Зарегистрирован: Сб май 03, 2014 20:01:51
- Откуда: Ижевск
Re: Таймеры/счётчики в AVR
Ск див отключен, студию юзаю 6.0
Плюнул на это дело, подключил драгон по 1debug wire и понеслась в реальном времени, единственное такты не считает
Плюнул на это дело, подключил драгон по 1debug wire и понеслась в реальном времени, единственное такты не считает
Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
Re: Таймеры/счётчики в AVR
Если тебе нужно отладить прерывание то проще самому флаг выставить.
И предварительно счётчик и всё что нужно для твоего кейса.
И предварительно счётчик и всё что нужно для твоего кейса.
-
ZyaK
- Потрогал лапой паяльник
- Сообщения: 361
- Зарегистрирован: Сб май 03, 2014 20:01:51
- Откуда: Ижевск
Re: Таймеры/счётчики в AVR
Да как бы хотелось еще по мимо прерываний поглядеть время по шагам, влом на калькуляторе считать:)
Электроника -очень точная наука, бубен необходимо держать в левой руке!!!
Re: Таймеры/счётчики в AVR
На атмеге 8 есть ножка ICP1 (input capture).
При изменение уровня на этой ножке данные из регистра TNT1 записываются в регистр ICR1
Но если я конфигурирую регистр ICR1 как топ для ШИМ. Тогда в случае подергивания ножки ICP1 данные из TNT1 запишутся в ICR1 или нет?
При изменение уровня на этой ножке данные из регистра TNT1 записываются в регистр ICR1
Но если я конфигурирую регистр ICR1 как топ для ШИМ. Тогда в случае подергивания ножки ICP1 данные из TNT1 запишутся в ICR1 или нет?
Re: Таймеры/счётчики в AVR
Рассматривайте как альтернативный вариант OCR1A, т.е. загружая данные для сравнения в ICR1 и выбирая соответствующий режим битами WGM3...0 получаете дополнительный, но не одновременно работающий канал сравнения.
Re: Таймеры/счётчики в AVR
akl писал(а):Рассматривайте как альтернативный вариант OCR1A
К сожалению выход OCR1A задействован для ШИМ
а выход OCR1B используется для SPI.
А частоту нужно смоделировать нужную и вынужден использовать ICR1 регистр.
А ножку ICP1 (удобна при разводке платы) - рассматриваю только как необходимую для вызова прерывания, нет необходимости сохранить значения TNT1 в момент события.
Просто я подозреваю что в момент события в ICR1 попадут данные из TNT1 и как следствие изменится частота ШИМ.
Верны ли мои подозрения либо при конфигурировании использования ICR1 как ТОП для таймера при событии ICP1 в этот регистр данные не будут помещаться?
Re: Таймеры/счётчики в AVR
100% не могу утверждать, но аппаратное занесение значения TCNT1 при использовании ICR1 в качестве регистра сравнения нелогична и должна быть исключена битами WGM3...0.
Re: Таймеры/счётчики в AVR
Сделал тесты.
Если назначить ICR1 как топ для таймера, тогда постоянно срабатывает прерывание по ICP1 без никаких движений по входу ICP1
Если назначить ICR1 как топ для таймера, тогда постоянно срабатывает прерывание по ICP1 без никаких движений по входу ICP1
Re: Таймеры/счётчики в AVR
Тоже сделал тестовую программу и проверил на макете для 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
- Jman
- Мучитель микросхем
- Сообщения: 414
- Зарегистрирован: Ср янв 26, 2011 13:43:30
- Откуда: С того берега моря
- Контактная информация:
Re: Таймеры/счётчики в AVR
Всем привет. Нашел в нете пример работы Т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]
Re: Таймеры/счётчики в AVR
Задаём в OCR1A значение K=(1000*Fclk/1000000-1). В каждом прерывании инвертируем состояние выбранной ножки и увеличиваем значение OCR1A на K.