Например TDA7294

Форум РадиоКот • Просмотр темы - Как работать с таймерами ATmega48PA на C/C++ ?
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 21:27:01

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 31 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Чт июл 19, 2018 08:44:10 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Если делать качественный светодиодный индикатор двух прерываний вряд-ли хватит, тем более при том, что помимо индикации еще и задачи ввода/обработки делать необходимо. И ВСЕ на одном кристалле.
Ежли вывести управление светодиодным табло на отдельную мелкосхемку с собственными мозгами - дело несколько упростится (то же касается индикаторов ЖКИ, имеющих свой контроллер).
Однако чаще стараются "мелкий" проект в одну корпусину запихерить, а в таком случае без кучки прерываний "с выпендрежом" не обойтись.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Чт июл 19, 2018 08:57:41 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 19
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Сообщений: 119
Откуда: С-Пб
Рейтинг сообщения: 0
Сейчас нет. Потом, в процессе отладки или доработки понадобится второе, и приплыли.

а если и потом не понадобится? :)

я это все к тому, что надо все делать с умом. Делал я как-то ампервольтметр для своего ЛБП. Использовал два прерывания, АЦП и таймер, для индикации. Основной цикл пустой. Теперь вопрос: откуда тут могут взяться еще какие-то прерывания? :)

Ну ты троль. Если, когда, зачем... просто делай сразу так ,чтобы потом не было мучительно больно за
потраченное время на быдлокод. 500 мс задержки в прерывании - это вечность.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Чт июл 19, 2018 10:22:12 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Цитата:
Встречаются два мужика в пустыне. Один тащит телефонную будку, второй рельсу.
Тот что с рельсой спрашивает:
- Нафига тебе телефонная будка?
- Ну а вдруг на меня лев нападет?! Я в будку спрячусь, и он меня не съест! А ты зачем рельсу таскаешь?
- А вдруг львы?!
- И что?
- Ну дак я рельсу брошу и налегке от них убегу!

Кого-то мне чувак с рельсой напоминает. :)


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Чт июл 19, 2018 11:33:53 
Вымогатель припоя

Карма: 6
Рейтинг сообщений: 7
Зарегистрирован: Чт янв 21, 2016 15:59:10
Сообщений: 522
Рейтинг сообщения: 0
есть правильный подход, который ВСЕГДА дает хороший реззультат, а есть подход, который дает результат ЕСЛИ. знать о таком подходе - плюс, а пользоваться им повседневно на регулярной основе - минус.

я и не пользуюсь. Я просто не люблю усложнять на ровном месте :)


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Пт июл 20, 2018 11:06:17 
Прорезались зубы

Карма: -3
Рейтинг сообщений: -3
Зарегистрирован: Вт сен 09, 2008 18:17:27
Сообщений: 213
Рейтинг сообщения: 0
Теперь непонятные проблемы с таймером1 - ставлю такие настройки (внешний кварц 20мГц):

Код:
TCCR1B = 0;
TCCR1A = 0;   
TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению) для первого таймера
//    OCR1AH = 0xFF; //записываем в регистр число для сравнения - старшый байт
//    OCR1AL = 0x7F; //записываем в регистр число для сравнения - младший байт
OCR1A = 4000; //записываем в регистр число для сравнения

TCCR1B |= ( 1 << CS12 ) | ( 1 << CS10 );//устанавливаем предделитель на 1024
TIMSK1 |= (1<<OCIE1A);   // Разрешить прерывание по совпадению OCR1A
//TIMSK1 |= (1<<OCIE1B);   // Разрешить прерывание по совпадению OCR1B
//TIMSK1 |= (1<<TOIE1);    // Разрешить прерывание по переполнению


Канал B осциллографа в Протеусе подключён к ноге PC2, на которой в
ISR (TIMER1_COMPA_vect )меняется высокий уровень на низкий, каждый
полупериод меандра должен быть 205 милисек. = 1/(20000000/(4000*1024))
а он, почему то, то в 3 раза больше, то в 2 !

Почему так происходит?


Вложения:
Безымянный.png [79.87 KiB]
Скачиваний: 334
Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Пт июл 20, 2018 12:55:02 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
может в прерывание входит не сразу (не разрешены по какой то причине, I, например нет), может в прерывании не сразу скидывает (код то не видно)... а поднимает ногу кто?

Добавлено after 2 minutes 15 seconds:
посмотрел видимую часть сигнала - сбрасывается он вроде регулярно (интервалы между спадающими фронтами равны), а вот поднятие идет както поразному...

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Пт июл 20, 2018 14:02:27 
Прорезались зубы

Карма: -3
Рейтинг сообщений: -3
Зарегистрирован: Вт сен 09, 2008 18:17:27
Сообщений: 213
Рейтинг сообщения: 0
Я выложил весь тестовый проект (Таймеры.zip) для Atmel studio 6.2, там же внутри проэкт для Proteus 8.7

Кстати, если закомментировать блок настроек относящиеся к таймеру0, то таймер1 перестаёт работать вообще
(кажется это происходит после одного срабатывания) !

Почему так происходит?

Спойлер
Код:
/////////////////////////////////////////////////////////////////
#define F_CPU 20000000L
#include <avr/io.h>
#include <Util/delay.h>
#include <avr/interrupt.h>
/////////////////////////////////////////////////////////////////
void timers_ini(void)
{
/////////////////////////////////////////////////////////////////////////

//====/Настройка таймера0/===================
TCCR0A = 0;
TCCR0B = 0;
TCCR0A |= (1<<WGM01);                   // Режим CTC (сброс по совпадению)
//TCCR0B |= (1<<CS00);                      // Тактирование от CLK.
// Если нужен предделитель :
// TCCR0B = (1<<CS01);                   // CLK/8
// TCCR0B = (1<<CS00)|(1<<CS01); // CLK/64
// TCCR0B = (1<<CS02);                   // CLK/256
 TCCR0B = (1<<CS00)|(1<<CS02); // CLK/1024

// Верхняя граница счета. Диапазон от 0 до 255.
OCR0A = 255;                                   // Частота прерываний A будет = Fclk/(N*(1+OCR0A))
OCR0B = 255;                                   // Частота прерываний B будет = Fclk/(N*(1+OCR0B))
// где N - коэф. предделителя (1, 8, 64, 256 или 1024)
TIMSK0 |= (1<<OCIE0A);                  // Разрешить прерывание по совпадению A
//TIMSK0 |= (1<<OCIE0B);                  // Разрешить прерывание по совпадению B
//TIMSK0 |= (1<<TOIE0);                    // Разрешить прерывание по переполнению
   
//====/Настройка таймера1/===================
  TCCR1B = 0;
  TCCR1A = 0;
  TCCR1B |= (1<<WGM12);                    // Режим CTC (сброс по совпадению)
  //TCCR1B |= (1<<CS10);                       // Тактирование от CLK.
  // Если нужен предделитель :
  // TCCR1B |= (1<<CS11);                   // CLK/8
  // TCCR1B |= (1<<CS10)|(1<<CS11); // CLK/64
  // TCCR1B |= (1<<CS12);                   // CLK/256
   TCCR1B |= (1<<CS10)|(1<<CS12); // CLK/1024

  // Верхняя граница счета. Диапазон от 0 до 65535.
  OCR1A = 2678;                                   // Частота прерываний A будет = Fclk/(N*(1+OCR1A))
  OCR1B = 2678;                                   // Частота прерываний A будет = Fclk/(N*(1+OCR1B))
  // где N - коэф. предделителя (1, 8, 64, 256 или 1024)
  TIMSK1 |= (1<<OCIE1A);                    // Разрешить прерывание по совпадению A
  //TIMSK1 |= (1<<OCIE1B);                    // Разрешить прерывание по совпадению B
  //TIMSK1 |= (1<<TOIE1);                      // Разрешить прерывание по переполнению   

////////////////////////////////////////////////////////////////////////////////////////////////////
}
ISR (TIMER0_COMPA_vect)   // вектор прерывания по совпадению таймера 0
{
/////////////////////////////////////////////////////////////////   
if ((PINC&0b00000001))
 {
 PORTC &= ~(1<<0); //записать в PC0 ноль
 }   
 else
  {
  PORTC |= (1<<0); //записать в PC0 единицу             
  }
 
//////////////////////////////////////////////////////////////////// 
}
ISR (TIMER1_COMPA_vect )
{
/////////////////////////////////////////////////////////////////////   
if ((PINC&0b00000001))
  {
  PORTC &= ~(1<<2); //записать в PC0 ноль
  }
  else
   {
   PORTC |= (1<<2); //записать в PC0 единицу
   }
///////////////////////////////////////////////////////////////////   
}
int main(void)
{
//=========================   
   
   DDRC |= (1<<0); //записать в PC0 единицу (что бы выставить его на выход)
   PORTC &= ~(1<<0); //записать в PC0 ноль
    DDRC &= ~(1<<1);
   PORTC |= (1<<1);
    DDRC |= (1<<2); //записать в PC2 единицу (что бы выставить его на выход)
   PORTC &= ~(1<<2);//записать в PC2 ноль
   
   timers_ini();
   sei();//разрешить прерывания
   
   
//=========================      
   while(1)
   {
      if (false == (PINB&0b00000010))
      {   
   
      //_delay_ms(500);         
      }
      
   }
//========   
}


