Easyelectronics.ru

Электроника для всех
Текущее время: 14 дек 2018, 08:16

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




Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 16:52 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
Нужно сделать кнопку с миганием светодиода без _delay_ms, ибо кнопка в обработчике прерываний, настроил таймер T0, смотрю на примеры с разных сайтов, вижу что нужно через регистр таймера TCNT0 настроить, но не могу понять как, смотрю в книгу, вижу...) Возможно и кнопка написана неправильно, с _delay_ms было просто:
PORTD|=(1<<5);
_delay_ms(50);
PORTD&=~(1<<5);
_delay_ms(50);

А вот собсна, сам код:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int main()
{
DDRD|=1<<5;
PORTD|=1<<4;
TCCR0B|=(0<<CS02)|(1<<CS01)|(0<<CS00);
TIMSK0|=1<<TOIE0;
TCNT0=50;//корень всех моих проблем, не считая мои мозги
sei();
for(;;)
{

}
}//end main
ISR(TIMER0_OVF_vect)
{
if ((PIND&(1<<4))==0)
{
PORTD|=(1<<5);
}
else
{
PORTD&=~(1<<5);
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 16:54 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2435
так 4 или 5?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 16:57 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
goreprogrammist писал(а):
так 4 или 5?

Светодио на 5 порту, кнопка на 4, если ты это хотел узнать)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 17:00 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2435
сообразил, кажется. что-то тут странное. что значит "ибо кнопка в обработчике прерываний"?
не до конца инициализировано. не пойму, тут таймер оверфлов - оно для мигания или для опроса кнопки? нужно-то в итоге что? кратко нажал кнопку - замигало, второй раз кратко нажал - перестало мигать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 17:02 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
goreprogrammist писал(а):
сообразил, кажется. что-то тут странное. что значит "ибо кнопка в обработчике прерываний"?
не до конца инициализировано. не пойму, тут таймер оверфлов - оно для мигания или для опроса кнопки? нужно-то в итоге что? кратко нажал кнопку - замигало, второй раз кратко нажал - перестало мигать?

в главной функции я настроил таймер, в обработчике прерываний-кнопку, нужно чтобы при ЗАЖАТОЙ кнопке светодиод мигал


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 17:03 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
goreprogrammist писал(а):
сообразил, кажется. что-то тут странное. что значит "ибо кнопка в обработчике прерываний"?
не до конца инициализировано. не пойму, тут таймер оверфлов - оно для мигания или для опроса кнопки? нужно-то в итоге что? кратко нажал кнопку - замигало, второй раз кратко нажал - перестало мигать?

а ибо кнопка в обработчике прерываний-прочитал где-то что в нём нельзя использовать _delay_ms, ведь во время него программа замораживается


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 17:16 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2435
правильно, в обработчике не надо delay
в итоге сейчас прервание выглядит так: если кнопка зажата - включаем, если отпущена -выключаем.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 17:33 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
goreprogrammist писал(а):
правильно, в обработчике не надо delay
в итоге сейчас прервание выглядит так: если кнопка зажата - включаем, если отпущена -выключаем.

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

а можно непосредственно пример?
if ((PIND&(1<<4))==0)
{
if (PORTD&=~(1<<5))
{
PORTD|=(1<<5);
}
}
else
{
PORTD&=~(1<<5)
}
я так понял ваше сообщение)
и я правильно понимаю, регистром TCNT0 я могу задавать длительность задержки(типо _delay_ms)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 18:31 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1286
А вставьте код нормально, в теге [CODE].

PS: TCNT0 это просто счетчик таймера, который увеличивается на 1 каждый тик таймера. Как только произойдет переполнение (>255) сгенерируется прерывание, если оно было включено (TOIE0). Выставляя его в определенное значение больше 0 сначала (и вообще-то еще каждый раз в прерывании надо) просто добиваются нужного интервала срабатывания прерывания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 18:53 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2435
типа так?
Код:
if ((PIND&(1<<4))==0) //тут кнопка, значит, была подтянута к питанию
{   
   if (PIND&(1<<5)==0)
    {
     PORTD|=(1<<5);
    }
   else
    {
     PORTD&=~(1<<5)
    }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 19:15 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1286
goreprogrammist, типа так. Только я к ТС обращался )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 19:17 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
goreprogrammist писал(а):
типа так?
Код:
if ((PIND&(1<<4))==0) //тут кнопка, значит, была подтянута к питанию
{   
   if (PIND&(1<<5)==0)
    {
     PORTD|=(1<<5);
    }
   else
    {
     PORTD&=~(1<<5)
    }
}

