Например TDA7294

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





Текущее время: Чт апр 18, 2024 15:01:11

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


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



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: проблема с таймером
СообщениеДобавлено: Чт дек 14, 2017 16:02:34 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вс дек 13, 2009 01:04:42
Сообщений: 123
Рейтинг сообщения: 0
Код:
if(.....)
 {
   timer_COMPA_ON();
   ..........................
  PORTB |= (1<<2);
   timer_COMPB_ON();
 }

//======

void timer_COMPA_ON()
 {
  TCNT1 = 0x00;   
  OCR1A = 0x1194;           // 4500
  TCCR1A = 0b00000000;  // (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
  TCCR1B = 0b00000101;  // (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
  TIMSK1 = 0b00000010;  // (0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
 }
 
void timer_COMPB_ON()
 {
  TCNT1=0x00;
  OCR1A=0x1194;                                          //4500
  OCR1B=0x6978;                                          //2700
  TIMSK1 |= (1<<OCIE1B);
 }   
   
ISR(TIMER1_COMPA_vect)
 {
  /*код обслуживания lcd*/
  OCR1A += 0x1194;                                      // dec = 4500;
 }

ISR(TIMER1_COMPB_vect)
 {
  PORTB &= ~(1<<2);                                                                             // инвертировать состояние пин  2 port B ***                                                   
  TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); //
  TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
  nterrupt_off();                                                                               
  triger = 0;                                                                                   
 }



Парни объясните в чем проблема, прерывание ISR(TIMER1_COMPA_vect) примерно раз в 0.4 сек обслуживает lcd. ISR(TIMER1_COMPB_vect) включает порт PORTB2 и выключает его через промежуток времени. Проблема в том что если OCR1A содержит число меньшее чем OCR1B то происходит обнуление TCNT1 и промежуток времени отсчитывается нормально, но если в момент вызова timer_COMPB_ON(); в OCR1A содержит число большее чем OCR1B то на PORTB2 возникает импульс примерно 3 миллисекунды, как я понимаю при вызове сразу происходит вызов прерывания :shock: как так получается вить флаг прерывания еще не установлен :o

_________________
Голосовой чат.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Чт дек 14, 2017 17:44:13 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Кто за кем идёт не совсем понятно, но полагаю, что нужно ещё дёргать регистр TIFR.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Чт дек 14, 2017 20:17:14 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2802
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18073
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
в "угадайку" будем играть?
1. какой МК?
2. какая тактовая частота?
3. что такое "if(.....)" и когда оно срабатывает?
4. у тебя ISR(TIMER1_COMPB_vect) останавливает таймер. сколько времени проходит до "срабатывания" if(.....) ?
5. у тебя 27000 / 4500 = ровно 6. поэтому флаги обоих прерываний выставляются одновременно. но первым всегда выполняется прерывание по OCR1A.
попробуй OCR1B сделать чуточку побольше, чтобы это прерывание гарантированно произошло позже, чем прерывание по OCR1A.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Пн дек 18, 2017 11:15:40 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вс дек 13, 2009 01:04:42
Сообщений: 123
Рейтинг сообщения: 0
mega328.
16 мегагерц.
if операция это условно для понимания как используется код, время может быть разное от секунды до более минуты.

_________________
Голосовой чат.


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Ср дек 20, 2017 13:45:50 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14054
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
А сменить контрольные регистры таймера (приоритет прерываний у АВРки к сожалению НЕ ИЗМЕНЯЕТСЯ)?
Или наворотить разрешение вложенного прерывания?
:roll:


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Ср дек 20, 2017 21:30:15 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вс дек 13, 2009 01:04:42
Сообщений: 123
Рейтинг сообщения: 0
Я не понял вы спрашиваете или отвечаете? Так в том то и дело, что при заходе в timer_COMPB_ON(); происходит обнуление счетного регистра, инициализация регистров сравнения обоих и только после этого происходит разрешение прерывания регистра сравнения OCR1B.

