Easyelectronics.ru

Электроника для всех
Текущее время: 12 дек 2018, 15:31

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




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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1281
Вы намеренно игнорируете тег [code]? С ним нормально форматируется код. Как был, так и будет точнее.


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
Вы намеренно игнорируете тег Code? С ним нормально форматируется код. Как был, так и будет точнее.


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

Код:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile uint8_t c=0;
volatile uint8_t d=0;
volatile uint8_t test=0;
volatile uint8_t testt=0;
int main()
{
   DDRD|=1<<5;
   PORTD|=1<<4;
   TCCR0B|=(0<<CS02)|(1<<CS01)|(0<<CS00);
   TIMSK0|=1<<TOIE0;
   sei();
   for(;;)
   {
         
   }
}//end main
ISR(TIMER0_OVF_vect)
{
   if (++d<50)
   {
      if (d<test)
      {
         PORTD|=1<<5;
      }
      else
      {
         PORTD&=~(1<<5);
      }
   }
   else
   {
      d=0;
      if (++c==5)
      {
         if (testt==0)
         {
            if (++test==50)
            {
               testt=1;
            }
         }
         else
         {
            if (--test==0)
            {
               testt=0;
            }
         }
         c=0;
      }
   }
}


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

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


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

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
Asawis писал(а):
мне подсказали, что это реализуемо с помощью xor, только я догнать код самой кнопки мигания светодиода не могу, все прошлые варианты, скинутые сюда перепробывал, понимаю что по логике они должны работать, а почему-то по кнопку светодиод просто включается
Господи!!! У вас же интервалы между включениями короткие, их на глаз не видно.
Код:
ISR(TIMER0_OVF_vect)
    {
    static char _cnt;

    if (PORTD & (1<<4))    // Button is released
            PORTD| = 1<<5;     // Turn LED off
    else                  // Button is pressed
            {
            if (!(++_cnt % 8))  // Blink the LED every 8th tick
                PORTD&=~(1<<5);
            }
     }


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
Bill писал(а):
Asawis писал(а):
мне подсказали, что это реализуемо с помощью xor, только я догнать код самой кнопки мигания светодиода не могу, все прошлые варианты, скинутые сюда перепробывал, понимаю что по логике они должны работать, а почему-то по кнопку светодиод просто включается
Господи!!! У вас же интервалы между включениями короткие, их на глаз не видно.
Код:
ISR(TIMER0_OVF_vect)
    {
    static char _cnt;

    if (PORTD & (1<<4))    // Button is released
            PORTD| = 1<<5;     // Turn LED off
    else                  // Button is pressed
            {
            if (!(++_cnt % 8))  // Blink the LED every 8th tick
                PORTD&=~(1<<5);
            }
     }

я конечно не знаток, но почему у вас скобок нету в if-ах? с этим кодом у меня просто светодиод горит, на кнопку не реагирует, я возможно сам себя уже запутал) попробую заного разобраться что к чему


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

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
Asawis писал(а):
я конечно не знаток, но почему у вас скобок нету в if-ах? с этим кодом у меня просто светодиод горит, на кнопку не реагирует, я возможно сам себя уже запутал) попробую заного разобраться что к чему
В фигурные скобки заключаются составные операторы. Если оператор простой, фигурные скобки можно не ставить.
Код:
  if (a > b)
      c = a;
  else
      c = b;


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

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
Asawis писал(а):
с этим кодом у меня просто светодиод горит, на кнопку не реагирует, я возможно сам себя уже запутал) попробую заного разобраться что к чему

Как вариант попробуйте коэффициент деления предделителя увеличить.


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
Прочитал что мигание можно либо задать с помощью_delay_ms в основном цикле, либо через таймер, первый пример отпадает, т.к. у меня кнопка должна мигать светодиодом с яркостью, на которой остановился ШИМ, который находится в прерывании, а второй вариант я нашел примеры только с установленным предделителем 1024, а у меня шим работает только на предделителе 8


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1281
1024/8 = 128. Просто отсчитывайте счетчиком 128 раз и только тогда выполняете переключение светодиода. Чтобы "остановить ШИМ" - вам нужно будет завести дополнительные переменные или переделать цикл ШИМ по-другому.
Возьмите за привычку называть переменные нормальными именами. Всегда. Все эти d, c, test, testt - глаза сломаешь ведь.


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
1024/8 = 128. Просто отсчитывайте счетчиком 128 раз и только тогда выполняете переключение светодиода. Чтобы "остановить ШИМ" - вам нужно будет завести дополнительные переменные или переделать цикл ШИМ по-другому.
Возьмите за привычку называть переменные нормальными именами. Всегда. Все эти d, c, test, testt - глаза сломаешь ведь.