кнопка у меня подтянута на 4 порт и на землю, а светодиод на 5 порт и землю, все это дело у меня на ардуинке уно, насколько я знаю, питание там встроенное(5В), с вашим кодом у меня светодиод по нажатию загорается и остается включенным, при повторном нажатии выключается, и то бывает не реагирует и выключается раза с 3-4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 19:31 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1286
Код:
if ((PIND&(1<<4))==0) //тут кнопка, значит, была подтянута к питанию
{   
   if (PIND&(1<<5)==0)
    {
     PORTD|=(1<<5);
    }
   else
    {
     PORTD&=~(1<<5);
    }
} else
  PORTD&=~(1<<5); // выключить LED если кнопка не нажата


И не горит у вас она постоянно, а почти что ШИМится, т.к. очень быстро таймер небось срабатывает... в ДШ лезть некогда, настройки таймера AVR на память не помню.
PS: Поставьте что-ли Prescaler максимальный пока и уберите TCNT=50 - не нужно это вам.
Код:
TCCR0B|=(1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 0;

Изображение


Последний раз редактировалось NStorm 06 мар 2018, 19:36, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 19:35 
Заглядывает иногда

Зарегистрирован: 10 май 2011, 12:39
Сообщения: 60
Откуда: Тольятти
Сделайте прерывания пореже или введите счетчик прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 19:40 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
Код:
if ((PIND&(1<<4))==0) //тут кнопка, значит, была подтянута к питанию
{   
   if (PIND&(1<<5)==0)
    {
     PORTD|=(1<<5);
    }
   else
    {
     PORTD&=~(1<<5);
    }
} else
  PORTD&=~(1<<5); // выключить LED если кнопка не нажата


И не горит у вас она постоянно, а почти что ШИМится, т.к. очень быстро таймер небось срабатывает... в ДШ лезть некогда, настройки таймера AVR на память не помню.
PS: Поставьте что-ли Prescaler максимальный пока и уберите TCNT=50 - не нужно это вам.
Код:
TCCR0B|=(1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 0;

Изображение

можно пояснение что такое ДШ? вообще у меня таймер для программного ШИМа(примитивное плавное загорание и затухание светодиода) и настроен, а кнопка должна заставлять светодиод мигать с той яркостью, которая была когда мы нажали кнопку, а по отжатию снова ШИМ работает с той же яркостью, которая была при отжатии кнопки


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 19:42 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
Код:
if ((PIND&(1<<4))==0) //тут кнопка, значит, была подтянута к питанию
{   
   if (PIND&(1<<5)==0)
    {
     PORTD|=(1<<5);
    }
   else
    {
     PORTD&=~(1<<5);
    }
} else
  PORTD&=~(1<<5); // выключить LED если кнопка не нажата


И не горит у вас она постоянно, а почти что ШИМится, т.к. очень быстро таймер небось срабатывает... в ДШ лезть некогда, настройки таймера AVR на память не помню.
PS: Поставьте что-ли Prescaler максимальный пока и уберите TCNT=50 - не нужно это вам.
Код:
TCCR0B|=(1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 0;

Изображение

поэтому я и не могу изменять предделители в таймере, ШИМ перестанет работать


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 19:52 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
А если мне засунуть кнопку не в обработчик прерываний, а в основной цикл, то тогда как это будет выглядеть можете подсказать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 20:38 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2435
можно и в основном цикле.

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

всяко можно. нужно начать делать, а тут может быть поправят...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 06 мар 2018, 22:44 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1286
ДШ = даташит.
Что-то я запутался что вам нужно. Вы вначале писали, что хотите мигать LEDом при нажатой кнопке. Пока никакого "плавного загорания и затухания" у вас в коде и близко нет. Посмотрите такой код ШИМ на таймере. Загуглил за 20 секунд:
Код:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>


volatile unsigned char pwm;             // шим
volatile unsigned char pwm_counter; // яркость
       unsigned char rev;        // переключение режимов
      

int main(void)
{

   DDRB = 0x01;
   
   TCCR0 |= (0<<CS02)|(1<<CS01)|(0<<CS00); // настройка тактирования таймера
   TIMSK |= (1<<TOIE0);                    // настройка прерывания по переполнению
   sei();                                   // включить глобальные прерывания
   
   
   while(1)
   {
      // плавное мигание светодиодом
      switch(rev)
      {
         case 0:   // плавное разгорание
            pwm_counter++;
            if(pwm_counter == 255)
            {
               rev = 1;
            };_delay_ms(4); // время разгорания
         break;
         case 1: // плавное затухание
            pwm_counter--;
            if(pwm_counter == 0)
            {
               rev = 0;
            };_delay_ms(6); // время затухания
         break;
      }
   }
}

SIGNAL(TIMER0_OVF_vect)
{
   TCNT0 = 200; // частота шим

   // программный  ШИМ
   if(pwm++ < pwm_counter)
   {
      PORTB|=_BV(0); // зажечь светодиод
   }else{
      PORTB&=~_BV(0);// погасить светодиод
   }
   
   
}

Осталось вам дописать суда мигание по кнопке. Только вам известно с какой частотой мигать вы хотите. Просто считайте количество циклов переполнения таймера в прерывание и сбрасывайте или устанавливайте флаг и запоминайте "частоту".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 07 мар 2018, 04:27 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3230
Откуда: Тольятти
Код:
unsigned int cnt;            // сквозной счетчик

ISR(TIMER0_OVF_vect) {
   cnt++;
   if(cnt > 10) {
      cnt=0;
      if(!(PIND&(1<<4))) {      // если нажата кнопка
         PORTD ^= (1<<5);   // мигание
      } else {         // а если не нажата, то
         PORTD &= ~(1<<5);   // выключение
      }
   }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 07 мар 2018, 05:54 
Заглядывает иногда

Зарегистрирован: 03 июл 2012, 19:16
Сообщения: 131
А с дребезгом как боретесь?
Делается то все просто. Прерывание от таймера, в нем счетчики на разные интервалы времени (1 мс, 50 мс 200 мс, 1 с, да какой угодно интервал), сколько интервалов надо. По переполнению счетчика ставится флаг разрешения задачи. В основном цикле по флагу вызывается задача опросить кнопку, либо изменить состояние светодиода. В остальное время процессор своими делами занят. Опрашиваем кнопку каждые 234 мс, если состояние порта без изменений несколько раз подряд (или, усложняя задачу, большинство раз за период), значит кнопка гарантированно нажата или отжата. При желании отлавливается и короткое, и длинное нажатие простым счетчиком. Раз в 666 мс смотрим флаг "кнопка была нажата", если установлен - мигаем светодиодом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 07 мар 2018, 08:36 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
Asawis писал(а):
goreprogrammist писал(а):
типа так?
Код:
if ((PIND&(1<<4))==0) //тут кнопка, значит, была подтянута к питанию
{   
   if (PIND&(1<<5)==0)
    {
     PORTD|=(1<<5);
    }
   else
    {
     PORTD&=~(1<<5)
    }
}

кнопка у меня подтянута на 4 порт и на землю, а светодиод на 5 порт и землю, все это дело у меня на ардуинке уно, насколько я знаю, питание там встроенное(5В), с вашим кодом у меня светодиод по нажатию загорается и остается включенным, при повторном нажатии выключается, и то бывает не реагирует и выключается раза с 3-4

Да включите вы мозги наконец!
if ((PIND&(1<<4))==0) //тут кнопка, значит, была подтянута к питанию
{
if (PIND&(1<<5)==0)
{
PORTD|=(1<<5);
}
else
{
PORTD ^= (1<<5);
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 07 мар 2018, 09:50 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1286
Щито? На кой там xor?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 07 мар 2018, 11:39 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
NStorm писал(а):
Щито? На кой там xor?

Вот и подумайте!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мигание светодиодиком и глупый ученик)
СообщениеДобавлено: 07 мар 2018, 11:56 
Заглядывает иногда

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
я бы мог исходны код с моим ШИМом скинуть, но его никто не разберет из-за редактирования текста на форуме) я его кидал в другой своей теме, сейчас буду пробывать ваши варианты и разбираться, спасибо


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу 1, 2, 3  След.

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


Кто сейчас на конференции

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


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB