Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Непрочитано 03.03.2015, 18:49  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
Большое спасибо Вам за подсказку! Отредактировал код, как Вы посоветовали, но всё равно компилятор почему-то считает функцию бесполезной?
Всем доброго времени суток.
Добавляю дополнительные замечания, после более подробного просмотра. Обратите внимание на инициализацию, так, как даже режим ШИМ оказался не выбранным.
Вложения:
Тип файла: txt LED_on_off_corrected-2.txt (6.3 Кб, 30 просмотров)
Реклама:

Последний раз редактировалось МВА; 03.03.2015 в 19:01.
МВА вне форума  
Непрочитано 03.03.2015, 20:32  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от МВА Посмотреть сообщение
Обратите внимание на инициализацию, так, как даже режим ШИМ оказался не выбранным.
Вы считаете это важным?
Особенно учитывая реинит таймера при побудке, а первое, что МК делает после инита, это здоровый и крепкий сон.
По сути, весь инит должен состоять из определения параметров порта, установки режима сна и инициализации внешнего прерывания.
Инициализация переменных в данном конкретном случае весьма приветствуется.
omercury вне форума  
Непрочитано 03.03.2015, 21:32  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Вы считаете это важным?
Особенно учитывая реинит таймера при побудке, а первое, что МК делает после инита, это здоровый и крепкий сон.
По сути, весь инит должен состоять из определения параметров порта, установки режима сна и инициализации внешнего прерывания.
Инициализация переменных в данном конкретном случае весьма приветствуется.
Вот это прерывание при пробуждении:
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
GIMSK=0x00; //Disable External Interrupt-0
MCUCR=0x20; //Idle Mode interrupt by level
TCCR0A&=~(3‹‹6); //‹= ПРЕРЫВАНИЕ INT0 - ДОЛЖНО ИСПОЛЬЗОВАТЬСЯ ДЛЯ ВКЛЮЧЕНИЯ, А ВЫ ВЫКЛЮЧАЕТЕ ШИМ.
TCCR0B=0x03; //CLK/64 Enable Timer
TCNT0=0x00; // ‹= ЭТА СТОРКА ЛИШНЯЯ. ЗАПИСЬ В ЭТОТ РЕГИСТР ДЕЛАЕТСЯ, КОГДА НУЖНО ПОДОГНАТЬ ДЛИТЕЛЬНОСТЬ МЕЖДУ ПРЕРЫВАНИЯМИ, НО ПРИ ШИМ ЕЕ ТРОГАТЬ НЕЛЬЗЯ.
clr_var(); //Сброс переменных
BACKLIGHT_on = 0;//ЕСЛИ ЭТО ПРЕРЫВАНИЕ ВКЛЮЧЕНИЯ - ПОЧЕМУ ВЫКЛЮЧАЕТСЯ ПОДСВЕТКА?
BACKLIGHT_on_off;
}
Попробуйте показать здесь РЕИНИТ. Тольлко выключение ОС0А.
При побудке таймера значения РОН, ОЗУ и РВВ не меняется. Поэтому можно управлять отдельными битами, для включения выключения устройств, и не делать РЕИНИТ. Может я и ошибаюсь, не буду спорить, но в программе, которую я выкладывал для Prosto Andriy, я один раз все инициализировал, и при сне и побудке больше ничего не делал, как только разрешал или запрещал прерывания. Еще сбрасывал или устанавливал COM0A0 и COM0A1 и больше ничего. Даже не трогал биты управления режимом сна, хотя это рекомендуют в даташитах. И все работает без замечаний.
Миниатюры:
Нажмите на изображение для увеличения
Название: Рисунок1.png
Просмотров: 22
Размер:	38.0 Кб
ID:	76277  
МВА вне форума  
Непрочитано 03.03.2015, 23:03  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от МВА Посмотреть сообщение
TCNT0=0x00; // ‹= ЭТА СТОРКА ЛИШНЯЯ. ЗАПИСЬ В ЭТОТ РЕГИСТР ДЕЛАЕТСЯ, КОГДА НУЖНО ПОДОГНАТЬ ДЛИТЕЛЬНОСТЬ МЕЖДУ ПРЕРЫВАНИЯМИ, НО ПРИ ШИМ ЕЕ ТРОГАТЬ НЕЛЬЗЯ.
Где Вы такую глупость вычитали?
Да, в ДШ есть упоминание, что запись в счётчик таймера может вызвать коллизии в случае TOP›TCNT (что невозможно, ибо и то и другое 0xFF), либо пи обнулении счётчика при счёте вниз (что тоже неправда, ибо считает вверх).
Хотя с тем, что трогать его не нужно, согласен.

Сообщение от МВА Посмотреть сообщение
Попробуйте показать здесь РЕИНИТ.
Здесь не покажу.
У меня был.


Кстати, не наезжайте, в вашей на асме я Вам тоже лишние строки показать могу.
omercury вне форума  
Непрочитано 04.03.2015, 01:24  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

МВА, большое спасибо за то, что указали на ошибки, - в общем, получается, что там строк с ошибками больше, чем без ошибок

Переписал функцию key_scan(); теперь она выглядит так:
PHP код:
void    key_scan(void)
{

   {
    if  KeyPress                //Если кнопка нажата. ЕСЛИ КНОПКА НАЖАТА МЫ ВОШЛИ В ЭТУ ФУНКЦИЮ
    {                            
            count++;          //Увеличиваем счётчик задержки. ПОСЛЕ ИНКРЕМЕНТА, ЕСЛИ СЧЕТЧИК НЕ ДОСТИГ МЫ ПРОПУСКАЕМ ЭТУ ИНСТРУКЦИЮ
            if  (count›longkey) //Если длинное нажатие
            {                                
               BACKLIGHT_on_off();
               count--;        // "замораживаем" значение счетчика        
            }                   //Выход
        } 
        else                    
        {   
            count=0;         // сбрасываем счетчик 
        }                       //Выход  
        
       systemClock = 0;        //Сброс таймаута выключения подсветки.
    } 

    else
    #asm("sleep")
} 
Теперь правильно???
prosto_andriy вне форума  
Непрочитано 04.03.2015, 18:07  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Где Вы такую глупость вычитали?
Да, в ДШ есть упоминание, что запись в счётчик таймера может вызвать коллизии в случае TOP›TCNT (что невозможно, ибо и то и другое 0xFF), либо пи обнулении счётчика при счёте вниз (что тоже неправда, ибо считает вверх).
Всем доброго времени суток.
Эту глупость я нигде не читал. Эту глупость придумал я сам. Дело в том, что если изменять TCNT0 тогда, когда работает ШИМ, короче, представьте, что Вы при выходе из прерывания инициализируете какое-то значение в ТСNT0, а регистр OCRA или OCRB, а то и оба сразу в этот момент имеют значение меньше, чем вы заложили в TCNT, и в итоге, будет или срыв ШИМа, я не проверял, или будет включение или выключение выхода, в зависимости от того, какой режим используется, сразу в следующем тике таймера. Но, повторяю, это мое мнение.
И для Вас, Prosto Andriy, С точки зрения синтаксиса - ошибок не вижу, но переменная сount, я понял, что она отвечает за длительность нажатия. Поэтому для того, чтобы она инкрементировалась равномерно, это лучше делать в прерывании вместе со всеми счетчиками. А в программе просто обнулять его перед тем как начинаешь отсчет. Но тут тоже не все так просто. У меня в программе именно так и сделано, но делал это я по отрицательному фронту сигнала на кнопке, в противном случае можешь наткнутся на камень, сам не замечая того, что пока будет нажата кнопка счетчик будет сбрасываться. Так как сделано это у Вас, тоже можно, но дело в том, что длительность между инкрементами будет зависеть от длительности цикла, а он в свою очередь не всегда одинаковый и зависит от многих условий в программе и отсчитанная длительность может плавать в очень больших пределах.

PS. Если у Вас цель поучиться, то продолжайте грызть программу, пока не добьете. А если Вам нужно просто, чтобы устройство работало можете установить фьюз SCKDIV8 =0 и заливать ту прошивку, что я выкладывал в последний раз. Там все работает, только в макросе Sleep_ строку
ori r16, 1‹‹0 ;высокий уровень в РВ0(для демоплаты) выключение подсветки
заменить на
and r16,~(1‹‹0).

Последний раз редактировалось МВА; 04.03.2015 в 18:24.
МВА вне форума  
Непрочитано 04.03.2015, 18:26  
makakus
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.10.2007
Сообщений: 2,758
Сказал спасибо: 1,100
Сказали Спасибо 1,033 раз(а) в 568 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от МВА Посмотреть сообщение
Эту глупость придумал я сам. ...
и в итоге, будет или срыв ШИМа, я не проверял,
Не проверяли - а пишете.
Ничего не будет, кроме того, что бывает когда счётчик имеет это значение. Он идёт себе дальше...

Сообщение от МВА Посмотреть сообщение
С точки зрения синтаксиса - ошибок не вижу
Вы о №355?
Там такие отступы, что совершенно непонятно, что к чему. В результате - последнее else чьё? Две скобки в начале подряд...
makakus вне форума  
Непрочитано 04.03.2015, 18:45  
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от makakus Посмотреть сообщение
Не проверяли - а пишете.
Ничего не будет, кроме того, что бывает когда счётчик имеет это значение. Он идёт себе дальше...


Вы о №355?
Там такие отступы, что совершенно непонятно, что к чему. В результате - последнее else чьё? Две скобки в начале подряд...
Точно, скобки я не считал и логику в отрыве от программы рассматривать тоже бесполезно.
Prosto Andriy, обрати внимание на последнюю строчку от makakus.
А насчет того что счетчик считает дальше это верно. Длительность цикла до следующего прерывания будет меньше и этим можно подгонять цикл я тоже согласен, но, в момент совпадения регистра сравнения и счетчика должен поменять состояние выход ШИМ. Но, если в прерывании будем инициализировать TCNT значениями больше чем регистр сравнения, то и совпадения не будет никогда. Кстати, я могу это сейчас прогнать в AVR Studio

PS. Только что прогнал в AVR Studio свои предположения по инициализации. Все подтвердилось - ШИМ пропадает. Проэкт прилагаю, правда там есть кое-что лишнее, я его закоментировал. Для проверки запустите автовыполнение и ШИМ будет. Потом раскоментируйте строчку в прерывании, где в TCNT0 заносится значение, и ШИМ пропадет.
Кстати, если после условия идет только одна инструкция, фигурные скобки можно не ставить. Поэтому в №355 остается ошибкой только вторая фигурная скобка, хотя так лучше не делать.
Вложения:
Тип файла: rar Work_T13.rar (14.4 Кб, 19 просмотров)

Последний раз редактировалось МВА; 04.03.2015 в 20:11.
МВА вне форума  
Непрочитано 04.03.2015, 23:31  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от makakus Посмотреть сообщение
Вы о №355?
Там такие отступы, что совершенно непонятно, что к чему. В результате - последнее else чьё? Две скобки в начале подряд...
else, которое внизу проги, относиться к if KeyPress, то есть по идее строка кода #asm("sleep") должна выполняться, когда кнопка не нажата
но я вот думаю, может там вообще не нужно было писать else, а просто написать #asm("sleep")
Это бы что-то изменило?
Миниатюры:
Нажмите на изображение для увеличения
Название: key-scan.jpg
Просмотров: 149
Размер:	25.2 Кб
ID:	76332  
prosto_andriy вне форума  
Непрочитано 05.03.2015, 10:38  
makakus
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.10.2007
Сообщений: 2,758
Сказал спасибо: 1,100
Сказали Спасибо 1,033 раз(а) в 568 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
по идее строка кода #asm("sleep") должна выполняться, когда кнопка не нажата
но я вот думаю, может там вообще не нужно было писать
Последние 5 слов - категорически присоединяюсь! в вашей программе вы должны отвечать за каждую букву (и даже пробел) - почему и для чего. Ковырять палкой и наблюдать результат можно, но ничего путного не получится.

А программа у вас такая:
Нажмите на изображение для увеличения
Название: keypress.png
Просмотров: 20
Размер:	64.7 Кб
ID:	76346

несчастливая строка подвела.
компилятор не ругается на else без if?
makakus вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Электронная библиотека 11242 29.12.2015 23:45
Как правильно отследить импульс sdsrem Микроконтроллеры, АЦП, память и т.д 8 17.08.2010 21:28
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33


Часовой пояс GMT +4, время: 08:45.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.