Спасибо, уже допёр что необходима еще одна переменная для кнопки, вопросы правда не особо отпали, написал кнопку так,можно обьяснить как отсчитать счётчиком 128?16Мгц/8=2Мгц, в TCNT0 записать 2Мгц/128?
Код:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile uint8_t c=0;
volatile uint8_t v=0;
volatile uint8_t d=0;
volatile uint8_t test=0;
volatile uint8_t shim=0;
int main()
{
   DDRD|=1<<5;
   PORTD|=1<<4;
   TCCR0B|=(0<<CS02)|(1<<CS01)|(0<<CS00);
   TIMSK0|=1<<TOIE0;
   sei();
   for(;;)
   {
      if ((PIND&(1<<4))==0)
      {
         if (++v<10)
         {
            if (v<5)
            {
               PORTD|=1<<5;
            }
            else
            {
               PORTD&=~(1<<5);
            }
         }
         else
         {
            v=0;
         }
      }      
   }
}//end main
ISR(TIMER0_OVF_vect)
{
   if (++d<50)
   {
      if (d<test)
      {
         PORTD|=1<<5;
      }
      else
      {
         PORTD&=~(1<<5);
      }
   }
   else
   {
      d=0;
      if (++c==5)
      {
         if (shim==0)
         {
            if (++test==50)
            {
               shim=1;
            }
         }
         else
         {
            if (--test==0)
            {
               shim=0;
            }
         }
         c=0;
      }
   }
}


Последний раз редактировалось Asawis 07 мар 2018, 15:34, всего редактировалось 1 раз.

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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
это я ещё пока в кнопку не добавил влияние ШИМ на яркость мигания светодиода


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

Зарегистрирован: 07 авг 2017, 22:05
Сообщения: 20
Что то у тебя мешанина какая выходит.
Разбивай задачу на мелкие подзадачи, типа - включить светодиод, выключить светодиод, обработать кнопку, подождать столько то мс.
Иначе кода мало, читается с трудом, а в переменных 100% сам потом запутаешься.
Планируй, в общем.

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

Код:
#define BUTTON_PIN 4
#define LED_PIN 5
#define DELAY_TIMER_START_VALUE 240 //Начальное значения счетчика таймера, пояснения ниже.
#define DELAY_TIMEOUT 200 //Значение самой задержки в милисекундах. Например - хотим чтобы таймер срабатываел каждые 200мс
#define BUTTON_FILTER DEPTH 100 //Глубина фильтра антидребезга

volatile uint8_t F_DELAY; //Флаг окончания задержки.
votatile uint8_t F_BUTTON_PRESSED //Флаг нажатой кнопки
uint_16t delay_count = 0; //счетчик таймера зарежки.
uint8_t button_filter = 0; //счетчик фильтра антидребезга
uint8_t last_led_state; //Включен ли светодиод

void io_init()
{
   //Настройка выводов.
   //Для КАЖДОГО используемого указываем кто он - вход/выход,
   //если выход - указываем значение, если вход - нужна ли подтяжка.
   //Сэкономленные 10 секунд не стоят часов поиска причин того,
   //почему какой-то из выводов ведет себя не так как ожидается.
   
   DDRD &= ~(1 << BUTTON_PIN); //На вход, для кнопки
   DDRD |= (1 << LED_PIN);      //На выход, для светодиода
   
   PORTD |= (1 << BUTTON_PIN); //Вход с подтяжкой
   PORTD &= ~(1 << LED_PIN);   //Светодиод выключен
   
   last_led_state = 0; //Сообщаем что светодиод выключен
   
}

void delay_timer_init()
{
   //Инициализация таймера
   
   
   
   //Инициализируем флаг
   F_DELAY = 0;
   
   //Настраиваем предделитель на 1024.
   //Будет щелкать на частоте 16МГц/1024=15625Гц или раз в 1/1562464=64 наносекунды.
   
   TCCR0B|=(1<<CS02)|(0<<CS01)|(1<<CS00);   
   
   //Теперь начальное значение счетчика.
   //64 наносекунды - слишком быстро. Но таймер 8-битный и прерывание вылетает когда он дощелкает от 0  до 255.
   //А значит если он будет считать не от нуля, а от 240, то он щелкнет 15 раз до переполнения,
   //что даст интервал между прерываниями в 960наносекунд, а это почти милисекунда
   
   TCNT0=DELAY_TIMER_START_VALUE;
   
   
   //Ну и разрешаем прерывания
   TIMSK0|=1<<TOIE0;                  
   
}

