Например TDA7294

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





Текущее время: Вт апр 23, 2024 16:36:11

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


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



Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: прерывание от таймера 0
СообщениеДобавлено: Сб мар 16, 2019 15:05:55 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
Прошу специалистов помочь разобраться с проблемой.
В программке 3 ШИМа для управления RGB диодом. Скважность зависит от частоты входного сигнала на входе INT0.
ШИМ работает номрально, а для счета импульсов за период времени задействовал Таймер 0.
Но не считате, Где то ошибочка.
Код:
#include <avr/io.h>
#define F_CPU 8000000UL //8MHz
#include <util/delay.h>
#include <avr/interrupt.h>

volatile unsigned char Tic_Count = 0;
volatile unsigned char i = 0;
volatile unsigned char i_Count = 10;
#define BLUE_PB  1
#define BLUE_PWM    OCR1A
#define RED_PB   2
#define RED_PWM  OCR1B
#define GREEN_PB    3
#define GREEN_PWM   OCR2


ISR( INT0_vect )   // прерывание по внешнему сигналу
    {
   Tic_Count ++;
    }

ISR (TIMER0_OVF_vect)
    {
    TCNT0 = 60; // переполнение через 25мС
    i_Count--;
    if(i_Count == 0)
       {
       i_Count = 10; 
       i = Tic_Count;
       Tic_Count = 0x00;
       }
    }
int main(void)
{   //---------- настройка пинов МК
   DDRB |= (1<<BLUE_PB) | (1<<RED_PB) | (1<<GREEN_PB); // на выход RGB
   PORTB &= ~((1<<BLUE_PB) | (1<<RED_PB) | (1<<GREEN_PB));
   DDRD |= (1<<2); // PD2 на вход (INT0)
   PORTD |= (1 << 2); // Включение подтягивающего резистора
   MCUSR |= (1 << ISC00) | (1 << ISC01); // Передний фронт сигнала
   GICR  = (1 << INT0);                 // Включение входа прерывания
   sei(); /* Общее разрешение прерываний */
   //---------- Таймер 1---------------
   TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
   TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10);
   TCNT1 = 0x00;
   ICR1 = 0xFF;
   OCR1A = 0x00;
   OCR1B = 0x00;
    //---------- Таймер 2----------------------------
   TCCR2 |= (1 << COM21) | (1 << WGM21) | (1 << WGM20) | (1 << CS20);
   TCNT2 = 0x00;
   OCR2 = 0x00;
   //---------- Таймер 0--------------------------------
   TCCR0 = 0b00000101; // Т0 на внутр.такт, делитель 1024
   TCNT0 = 60; // переполнение через 25мС
   i_Count = 10;
   TIMSK |= (1 << TOIE0); /* Разрешить прерывание по                       
                                переполн.Т0*/
   sei();
   
   while(1)
   {
       //----------
       if (i>26) 
           {
          BLUE_PWM = 0;
          RED_PWM  = 255;   
          GREEN_PWM = 0;
         }
      
          //----------
       if (i>15) 
            {
          BLUE_PWM = 250;
          RED_PWM  = 250;   
          GREEN_PWM = 250;
          }
      
             
           if (i<8) 
                {
              BLUE_PWM = 0;
              RED_PWM  = 0;    // зеленый
              GREEN_PWM = 250;
           }
      
        }
   }



Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 02:00:29 
Открыл глаза
Аватар пользователя

Карма: 2
Рейтинг сообщений: 25
Зарегистрирован: Ср янв 03, 2018 01:36:14
Сообщений: 57
Рейтинг сообщения: 1
У вас pin INT0 настроен на выход, а не на вход. Ну и в замен подтяжки вы просто держите на D2 высокий лог. уровень. Следовательно из за неправильной настройки порта не срабатывают прерывания на INT0.

Цитата:
DDRD |= (1<<2); // PD2 на вход (INT0) <--(это убрать)
PORTD |= (1 << 2); // Включение подтягивающего резистора


Надеюсь это единственная причина и это вам поможет, если вы сами это еще не нашли.

И да. Та часть что в бесконечном цикле тоже будет работать не правильно

Цитата:
while(1)
{
//----------
if (i>26)
{
BLUE_PWM = 0;
RED_PWM = 255;
GREEN_PWM = 0;
}

//----------
if (i>15)
{
BLUE_PWM = 250;
RED_PWM = 250;
GREEN_PWM = 250;
}


if (i<8)
{
BLUE_PWM = 0;
RED_PWM = 0; // зеленый
GREEN_PWM = 250;
}

}


Так как если і больше 26, то оно и больше 15, а по скольку у вас три независимых условия то оно всегда будет принимать значение того что выполняется последним. Их лучше расписать через else if()


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 04:09:21 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
Да, я с направлением порта напутал. Привык, что в ПИКушках 1- вход.
А по поводу цикла программы, если else будет громоздко.
Можно ли обойтись таким нелюбимым всеми оператором goto ?
Код:
while(1)
   {
 //----------
m:
       if (i>26) 
           {
          BLUE_PWM = 0;
          RED_PWM  = 255;   
          GREEN_PWM = 0;
                     goto  m; 
         }
      
          //----------
       if (i>15) 
            {
          BLUE_PWM = 250;
          RED_PWM  = 250;   
          GREEN_PWM = 250;
                         goto m;
          }
      
             
           if (i<8) 
                {
              BLUE_PWM = 0;
              RED_PWM  = 0;    // зеленый
              GREEN_PWM = 250;
                         goto  m;
           }
         }


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 06:31:14 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт янв 31, 2019 18:49:04
Сообщений: 76
Откуда: Воронежская область
Рейтинг сообщения: 0
А если так:
Спойлерif(i<8){...}
if(i>8&&i<15){...}
if(i>15&&i<26){...}
if(i>26){...}

