Перейти к содержанию
    

Не моргает светодиод.

_____________.doc Доброго времени суток.

Учусь по книге, где есть готовые примеры на С (программирую на STK500 всё-OK). Решил сделать что то своё.

Имеется ATtiny2313 вход (0) порта D коммутируется кнопкой на землю.

На выходе PORTB включен светодиод на Vcc.

Алгоритм на словах прост:

-при подаче питания LED не светится;

-замыкаем кнопку на землю-LED зажигается на 3 сек. и гаснет;

-отпускаем кнопку -LED вновь зажигается на 3 сек. и гаснет:

-LED потушен, пока кнопка снова не переключится.

Проще говоря, при переключении по фронту и по спаду LED должен зажечься на 3 сек. и погаснуть.

Пробовал по разному - LED моргает, но не так как надо.

Видимо фантазии не хватает образно мыслить.

Подтолкните в нужном направлении.

Изменено пользователем Kassi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

_____________.doc Доброго времени суток.

Учусь по книге, где есть готовые примеры на С (программирую на STK500 всё-OK). Решил сделать что то своё.

Имеется ATtiny2313 вход (0) порта D коммутируется кнопкой на землю.

На выходе PORTB включен светодиод на Vcc.

Алгоритм на словах прост:

-при подаче питания LED не светится;

-замыкаем кнопку на землю-LED зажигается на 3 сек. и гаснет;

-отпускаем кнопку -LED вновь зажигается на 3 сек. и гаснет:

-LED потушен, пока кнопка снова не переключится.

Проще говоря, при переключении по фронту и по спаду LED должен зажечься на 3 сек. и погаснуть.

Пробовал по разному - LED моргает, но не так как надо.

Видимо фантазии не хватает образно мыслить.

Подтолкните в нужном направлении.

 

Что-то в исходнике с фигурными скобками напутано... Много их в блоках if. Да и код одинаковый при любом условии выполняется, даже если их правильно расставить. А внешние прерывания у него есть ?

Изменено пользователем drovik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;
  }
}

или используйте прерывания

Изменено пользователем Paulina

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ура, заработала!!!!

Буду разбираться, как это у Вас красиво получается.

Прерываний нет, я пока о них даже думать боюсь.

Спасибо большое.

Изменено пользователем Kassi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эээ, тут нюансик пробежал.

Вчера, на радостях что заработало, решил ещё код помучить в (CVAVR).

Изменил задержку во втором цикле.

Проверил - ошибок нет, жму Project-Make-OK и тут выскакивает маленький, жёлтый транспарантик с каким -то предупреждением, я его проигнорировал - потом буду разбираться.

Запрограммировал, включил, работает на первый взгляд, как и хотел: при нажатии горит 3 сек., при отпускании 0,5сек.

Вроде всё хорошо, но вспомнил сообщение:

Paulina: "... согласна с drovik, какой смысл в if-else если куски кода после них одинаковые?..."

Вот и закралось сомнение, если я изменил задержку, то куски уже не одинаковы?

Сделал всё заново и так и этак и на следующий день, но предупреждение больше не появлялось.

Подскажите, корректно ли я изменил код или надо было писать if-else.

Хотя, как бы всё работает, но...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эээ, тут нюансик пробежал.

Вчера, на радостях что заработало, решил ещё код помучить в (CVAVR).

Изменил задержку во втором цикле.

Проверил - ошибок нет, жму Project-Make-OK и тут выскакивает маленький, жёлтый транспарантик с каким -то предупреждением, я его проигнорировал - потом буду разбираться.

Запрограммировал, включил, работает на первый взгляд, как и хотел: при нажатии горит 3 сек., при отпускании 0,5сек.

Вроде всё хорошо, но вспомнил сообщение:

Paulina: "... согласна с drovik, какой смысл в if-else если куски кода после них одинаковые?..."

Вот и закралось сомнение, если я изменил задержку, то куски уже не одинаковы?

Сделал всё заново и так и этак и на следующий день, но предупреждение больше не появлялось.

Подскажите, корректно ли я изменил код или надо было писать if-else.

Хотя, как бы всё работает, но...

 

Усе нормально изменил, а вообще-то лучше текст предупреждения писать. (А еще лучше читать, переводить и делать выводы). Обычно предупреждения не опасны, но могут помочь выявить логическую ошибку в программе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вчера очень хотелось кнопки понажимать.

Понадеялся, что потом верну всё назад и разберусь, а оно (предупреждение) больше не появилось.

Теперь переживаю, что это было?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вчера очень хотелось кнопки понажимать.

Понадеялся, что потом верну всё назад и разберусь, а оно (предупреждение) больше не появилось.

Теперь переживаю, что это было?

Телевизор смотрел? Землетрясения в Тимбукуту не случилось? Наводнения на Северном Полюсе? Пожара на Южном? Нет? Значит ни о чем опасном не предупреждали :) Но на будущее - желтенькие транспорантики лучше читать сразу, т.к. предупреждения, касающиеся компилируемых исходников обычно пишутся в логи компиляции, а все выскакивающее, всплывающее и выпригивающее обычно касается чего то другого (например, кончилась память на компьютере, или банально забыл сохранить файл с исходником перед компиляцией). Так что они могут больше и не появится (а могут и появится), и это скорее всего никак с исходниками связано не будет :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, что не прошли мимо сообщения.

Беру себя в руки, приготовил ручку и блокнот - буду записывать (аккуратно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...