Как работать с таймерами ATmega48PA на C/C++ ?

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

Как работать с таймерами ATmega48PA на C/C++ (Atmel Studio 6.2) ?

Нужен пример кода настройки для таймера 0 с прерыванием по сравнению и максимальным коэффициентом деления,
а также самого вектора. (желательно с коментариями)

Или хотя бы для любого другого таймера ATmega48PA.

В сети полно примеров для ATmega8 и ATmega8A, а ATmega48PA как будто не существует!

Даташит:
http://ww1.microchip.com/downloads/en/D ... 02011A.pdf
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Меги 48-88-168 и 328 отличаются только объемами памяти, периферия у них одинаковая, есть даже общий даташит на все 4 МК.

Я недавно занимался энкодерами с плохими контактами, задачу решал с применением таймера. Начал на 8-й Меге, потом, по просьбе коллеги sunjob спортил это дело на 328-ю, окончательный результат - вот. Там работа с Timer/Counter 2, использован режим Clear Timer on Compare Match (CTC). Может поможет?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

Как бы я не задавал настройки таймера всегда появляется ошибка

expected constructor, destructor, or type conversion before '(' token

В данном примере их даже две, указывают на строки где ISR :

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

ISR (TIMER2_COMPA_vect)	// вектор прерывания по совпадению таймера 2
{
_delay_ms(500);	
}

ISR (USART_UDRE_vect)
{
_delay_ms(500);		
}
Что не так?
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

А #include <avr/interrupt.h> не забыл?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

рабочая мигалка (в Протеусе) Мега48, таймер0, GCC AVR
Спойлер

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

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define LEDOFF PORTB &= ~(1 << 1)
#define LEDON PORTB |= (1 << 1)

volatile uint16_t ms;

ISR ( TIMER0_COMPA_vect ) 
{
  // event to be executed every 1ms here
  if ( ms != 0 )
    ms--;
}

void delay_ms ( uint16_t nms )
{
  ms = nms;
  while ( ms );
}

void Tim0_Init()
{
  // Tt0 = 1/(Fcpu/k) = 1/(8000000/64) = 0,000008s = 0.008ms
  // n = t/Tto - 1 = 1/0,008 - 1 = 124

  // Set the Timer Mode to CTC
  TCCR0A |= ( 1 << WGM01 );

  // Set the value that you want to count to
  OCR0A = 124;

  // Set the ISR COMPA vect
  TIMSK0 |= ( 1 << OCIE0A );

  // set prescaler to 64 and start the timer
  TCCR0B |= ( 1 << CS01 ) | ( 1 << CS00 );
}

int main()
{
  CLKPR = 0x80;
  CLKPR = 0x00;

  // Analog Comparator: Off
  ACSR = 0x80;
  ADCSRB = 0x00;

  DDRB |= ( uint8_t ) ( 1 << 1 );
  Tim0_Init();
  sei(); // enable interrupts
  while ( 1 )
    {
      LEDON;
      delay_ms ( 1000 );
      LEDOFF;
      delay_ms ( 1000 );
    }
}
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Да, кстати, использовать в прерывающей программе любые delay - категорически неправильно.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

А #include <avr/interrupt.h> не забыл?
afz спасибо, я его не нечаянно закоментировал!


oleg110592, спасибо за код!

Добавлено after 2 hours 28 minutes 43 seconds:
Почему у меня в Протеусе интервал мигания светодиода достигает максимума при значении OCR0A = 130 а потом
при 131...132... и т.д. начинает мигать чаще?

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

	  // Tt0 = 1/(Fcpu/k) = 1/(8000000/64) = 0,000008s = 0.008ms
	  // n = t/Tto - 1 = 1/0,008 - 1 = 124

	  // Set the Timer Mode to CTC
	  TCCR0A |= ( 1 << WGM01 ); //включаем режим "сброс таймера при совпадении"

	  // Set the value that you want to count to
	  OCR0A = 130;

	  // Set the ISR COMPA vect
	  TIMSK0 |= ( 1 << OCIE0A );

	  // set prescaler to 64 and start the timer
	  TCCR0B |= ( 1 << CS01 ) | ( 1 << CS00 );
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="DENIS451",url="/forum/viewtopic.php?p=3420120#p3420120"]при 131...132... и т.д. начинает мигать чаще?[/uquote]
может проделки Протеуса, в AVR Studio симуляторе все нормально:
124:
Изображение
132:
Изображение
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Сообщение DENIS451 »