void set_led_state(uint_8t led_on)
{
   //Задаем стояние светодиода.
   //Включаем/выключаем там, или ШИМ запускаем/останавливаем.
   
   if(led_on)
   {
      PORTD |= (1 << LED_PIN);
      last_led_state = 1; //Сообщаем что светодиод/ШИМ включен
      //pwm_on(); //Некая функция, например запускающая ШИМ
   }
   else
   {
      PORTD &= ~(1 << LED_PIN);
      last_led_state = 0; // //Сообщаем что светодиод/ШИМ выключен
      //pwm_off();   /Некая функция, останавливающая ШИМ   
   }
}


ISR(TIMER0_OVF_vect)
{
   //Обработчик прерывания, будет вызываться раз в 1 мс
   //Здесь только работа с переменными. Никаких тяжелых функций
   //Только запись/чтение переменнных, инкременты, декременты, установки флагов и условия
   
   //Для начала заново задаем значение счетчика таймера,
   //ведь он сейчас переполнился и сбросился в 0,
   //а нам нужно не 0, а наше расчитанное значение.
   
   TCNT0=DELAY_TIMER_START_VALUE;
   
   //Теперь то, что нам нужно сделать раз 1мс
   
   //Например досчитать до 200 чтобы получить задержку в 200мс,
   //Как досчитаем  - установим флаг F_DELAY, чтобы известить других что это случилось и сбросим счетчик.
   
   if(delay_count > DELAY_TIMEOUT)
   {
      delay_count++;
   }
   else
   {
      F_DELAY = 1;    // Устанавливаем флаг
      delay_count = 0;   //Сбрасываем счетчик
   }
   
   //Обрабатываем кнопку
   //Работа фильтра - нажатая кнопка инкрементирует переменную button_filter, отжатая декрементирует.
   //Кнопка считается нажатой когда переменная достигнет максимальной глубины фильтра, отжатой - нуля.
   if(PIND&(1<<BUTTON_PIN)) //Лог.1 на выводе, значит кнопка отжата
   {
      if(button_filter > 0)
         button_filter--;
      else
         F_BUTTON_PRESSED = 0;
   }
   else
   {
      if(button_filter < BUTTON_FILTER DEPTH)
         button_filter++;
      else
         F_BUTTON_PRESSED = 1;
   }
}

int main()
{
   //Инициализируемся
   io_init();
   delay_timer_init();
   sei();
   
   while(1)
   {
      if(F_DELAY) //Прошло 200мс
      {
         F_DELAY = 0;    //Обязательно сбросить флаг!
         
         if(F_BUTTON_PRESSED) //Кнопка нажата
         {
         if(last_led_state) //Если сейчас статус светодиода/ШИМа "включен"
            set_led_state(0); //То выключаем
         else
            set_led_state(1); //Иначе - включаем
         
         }
         else //Ну а если кнопка отжата - то тоже выключаем
         {
            set_led_state(0);
         }
      }
   }
}


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
Вижу я многих запутал своим ШИМом и программой в целом, да и сам запутался) Давайте забудем обо всём и вернёмся к истокам: как сделать мигание светодиодом без _delay_ms, если по счетчику в таймере, то при моей частоте в 16Мгц и предделителе 8, получается 2млн тиков/сек, но таймер 8 битный, и считает от 0 до 255, то 1 тик происходит в 1/2млн=5пикасекунд(О_о,такое вообще существует?),либо если есть другие варианты, то напишите их пожалуйста, через переменную там, или вроде читал в даташите atmega328p(мой МК) что можно это сделать через INT0 INT1


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1281
Ох боже, ну вам же столько примеров уже дали. Конечно через переменную. Вы не совсем понимаете, как работает таймер и как с ним работать самому. Во-первых таймер тикает от 0 до 255, ок, только прерывание у вас происходит по переполнению таймера! Т.е. когда он достигает 255 и сбрасывается в 0. Т.е. не каждый тик, а раз в 256 тиков. Далее вам никто не мешает в обработчике прерываний завести свою статическую переменную и ей отмерять количество переполнений таймера и действовать только когда достигнете нужного количества. Подсказка - переменную можно сделать и не 8-битной даже. Сделайте uint16_t и сможете запускать действия вплоть до 65536 переполнений таймеров, т.е. 65536*256 "тиков". Плюс кто вам мешает настроить предделитель таймера на большее значение? Считайте сами какой вам нужен интервал и сколько переполнений вам нужно будет отсчитать. Если прям точно нужно попадать в определенное значение, еще регистр таймера порой надо делать больше 0 сначала.

PS: Дабы не считать ручками, полно калькуляторов, типа такого: http://elektron.ucoz.ua/index/kalkuljat ... a_avr/0-29


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

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


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1281
Да можно всё в том же таймере. Просто ввести счетчик, еще одну переменную для "запоминания" скважности ШИМа и условие проверки нажатия кнопки.


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
Ох боже, ну вам же столько примеров уже дали. Конечно через переменную. Вы не совсем понимаете, как работает таймер и как с ним работать самому. Во-первых таймер тикает от 0 до 255, ок, только прерывание у вас происходит по переполнению таймера! Т.е. когда он достигает 255 и сбрасывается в 0. Т.е. не каждый тик, а раз в 256 тиков. Далее вам никто не мешает в обработчике прерываний завести свою статическую переменную и ей отмерять количество переполнений таймера и действовать только когда достигнете нужного количества. Подсказка - переменную можно сделать и не 8-битной даже. Сделайте uint16_t и сможете запускать действия вплоть до 65536 переполнений таймеров, т.е. 65536*256 "тиков". Плюс кто вам мешает настроить предделитель таймера на большее значение? Считайте сами какой вам нужен интервал и сколько переполнений вам нужно будет отсчитать. Если прям точно нужно попадать в определенное значение, еще регистр таймера порой надо делать больше 0 сначала.

PS: Дабы не считать ручками, полно калькуляторов, типа такого: http://elektron.ucoz.ua/index/kalkuljat ... a_avr/0-29

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


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1281
Ну тогда просто отмеряйте количество переполнений таймера и всё. Глобально volatile uint16_t cnt, в обработчике прерываний cnt++; if (cnt >= 390) { cnt = 0; ....


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
Ну тогда просто отмеряйте количество переполнений таймера и всё. Глобально volatile uint16_t cnt, в обработчике прерываний cnt++; if (cnt >= 390) { cnt = 0; ....

Код:
if ((PORTD&(1<<4))==0)
   {
      v++;
      if (v<25)
      {
         PORTD|=1<<5;
      }
      if (v<50)
      {
         PORTD&=~(1<<5);
      }
      else
      {
         v=0;
      }
   }

вот так вот написал, в значении 25 и 50 не уверен, сейчас он вообще не реагирует на кнопку, переменную оставил uint8_t, сказали кнопку всё-таки написать в обработчике прерываний, ибо в основной функции он не успевает её опрашивать как я понял, если интересно глянуть весь код, то вот :
Код:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile uint8_t c=0;
volatile uint8_t v=0;
volatile uint8_t d=0;
volatile uint8_t test=0;
volatile uint8_t shim=0;
int main()
{
   DDRD|=1<<5;
   PORTD|=1<<4;
   TCCR0B|=(0<<CS02)|(1<<CS01)|(0<<CS00);
   TIMSK0|=1<<TOIE0;
   sei();
   for(;;)
   {
      
   }
}//end main
ISR(TIMER0_OVF_vect)
{
   if ((PORTD&(1<<4))==0)
   {
      v++;
      if (v<25)
      {
         PORTD|=1<<5;
      }
      if (v<50)
      {
         PORTD&=~(1<<5);
      }
      else
      {
         v=0;
      }
   }
   else
   {
      if (++d<50)
      {
         if (d<test)
         {
            PORTD|=1<<5;
         }
         else
         {
            PORTD&=~(1<<5);
         }
      }
      else
      {
         d=0;
         if (++c==5)
         {
            if (shim==0)
            {
               if (++test==50)
               {
                  shim=1;
               }
            }
            else
            {
               if (--test==0)
               {
                  shim=0;
               }
            }
            c=0;
         }
      }
   }
}


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1281
У вас ошибка чуть ли не в каждой строке. PINx и PORTx путаете. Вложенность if не соблюдаете. У вас внутри if (v==25) есть if (v==50), которое никогда не выполнится. Но при этом не выполнится условие даже if (v==25), т.к. вы после этого в else всегда сбрасываете v=0. А в следующем примере кода делаете переменную 8-битную и ожидаете, что она сможет принимать значения 2500, 5000...
Думайте сами. Откройте любой учебник и сделайте хотя бы без ШИМ для начала просто мигание без delay. Потом сделайте мигание просто по кнопке. А потом уже подумайте как это совместить с ШИМом уже. Алгоритм вам расписали. Если сами код не напишите, то и понимания никогда не появится.

EDIT: Пока писал ответ, часть уже подправили в своём посте ) Уже лучше. Только:
Код:
...
      if (v<25)
      {
         PORTD|=1<<5;
      }
      if (v<50)
...

у вас всегда будут выполняться оба условия! Надо во втором блоке использовать else if тогда уж.
PS: И цифры возьмите лучше 100 и 200, чтобы хоть как-то заметно было мигание. И PORT на PIN выше поменяйте, где вход считываете, иначе вы конфигурация порта считываете, а не значение.


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
У вас ошибка чуть ли не в каждой строке. PINx и PORTx путаете. Вложенность if не соблюдаете. У вас внутри if (v==25) есть if (v==50), которое никогда не выполнится. Но при этом не выполнится условие даже if (v==25), т.к. вы после этого в else всегда сбрасываете v=0. А в следующем примере кода делаете переменную 8-битную и ожидаете, что она сможет принимать значения 2500, 5000...
Думайте сами. Откройте любой учебник и сделайте хотя бы без ШИМ для начала просто мигание без delay. Потом сделайте мигание просто по кнопке. А потом уже подумайте как это совместить с ШИМом уже. Алгоритм вам расписали. Если сами код не напишите, то и понимания никогда не появится.

EDIT: Пока писал ответ, часть уже подправили в своём посте ) Уже лучше. Только:
Код:
...
      if (v<25)
      {
         PORTD|=1<<5;
      }
      if (v<50)
