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

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

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

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

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

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

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

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

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

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

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

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

Сообщение c2n »

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

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

Сообщение akl »

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

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

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

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

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

Сообщение 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
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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

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

Сообщение c2n »

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

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

Сообщение ZyaK »

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

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

Сообщение alexan9er »

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

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

Сообщение ZyaK »

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

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

Сообщение amd9800 »

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

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

Сообщение akl »

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

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

Сообщение amd9800 »

akl писал(а):Рассматривайте как альтернативный вариант OCR1A

К сожалению выход OCR1A задействован для ШИМ
а выход OCR1B используется для SPI.

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

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

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

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

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

Сообщение akl »

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

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

Сообщение amd9800 »

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

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

Сообщение 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
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

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

Сообщение 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
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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

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