Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не моргает светодиод.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Kassi
Нажмите для просмотра прикрепленного файла Доброго времени суток.
Учусь по книге, где есть готовые примеры на С (программирую на STK500 всё-OK). Решил сделать что то своё.
Имеется ATtiny2313 вход (0) порта D коммутируется кнопкой на землю.
На выходе PORTB включен светодиод на Vcc.
Алгоритм на словах прост:
-при подаче питания LED не светится;
-замыкаем кнопку на землю-LED зажигается на 3 сек. и гаснет;
-отпускаем кнопку -LED вновь зажигается на 3 сек. и гаснет:
-LED потушен, пока кнопка снова не переключится.
Проще говоря, при переключении по фронту и по спаду LED должен зажечься на 3 сек. и погаснуть.
Пробовал по разному - LED моргает, но не так как надо.
Видимо фантазии не хватает образно мыслить.
Подтолкните в нужном направлении.
drovik
Цитата(Kassi @ Nov 29 2008, 21:23) *
Нажмите для просмотра прикрепленного файла Доброго времени суток.
Учусь по книге, где есть готовые примеры на С (программирую на STK500 всё-OK). Решил сделать что то своё.
Имеется ATtiny2313 вход (0) порта D коммутируется кнопкой на землю.
На выходе PORTB включен светодиод на Vcc.
Алгоритм на словах прост:
-при подаче питания LED не светится;
-замыкаем кнопку на землю-LED зажигается на 3 сек. и гаснет;
-отпускаем кнопку -LED вновь зажигается на 3 сек. и гаснет:
-LED потушен, пока кнопка снова не переключится.
Проще говоря, при переключении по фронту и по спаду LED должен зажечься на 3 сек. и погаснуть.
Пробовал по разному - LED моргает, но не так как надо.
Видимо фантазии не хватает образно мыслить.
Подтолкните в нужном направлении.


Что-то в исходнике с фигурными скобками напутано... Много их в блоках if. Да и код одинаковый при любом условии выполняется, даже если их правильно расставить. А внешние прерывания у него есть ?
Paulina
Код
while (1)
   {
   while (PIND.0==1) {}          // Проверка нажатия кнопки
   if (PINB.0==1)
     { PORTB.0=0; }                 // Зажигаем светодиод
     delay_ms (3000);                   // Задержка 3 сек.
     { PORTB.0=1; }                      // Тушим светодиод
   else
     { PORTB.0=0; }            // Зажигаем светодиод
     delay_ms (3000);           // Задержка 3 сек.
     { PORTB.0=1; }                      // Тушим светодиод
  while (PIND.0==0) {}
  };
}

согласна с drovik, какой смысл в if-else если куски кода после них одинаковые?
сделайте лучше так:
Код
while(1)
{
  if(PIND.0==1) //если не нажата,  
  {
    while(PIND.0==1); //ждем нажатия
    PORTB.0=0;
    delay_ms(3000);
    PORTB.0=1;
  }
  if(PIND.0==0) //если нажата,
  {
    while(PIND.0==0); //ждем отпускания
    PORTB.0=0;
    delay_ms(3000);
    PORTB.0=1;
  }
}

или используйте прерывания
Kassi
Ура, заработала!!!!
Буду разбираться, как это у Вас красиво получается.
Прерываний нет, я пока о них даже думать боюсь.
Спасибо большое.
Kassi
Эээ, тут нюансик пробежал.
Вчера, на радостях что заработало, решил ещё код помучить в (CVAVR).
Изменил задержку во втором цикле.
Проверил - ошибок нет, жму Project-Make-OK и тут выскакивает маленький, жёлтый транспарантик с каким -то предупреждением, я его проигнорировал - потом буду разбираться.
Запрограммировал, включил, работает на первый взгляд, как и хотел: при нажатии горит 3 сек., при отпускании 0,5сек.
Вроде всё хорошо, но вспомнил сообщение:
Paulina: "... согласна с drovik, какой смысл в if-else если куски кода после них одинаковые?..."
Вот и закралось сомнение, если я изменил задержку, то куски уже не одинаковы?
Сделал всё заново и так и этак и на следующий день, но предупреждение больше не появлялось.
Подскажите, корректно ли я изменил код или надо было писать if-else.
Хотя, как бы всё работает, но...
drovik
Цитата(Kassi @ Nov 30 2008, 17:53) *
Эээ, тут нюансик пробежал.
Вчера, на радостях что заработало, решил ещё код помучить в (CVAVR).
Изменил задержку во втором цикле.
Проверил - ошибок нет, жму Project-Make-OK и тут выскакивает маленький, жёлтый транспарантик с каким -то предупреждением, я его проигнорировал - потом буду разбираться.
Запрограммировал, включил, работает на первый взгляд, как и хотел: при нажатии горит 3 сек., при отпускании 0,5сек.
Вроде всё хорошо, но вспомнил сообщение:
Paulina: "... согласна с drovik, какой смысл в if-else если куски кода после них одинаковые?..."
Вот и закралось сомнение, если я изменил задержку, то куски уже не одинаковы?
Сделал всё заново и так и этак и на следующий день, но предупреждение больше не появлялось.
Подскажите, корректно ли я изменил код или надо было писать if-else.
Хотя, как бы всё работает, но...


Усе нормально изменил, а вообще-то лучше текст предупреждения писать. (А еще лучше читать, переводить и делать выводы). Обычно предупреждения не опасны, но могут помочь выявить логическую ошибку в программе.
Kassi
Вчера очень хотелось кнопки понажимать.
Понадеялся, что потом верну всё назад и разберусь, а оно (предупреждение) больше не появилось.
Теперь переживаю, что это было?
XVR
Цитата(Kassi @ Nov 30 2008, 23:14) *
Вчера очень хотелось кнопки понажимать.
Понадеялся, что потом верну всё назад и разберусь, а оно (предупреждение) больше не появилось.
Теперь переживаю, что это было?
Телевизор смотрел? Землетрясения в Тимбукуту не случилось? Наводнения на Северном Полюсе? Пожара на Южном? Нет? Значит ни о чем опасном не предупреждали smile.gif Но на будущее - желтенькие транспорантики лучше читать сразу, т.к. предупреждения, касающиеся компилируемых исходников обычно пишутся в логи компиляции, а все выскакивающее, всплывающее и выпригивающее обычно касается чего то другого (например, кончилась память на компьютере, или банально забыл сохранить файл с исходником перед компиляцией). Так что они могут больше и не появится (а могут и появится), и это скорее всего никак с исходниками связано не будет biggrin.gif
Kassi
Спасибо, что не прошли мимо сообщения.
Беру себя в руки, приготовил ручку и блокнот - буду записывать (аккуратно).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.