К сожалению железо будет ехать с Али ещё месяц, если вообще не потеряется!

А кроме Протеуса, есть ещё какие нибудь более продвинутые эмуляторы, например что бы была эмуляция подведения питания к выводам контроллера, эмуляция кварца, и тп.?
Последний раз редактировалось DENIS451 Пн июл 16, 2018 09:39:29, всего редактировалось 1 раз.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

DENIS451 писал(а):есть ещё какие нибудь более продвинутые эмуляторы
нет даже равных протеусу, про более продвинутые и речь не идет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="afz",url="/forum/viewtopic.php?p=3420117#p3420117"]Да, кстати, использовать в прерывающей программе любые delay - категорически неправильно.[/uquote]
это почему же? :shock:
Друг Кота
Аватара пользователя
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Сообщение *Trigger* »

Например, в случае с AVR, выполнение других прерываний, флаги которых были установлены во время задержки в прерывании, произойдёт только после окончания задержки. Таким образом, нарушится главная идея работы с прерываниями - мгновенная (почти) реакция на событие.

Да и основной цикл при этом простаивает, МК не выполняет полезной работы. Если задержки в основном цикле, а прерывания короткие, то во время задержек МК сможет выполнять какие-либо операции.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="*Trigger*",url="/forum/viewtopic.php?p=3421307#p3421307"]Например, в случае с AVR, выполнение других прерываний, флаги которых были установлены во время задержки в прерывании, произойдёт только после окончания задержки. Таким образом, нарушится главная идея работы с прерываниями - мгновенная (почти) реакция на событие.[/uquote]
а если нет других прерываний?

[uquote="*Trigger*",url="/forum/viewtopic.php?p=3421307#p3421307"]Да и основной цикл при этом простаивает, МК не выполняет полезной работы. Если задержки в основном цикле, а прерывания короткие, то во время задержек МК сможет выполнять какие-либо операции.[/uquote]
если есть несколько прерываний, если на них нужно быстро реагировать, то да. Но если у тебя одно прерывание, то почему бы там не поставить задержку?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):Но если у тебя одно прерывание, то почему бы там не поставить задержку?
можно придумать 100500 причин сделать плохо, но лучше подумать о том, почему надо делать хорошо.

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

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="ARV",url="/forum/viewtopic.php?p=3421372#p3421372"]потому что в других случаях за время задержки может произойти не одно событие,[/uquote]
а если не может?
Друг Кота
Аватара пользователя
Сообщения: 15595
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У Вас ведь Си, а не ассемблер, где все однозначно от программиста зависит и абсолютно контролируется.
8)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):а если не может?
прочтите все моё сообщение - ответ там был дан
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

ozonn писал(а):а если нет других прерываний?
Сейчас нет. Потом, в процессе отладки или доработки понадобится второе, и приплыли. Поэтому лучше сразу привыкать делать все правильно. А правильная работа с прерываниями, по-хорошему, должна строиться на базе очень коротких прерывающих программ. Получил прерывание, снял что-либо из регистров оборудования (ну или выдал что-то в регистры), произвел коротенькие вычисления, (может быть) где-то отметился, и все, выходи. А основная программа должна мониторить те самые переменные, в которых отмечаются прерывающие программы и, при появлении отметки, выполнять какие-то большие действия. В том числе, при нужде, и подождать может, хотя, при грамотном построении всей программы, это можно возложить на таймерное прерывание. Таймерная программа прерывания подсчитывает время, как набежит нужная для задержки величина, таймерная программа отметится где надо, а основная, по получению этой отметки, поймет, что нужное время задержки прошло.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

[uquote="afz",url="/forum/viewtopic.php?p=3421895#p3421895"]Сейчас нет. Потом, в процессе отладки или доработки понадобится второе, и приплыли.[/uquote]
а если и потом не понадобится? :)

я это все к тому, что надо все делать с умом. Делал я как-то ампервольтметр для своего ЛБП. Использовал два прерывания, АЦП и таймер, для индикации. Основной цикл пустой. Теперь вопрос: откуда тут могут взяться еще какие-то прерывания? :)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):я это все к тому, что надо все делать с умом
в том числе задавать вопросы и высказывать предположения.
есть правильный подход, который ВСЕГДА дает хороший реззультат, а есть подход, который дает результат ЕСЛИ. знать о таком подходе - плюс, а пользоваться им повседневно на регулярной основе - минус.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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