Вложения:
Таймеры.zip [197.94 KiB]
Скачиваний: 127


Последний раз редактировалось DENIS451 Пт июл 20, 2018 14:42:59, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Пт июл 20, 2018 14:12:52 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
что за хрень вы наворотили? что вы там пытаетесь сгенерировать?
просто меандр генерируется без всяких прерываний чисто аппаратно
в двух разных прерываниях от разных таймеров переключать один и тот же вывод и удивляться, что длительность странно меняется?! а вы чего ждали-то?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Пт июл 20, 2018 14:24:41 
Прорезались зубы

Карма: -3
Рейтинг сообщений: -3
Зарегистрирован: Вт сен 09, 2008 18:17:27
Сообщений: 213
Рейтинг сообщения: 0
О точно, спасибо ARV, глаз замылился и я не вижу, что проверяю PC0 вместо того, что бы проверять PC2,
в обработчике ISR (TIMER1_COMPA_vect )!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Пт июл 20, 2018 14:34:06 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
DENIS451 писал(а):
глаз замылился и я не вижу, что проверяю PC0 вместо того, что бы проверять PC2
чтобы не попадать в подобную ситуацию, крайне настоятельно рекомендую избавиться от магических чисел при помощи соответствующих макросов

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как работать с таймерами ATmega48PA на C/C++ ?
СообщениеДобавлено: Пт июл 20, 2018 16:18:43 
Вымогатель припоя

Карма: 6
Рейтинг сообщений: 7
Зарегистрирован: Чт янв 21, 2016 15:59:10
Сообщений: 522
Рейтинг сообщения: 0
Ну ты троль. Если, когда, зачем... просто делай сразу так ,чтобы потом не было мучительно больно за
потраченное время на быдлокод. 500 мс задержки в прерывании - это вечность.

я сразу сделал "не так" и мне не больно, все работет. А у тебя я спросил, откуда в вольтметре возьмется еще одно прерыване. От сырости?

Вы как роботы, сказали вам что в прерывании низзя и все тут. Нет шоп моск включить, хотя бы на мгновение :)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 31 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: >TEHb<, andrusha152, Jack_A и гости: 25


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y