Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.03.2015, 13:33
|
|
Частый гость
Регистрация: 03.05.2007
Сообщений: 17
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Вот ссылка http://www.radioparty.ru/device-pic/214-sensordimmer Работает стабильно, под свои нужды немного доработать можно. Вместо сенсора кнопку ставил то-же работает.
|
|
|
|
05.03.2015, 20:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
Но, если в прерывании будем инициализировать TCNT значениями больше чем регистр сравнения, то и совпадения не будет никогда. Кстати, я могу это сейчас прогнать в AVR Studio
PS. Только что прогнал в AVR Studio свои предположения по инициализации. Все подтвердилось - ШИМ пропадает.
|
"Прощёлкайте" пожалуйста ещё один цикл таймера в симулякре.
|
|
|
|
05.03.2015, 21:42
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
"Прощёлкайте" пожалуйста ещё один цикл таймера в симулякре.
|
Всем доброго времени суток.
Если честно, я не понял, что я должен был увидеть, но для большей наглядности, я сообразил проект в Proteus. Замкнутый переключатель вписывает значение в TCNT0.
PS. Только что заметил, что, если значение, OCR0A маленькое, то пока в прерывании впишется ТCNT0 происходит совпадение и выход устанавливается и сбрасывается при TOP. Но при этом ШИМ становится не предсказуемым и зависит от длительности прерывания.... Мне кажется, что использовать эти режимы, которые мало поддаются анализу, неэффективно.
Последний раз редактировалось МВА; 05.03.2015 в 23:02.
|
|
|
|
07.03.2015, 01:02
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Исправил в коде кучу ошибок теперь компилируется без ошибок и замечаний, но дело в том, что микроконтроллер почему-то не просыпается после нажатия кнопки!
Кому не сложно, посмотрите пожалуйста, почему? Вот исправленный код
|
|
|
|
07.03.2015, 01:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
Если честно, я не понял, что я должен был увидеть
|
То, что ШИМ не щёлкнет только один раз, в следующем цикле уже всё будет нормально. Но для того он и сбрасывается, чтоб не выйти за пределы, правда делать это надо до включения таймера.
|
|
|
|
07.03.2015, 02:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
No comments.
|
|
|
Сказали "Спасибо" omercury
|
|
|
07.03.2015, 18:37
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
No comments.
|
Всем доброго времени суток.
//TCCR0A &=~(3‹‹6); // щтключить ШИМ
//TCCR0A & = ~((1‹‹COM01)|(1‹‹COM00)); //Отключить ВЫХОД от ШИМ, хотя зачем это делать не включая его, тоже непонятно
ЭТИ ДВЕ СТРОЧКИ, ЭТО ОДНО И ТОЖЕ.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
if (BACKLIGHT_on) //Если флаг установлен (включен)
{
TCCR0A&=~(3‹‹6); // выключить ШИМ
led_on = 0;//выключить светодиод
BACKLIGHT_on = 0; //сбросить флаг его включения
I_Want_Sleep(); //усыпление микроконторллера
}
else //А если выключен - включить
{
-----------------------------------------------------------------------------------
//А ЗДЕСЬ, ЕСЛИ ВЫ ВКЛЮЧАЕТЕ ПОДСВЕТКУ, ЗАЧЕМ ВЫКЛЮЧАТЬ ШИМ. НО, ЕСЛИ ВКЛЮЧИТЬ ШИМ, ТО led_on=1; - БЕСПОЛЕЗНАЯ ИНСТРУКЦИЯ
-----------------------------------------------------------------------------------
TCCR0A&=~(3‹‹6); // выключить ШИМ
led_on = 1; // включить светодиод
BACKLIGHT_on = 1; // установить флаг включения
}
Последний раз редактировалось МВА; 07.03.2015 в 19:28.
|
|
|
|
07.03.2015, 19:19
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
То, что ШИМ не щёлкнет только один раз, в следующем цикле уже всё будет нормально. Но для того он и сбрасывается, чтоб не выйти за пределы, правда делать это надо до включения таймера.
|
Мы говорим о записи в TCNT в прерывании о переполнении. Прерывание вызывается в каждом цикле, при переходе через ТОР в 0.
Значит в каждом цикле будет происходить эта запись. И она имеет значение, только тогда, когда нужно подогнать точное значение между прерываниями для инкремента таймеров, но когда нет ШИМ и не в конце прерывания, а в начале. Но, как я понял, даже записывать 0, (в конце прерывания, а в начале он и так там есть) - это на грани фола. Дело в том, что таймер считает асинхронно. И когда уже идет прерывание, он начал отсчет с нуля. Прерывание, может иметь и пятьдесят, и сто, в общем, разное количество тиков. И поэтому, при выходе, будет сбрасываться счет, что приведет к затягиванию цикла на количество тиков в прерывании.
PC. Для Prosto Andriy, если Вы внимательно читали мои коментарии, то вот, в главной функции есть такие строчки.
systemClock++; //ЭТА ПЕРЕМЕННАЯ УВЕЛИЧИВАЕТСЯ В ПРЕРЫВАНИИ ПО ПЕРЕПОЛНЕНИЮ И У НЕЕ ДОЛЖНЫ БЫТЬ РАВНОМЕРНЫЕ ТИКИ.
//А В ДАННОМ СЛУЧАЕ, МЕЖДУ ПРЕРЫВАНИЯМИ, ОНА БУДЕТ УВЕЛИЧИВАТЬСЯ С ТАКОЙ СКОРОСТЬЮ, ЧТО ДОСТИГНЕТ МАКСИМУМА
//ЧЕРЕЗ МИЛИСИКУНДЫ.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!
Я думаю, что Вы даже не заметите, как МК проснется и снова заснет.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!
if (systemClock › secundes)
{
TCCR0A&=~(3‹‹6); // выключить ШИМ (ЭТА СТРОЧКА)
led_on = 0; //(И ЭТА ТОЖЕ ЕСТЬ В ФУНКЦИИ I_Want_Sleep())
I_Want_Sleep(); //Усыпляем МК в PowerDown
}
Последний раз редактировалось МВА; 07.03.2015 в 21:29.
|
|
|
|
07.03.2015, 21:52
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Omercury, большое спасибо за код, но компилятор похоже не понял вот эту строку:
PHP код:
|
TCCR0A = (1‹‹WGM1) | (1‹‹WGM0); //Теперь таймер работает в Fast PWM, но выход отключен, см 8 bit timer/counter register description
|
Вылазит:
PHP код:
|
Error: …\untitled.c(155): undefined symbol 'WGM1'
|
Непонятно почему???
И ещё мне непонятно, как добавить задержку, в том месте, где Вы посоветовали?
Как будет отсчитываться интервал времени, если таймер выключается предыдущей строкой??? Нужно его опять включить??? Вот фрагмент кода:
PHP код:
|
void I_Want_Sleep(void)
{
systemClock = 0;
//TCCR0A =~(3‹‹6); // щтключить ШИМ
//TCCR0A & = ~((1‹‹COM01)|(1‹‹COM00)); //Отключить ВЫХОД от ШИМ, хотя зачем это делать не включая его, тоже непонятно
led_on = 0; //ЭТУ СТРОЧКУ ЖЕЛАТЕЛЬНО ПИСАТЬ ПОСЛЕ ОТКЛЮЧЕНИЯ ВЫХОДА ТАЙМЕРА
BACKLIGHT_on = 0; //Сбросили флаг, чтоб в следующий раз включился
TCCR0B=0; //Disable timer ТАЙМЕР МОЖНО НЕ ВЫКЛЮЧАТЬ, ЧТОБЫ ПОТОМ НЕ ВКЛЮЧАТЬ, ОН И ТАК ТИКАТЬ НЕ БУДЕТ.
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//Правильно его выключать, а вдруг досчитал уже.
// И ещё сюда НАДО ДОБАВИТЬ задержку на пару секунд, чтоб оператор успел отпустить кнопку
// Сделайте это сами - это очень просто.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
MCUCR=0x30; //PowerDown Mode interrupt by level Я РЕЖИМ СНА МОЖНО ИНИЦИАЛИЗИРОВАТЬ ДО БЕСКОНЕЧНОГО ЦИКЛА И БОЛЬШЕ К НЕМУ НЕ ВОЗВРАЩАТЬСЯ
//ПРАВДА В ВАШЕМ СЛУЧАЕ ИСПОЛЬЗУЕТСЯ 2 РЕЖИМА СНА И ЭТА СТРОЧКА ТУТ УМЕСТНА. (Согласен)
GIMSK=0x40; //Enable External Interrupt-0
#asm("sleep") //Усыпляем МК
}
|
|
|
|
|
07.03.2015, 22:10
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Непонятно почему???
|
Не TCCR0A = (1‹‹WGM1) | (1‹‹WGM0);
надо делать так:
TCCR0A = (1‹‹WGM01) | (1‹‹WGM00);
PS. В проекте у omercury есть ошибка TIMSK0= 0x02;//Timer Overflow Interrupt (надо инициализировать число 0x01) иначе не будет прерывания по переполнению.
Последний раз редактировалось МВА; 07.03.2015 в 22:53.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:21.
|
|