...

у вас всегда будут выполняться оба условия! Надо во втором блоке использовать else if тогда уж.
PS: И цифры возьмите лучше 100 и 200, чтобы хоть как-то заметно было мигание. И PORT на PIN выше поменяйте, где вход считываете, иначе вы конфигурация порта считываете, а не значение.

Да я уже заметил косяк с PIN) поменя переменную на 16 битную и значения на 1250 и 2500, сейчас всё работает, только светодиод мигает тускло, и с шимом пока не связан


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
NStorm писал(а):
У вас ошибка чуть ли не в каждой строке. PINx и PORTx путаете. Вложенность if не соблюдаете. У вас внутри if (v==25) есть if (v==50), которое никогда не выполнится. Но при этом не выполнится условие даже if (v==25), т.к. вы после этого в else всегда сбрасываете v=0. А в следующем примере кода делаете переменную 8-битную и ожидаете, что она сможет принимать значения 2500, 5000...
Думайте сами. Откройте любой учебник и сделайте хотя бы без ШИМ для начала просто мигание без delay. Потом сделайте мигание просто по кнопке. А потом уже подумайте как это совместить с ШИМом уже. Алгоритм вам расписали. Если сами код не напишите, то и понимания никогда не появится.

EDIT: Пока писал ответ, часть уже подправили в своём посте ) Уже лучше. Только:
Код:
...
      if (v<25)
      {
         PORTD|=1<<5;
      }
      if (v<50)
...

у вас всегда будут выполняться оба условия! Надо во втором блоке использовать else if тогда уж.
PS: И цифры возьмите лучше 100 и 200, чтобы хоть как-то заметно было мигание. И PORT на PIN выше поменяйте, где вход считываете, иначе вы конфигурация порта считываете, а не значение.

Код:
if ((PIND&(1<<4))==0)
   {
      v++;
      if (v<1250)
      {
         PORTD|=1<<5;
      }
      if (v<2500)
      {
         PORTD&=~(1<<5);
      }
      else
      {
         v=0;
      }
   }

Вот так вот работает)


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1281
Цитата:
Вот так вот работает)

Опять же else if должен быть там у v<2500 иначе включаться будет вывод только на несколько тиков проца, потому что дальше сразу же выключаться будет в след. блоке всегда.


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

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

Опять же else if должен быть там у v<2500 иначе включаться будет вывод только на несколько тиков проца, потому что дальше сразу же выключаться будет в след. блоке всегда.

окей сейчас подправлю, попытаюсь) а почему светодиод тускло горит?


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

Зарегистрирован: 06 мар 2018, 15:22
Сообщения: 40
Asawis писал(а):
NStorm писал(а):
Цитата:
Вот так вот работает)

Опять же else if должен быть там у v<2500 иначе включаться будет вывод только на несколько тиков проца, потому что дальше сразу же выключаться будет в след. блоке всегда.

окей сейчас подправлю, попытаюсь) а почему светодиод тускло горит?

вопрос снят, как раз else if и помог)


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

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


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

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


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

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

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