|
Не моргает светодиод. |
|
|
|
Nov 29 2008, 18:23
|
Группа: Участник
Сообщений: 13
Регистрация: 22-11-08
Пользователь №: 41 867

|
_____________.doc ( 23.5 килобайт )
Кол-во скачиваний: 232 Доброго времени суток. Учусь по книге, где есть готовые примеры на С (программирую на STK500 всё-OK). Решил сделать что то своё. Имеется ATtiny2313 вход (0) порта D коммутируется кнопкой на землю. На выходе PORTB включен светодиод на Vcc. Алгоритм на словах прост: -при подаче питания LED не светится; -замыкаем кнопку на землю-LED зажигается на 3 сек. и гаснет; -отпускаем кнопку -LED вновь зажигается на 3 сек. и гаснет: -LED потушен, пока кнопка снова не переключится. Проще говоря, при переключении по фронту и по спаду LED должен зажечься на 3 сек. и погаснуть. Пробовал по разному - LED моргает, но не так как надо. Видимо фантазии не хватает образно мыслить. Подтолкните в нужном направлении.
Сообщение отредактировал Kassi - Nov 29 2008, 18:27
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Nov 29 2008, 18:33
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 7-05-07
Пользователь №: 27 573

|
Цитата(Kassi @ Nov 29 2008, 21:23) 
_____________.doc ( 23.5 килобайт )
Кол-во скачиваний: 232 Доброго времени суток. Учусь по книге, где есть готовые примеры на С (программирую на STK500 всё-OK). Решил сделать что то своё. Имеется ATtiny2313 вход (0) порта D коммутируется кнопкой на землю. На выходе PORTB включен светодиод на Vcc. Алгоритм на словах прост: -при подаче питания LED не светится; -замыкаем кнопку на землю-LED зажигается на 3 сек. и гаснет; -отпускаем кнопку -LED вновь зажигается на 3 сек. и гаснет: -LED потушен, пока кнопка снова не переключится. Проще говоря, при переключении по фронту и по спаду LED должен зажечься на 3 сек. и погаснуть. Пробовал по разному - LED моргает, но не так как надо. Видимо фантазии не хватает образно мыслить. Подтолкните в нужном направлении. Что-то в исходнике с фигурными скобками напутано... Много их в блоках if. Да и код одинаковый при любом условии выполняется, даже если их правильно расставить. А внешние прерывания у него есть ?
Сообщение отредактировал drovik - Nov 29 2008, 18:44
|
|
|
|
|
Nov 29 2008, 19:12
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Код 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 - Nov 29 2008, 19:38
|
|
|
|
|
Nov 29 2008, 20:04
|
Группа: Участник
Сообщений: 13
Регистрация: 22-11-08
Пользователь №: 41 867

|
Ура, заработала!!!! Буду разбираться, как это у Вас красиво получается. Прерываний нет, я пока о них даже думать боюсь. Спасибо большое.
Сообщение отредактировал Kassi - Nov 29 2008, 20:06
|
|
|
|
|
Nov 30 2008, 14:53
|
Группа: Участник
Сообщений: 13
Регистрация: 22-11-08
Пользователь №: 41 867

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

Группа: Новичок
Сообщений: 47
Регистрация: 7-05-07
Пользователь №: 27 573

|
Цитата(Kassi @ Nov 30 2008, 17:53)  Эээ, тут нюансик пробежал. Вчера, на радостях что заработало, решил ещё код помучить в (CVAVR). Изменил задержку во втором цикле. Проверил - ошибок нет, жму Project-Make-OK и тут выскакивает маленький, жёлтый транспарантик с каким -то предупреждением, я его проигнорировал - потом буду разбираться. Запрограммировал, включил, работает на первый взгляд, как и хотел: при нажатии горит 3 сек., при отпускании 0,5сек. Вроде всё хорошо, но вспомнил сообщение: Paulina: "... согласна с drovik, какой смысл в if-else если куски кода после них одинаковые?..." Вот и закралось сомнение, если я изменил задержку, то куски уже не одинаковы? Сделал всё заново и так и этак и на следующий день, но предупреждение больше не появлялось. Подскажите, корректно ли я изменил код или надо было писать if-else. Хотя, как бы всё работает, но... Усе нормально изменил, а вообще-то лучше текст предупреждения писать. (А еще лучше читать, переводить и делать выводы). Обычно предупреждения не опасны, но могут помочь выявить логическую ошибку в программе.
|
|
|
|
|
Nov 30 2008, 20:14
|
Группа: Участник
Сообщений: 13
Регистрация: 22-11-08
Пользователь №: 41 867

|
Вчера очень хотелось кнопки понажимать. Понадеялся, что потом верну всё назад и разберусь, а оно (предупреждение) больше не появилось. Теперь переживаю, что это было?
|
|
|
|
|
Dec 1 2008, 09:57
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Kassi @ Nov 30 2008, 23:14)  Вчера очень хотелось кнопки понажимать. Понадеялся, что потом верну всё назад и разберусь, а оно (предупреждение) больше не появилось. Теперь переживаю, что это было? Телевизор смотрел? Землетрясения в Тимбукуту не случилось? Наводнения на Северном Полюсе? Пожара на Южном? Нет? Значит ни о чем опасном не предупреждали  Но на будущее - желтенькие транспорантики лучше читать сразу, т.к. предупреждения, касающиеся компилируемых исходников обычно пишутся в логи компиляции, а все выскакивающее, всплывающее и выпригивающее обычно касается чего то другого (например, кончилась память на компьютере, или банально забыл сохранить файл с исходником перед компиляцией). Так что они могут больше и не появится (а могут и появится), и это скорее всего никак с исходниками связано не будет
|
|
|
|
|
Dec 2 2008, 10:04
|
Группа: Участник
Сообщений: 13
Регистрация: 22-11-08
Пользователь №: 41 867

|
Спасибо, что не прошли мимо сообщения. Беру себя в руки, приготовил ручку и блокнот - буду записывать (аккуратно).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|