_________________
Голосовой чат.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Чт дек 21, 2017 08:25:41 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14054
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
МНДЯаа...
Я-то привык САМ режимы задавать, какие захочу - ассемблер однако штука удобная...
Си - потребует или библиотеку досконально изучить или свое написать. В этом плане (СИшные прожки) я пока не советчик...
:(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Чт дек 21, 2017 09:58:34 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Создайте новый проект только с TIM1, без всяких LCD и др. ненужной периферии. если проблема останется, то выложите весь новый проект сюда.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Чт дек 21, 2017 10:51:48 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вс дек 13, 2009 01:04:42
Сообщений: 123
Рейтинг сообщения: 0
Создайте новый проект только с TIM1, без всяких LCD и др. ненужной периферии. если проблема останется, то выложите весь новый проект сюда.

Попробую нацарапать как будет время :wink:

_________________
Голосовой чат.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Сб дек 23, 2017 17:00:25 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вс дек 13, 2009 01:04:42
Сообщений: 123
Рейтинг сообщения: 0
Написал я значит код и честно сказать я в шоке, не могу понять как такое получается.
В AVR Studio 4 код получился 400 bytes и он вообще работает не правильно, Arduino код занял 686 байт код работает но прежняя проблема осталась, при переполнении OCR1A более чем OCR1B прерывание по OCR1B не отрабатывает. :shock:
======= AVR Studio ====
Код:
 
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdbool.h>

bool triger = 0;
uint8_t temp = 0;

//====================
void timer_COMPA_ON(void);
void timer_COMPB_ON(void);

//====================
int main(void)
        {
         DDRD  = 0b00000000; // ddr D.
         PORTD = 0b11110111; // port D.
         DDRB  = 0b00000110; // ddr B.
         PORTB = 0b11111001; // port B.

         while(1)            // loop.
              {
                if(((PIND & (1<<0)) == 0)&&(triger == 0))                         
                  {
                   temp++;                                                       
                   if(temp == 0xFF) 
                     {
                      triger = 1;                 
                      timer_COMPA_ON();
            PORTB |= (1<<1);                                           
                 while((PIND & (1<<0)) == 0)
                        {
              }
            PORTB |= (1<<2);   
                      timer_COMPB_ON();         
                }
                   }
         if((PIND & (1<<0)) != 0){temp = 0x00;}   
              }
        }

//====================
void timer_COMPA_ON()
{
 TCNT1=0x00;   
 OCR1A=0x13EC;                                          //5100
 TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
 TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
 TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
}
 
void timer_COMPB_ON()
{
 TCNT1=0x00;
 OCR1A=0x13EC;                                          //5100
 OCR1B=0xCB20;                                          //52000
 TIMSK1 |= (1<<OCIE1B);


ISR(TIMER1_COMPA_vect)
{
 OCR1A +=0x13EC;    
 PORTB ^= (1<<1);
}

ISR(TIMER1_COMPB_vect)
{
 PORTB &= ~(1<<1);                                                                                                                                      // off portb.1                                                                         
 PORTB &= ~(1<<2);                                                                                                                                      // off portb.2 
 TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);    //
 TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
 triger = 0;
}


============ Arduino ======================

Код:
bool triger = 0;
uint8_t temp = 0;


void setup()
          {
           DDRD  = 0b00000000; //настраиваем выводы порта D.
           PORTD = 0b11110111; //записывае значение в порт D.
           DDRB  = 0b00000110; //настраиваем выводы порта B.
           PORTB = 0b11111001; //записывае значение в порт B.
          }

void loop()
         {
          if(((PIND & (1<<0)) == 0)&&(triger == 0))                       
            {
             temp++;                                                      .
             if(temp == 0xFF)                                               
               {
                triger = 1;                 
                timer_COMPA_ON();                                         
                PORTB |= (1<<1);
                while((PIND & (1<<0)) == 0)
                     {
             
                     }
                PORTB |= (1<<2);   
                timer_COMPB_ON();     
                }
               }
          if((PIND & (1<<0)) != 0){temp = 0x00;}   
         }

void timer_COMPA_ON()
{
 TCNT1=0x00;   
 OCR1A=0x13EC;                                          //5100
 TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
 TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
 TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
}
 
void timer_COMPB_ON()
{
 TCNT1=0x00;
 OCR1A=0x13EC;                                          //5100
 OCR1B=0xCB20;                                          //52000
 TIMSK1 |= (1<<OCIE1B);


ISR(TIMER1_COMPA_vect)
{
 OCR1A +=0x13EC; 
 PORTB ^= (1<<1);
}

ISR(TIMER1_COMPB_vect)
{
 PORTB &= ~(1<<1);                                                                                                                                     // off portb.1
 PORTB &= ~(1<<2);                                                                                                                                     // off portb.2 
 TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);   //
 TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
 triger = 0;
}

_________________
Голосовой чат.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Сб дек 23, 2017 20:51:50 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Вы опять пытаетесь запутать себя и нас.

Выкинуть из кода всякие if((PIND & (1<<0)) != 0), temp и т.д. Ваш алгоритм начнёт чётко спотыкаться на месте каждый раз.
Прочитать про volatile
В студии хороший симулятор. Запустить и прошагать по циклам и обработчикам прерываний с просмотром битов регистров. Я думаю, что вы недостаточно хорошо понимаете работу самого таймера.

Когда вы запускаете таймер timer_COMPA_ON(); значение OCR1B=0. Поэтому сразу выставляется флаг запроса OCF1B.
Как только вы повторно запускаете таймер timer_COMPB_ON(); разрешается прерывание OCIE1B и сразу же отрабатывается ранее запрошенное событие OCF1B.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: проблема с таймером
СообщениеДобавлено: Чт дек 28, 2017 21:34:37 
Встал на лапы
Аватар пользователя

Зарегистрирован: Вс дек 13, 2009 01:04:42
Сообщений: 123
Рейтинг сообщения: 0
Я смотрел симуляцию и флаг прерывания по регистру OCR1B не выставляется сразу а вместе с флагом переполнения когда счетчик начнет считать по новой с нуля и это подтверждается моими опытами в протеусе. volatile - защита переменной от изменения. Это я так решаю проблему дребезга контакта без использования пауз и остановки выполнения кода микроконтроллером.

_________________
Голосовой чат.


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30


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

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


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