Не устроит?

_________________
Изображение


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 07:34:19 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
А если так:
Не устроит?

Я приводил упрощенный пример.
В реальном проекте проверка идет от 8 до 26 каждое целое значение. Т.е 8, 9, 10...26
Наверное правильнее будет сделать мне сравнение с число
if (i>26) {}
if (i==26) {}
if (i==25) {}
.....
if(i==8) {}
if(i<8) {}


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 09:26:17 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6619
Откуда: Сердце Пармы
Рейтинг сообщения: 4
Медали: 1
Получил миской по аватаре (1)
ну, если это последовательный ряд чисел, то я бы применил массив...
Код:
if (i>26) i=26;
if (i<=8) {i=0;} else {i-=8;};
Blue=BLUE_PWM[i];
Red=RED_PWM[i];
Green=GREEN_PWM[i];
или свитч кейс:
Код:
 if (i>26) i=26;
switch (i)
{
case 26: ..... break;
case 25: ..... break;
..............,..........
case 9: ...... break;
default: .......
};

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


Последний раз редактировалось Ivanoff-iv Вс мар 17, 2019 12:27:51, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 09:52:06 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
wws63 писал(а):
если else будет громоздко
интересно, с чего вдруг?
Код:
if(cond_1){
  // первый выбор
} else if(cond_2){
  // второй выбор
} else if (cond_3){
  // третий выбор
} else {
  // если ничего не подошло
}


Добавлено after 3 minutes 36 seconds:
если сравнивате "цепочкой" по условию "больше" - начинайте с наибольшего. т.е. если сравниваем с числами 5, 10, 15 и 20, то надо писать в такой последователньости
Код:
if(x > 20){
  // x более 20
} else if(x > 15){
  // х более 15, но менее или равно 20
} else if(x > 10){
  // х более 10, но менее или равно 15
} else if(x > 5){
  // х более 5, но менее или равно 10
} else {
  // х менее или равно 5
}

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 11:31:34 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
если сравнивате "цепочкой" по условию "больше" - начинайте с наибольшего.

А выход из процедуры при условии совпадения без goto ?
Код:
  if (i>26)  // больше 3100 об/мин
          {
          BLUE_PWM = 0;
          RED_PWM  = 255;    // красный
          GREEN_PWM = 0;
          goto m; //----- убрать?
          }


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 11:38:03 
Ум, честь и совесть. И скромность.
Аватар пользователя

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

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 12:16:53 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
вся цепочка - это как бы один оператор.

Спасибо, завтра посмотрю как в "железе" работает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 12:33:07 
Друг Кота
Аватар пользователя

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вс мар 17, 2019 14:39:01 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
поправил прошлое сообщение (дописал код на кейсах)...

Буду пробовать все варианты


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Пн мар 18, 2019 16:05:26 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
Застрял на ровном месте. В Протеусе все работает на УРА, скважность с каждого канала ШИМ меняется в заданных параметрах, строго по частоте входного сигнала.
А в "железе" одни глюки. Светодиоды мигают хаотично, при этом изменение частоты входного сигнала не дает почти никаких изменений. Перепробовал все.
Снижал частоту генерации ШИМ (менее сотни Гц), думал может РЖБ - лента, изменял фронты сигнала на входе INT0, менял контроллер, игрался с тактовой частотой, менял пороги срабатывания ... Короче все , что можно. Разумеется, проверил монтаж на плате (сопли, обрывы). :dont_know:
В общем не знаю, в какую сторону копать :( Может есть какие то подводные камни с Атмегой 8?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Пн мар 18, 2019 16:20:15 
Друг Кота
Аватар пользователя

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Пн мар 18, 2019 16:55:37 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
питание мк стабльное?
блокировочные конденсаторы имеются?
ресет к плюсу притянут?
как разведены ключи лент?
схему давай!

Причина найдена!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: прерывание от таймера 0
СообщениеДобавлено: Вт мар 19, 2019 16:43:15 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 54
Зарегистрирован: Вс май 21, 2006 16:07:59
Сообщений: 1201
Откуда: Алтай
Рейтинг сообщения: 0
Вместо регистра MCUCR было записано MCUSR.
Студия 6 (как впрочем и 4) на ноутбуке нормально компилировала в хекс, приносил проект на другой комп там прошивал и ступор.
Когда попытался внести изменения в программу и заново откомпилировать уже на компе, студия 6 начала ругаться на MCUSR.
Мистика! :dont_know:
Едем дальше :write:


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

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


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

Сейчас этот форум просматривают: OKF, roman.com и гости: 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