Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

 
Опции темы
Непрочитано 16.04.2011, 14:26  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Дальше if KeyPress //Если кнопка нажата

Я не понимаю почему нельзя это сделать сразу в прерывании??????

PHP код:
if  (PINB.0 == 0) {}                //Если кнопка нажата 
P.S. Кстати я понял почему у меня трудности перевода...
if (b_count›PWM_del) !!!!

Моя логика никогда бы так не написала...
А вот так: (b_count › 10) отсюда и путаница в буквах

Опять же почему bright_ch() ??? Почему не считать отдельной переменной прям по ходу выполнения??? Зачем функция??? Я вот в этом путаюсь
Реклама:

Последний раз редактировалось poligon_85; 16.04.2011 в 14:35.
poligon_85 вне форума  
Непрочитано 16.04.2011, 14:33  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Можно и в прерывании, но это привычка. В прерывании долго находиться нельзя. ЗАКОН. Пока задача всего одна - это проскочит, а если попытаться сделать ещё какую-нибудь задачу, то может случиться наложение прерываний и тогда будет отложено что-нибудь важное. В данном случае не важно, изменится яркость немедленно, или через пару десятков микросекунд.

P.S. добавлять начал в предыдущий пост...
omercury вне форума  
Непрочитано 16.04.2011, 14:39  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Цитата:
А вот так: (b_count › 10) отсюда и путаница в буквах
Это тоже работать будет. Прокатывает в малых проектах. Но здесь константа посреди кода. Если понадобится изменить задержки, в Вашем случае придётся лопатить весь код. В моём варианте меняется константа в дефайне и весь код перестроен.
То же самое с функциями. Её один раз отладил - и вызывай сколько влезет. Да и нагляднее так. Всего одна строка, а уже понятно, что это изменение КЗ.
Опять же написание программы упрощается. В том месте, откуда я её вызвал, я просто обозначил её наличие - действие. Как она будет работать, можно подумать и позже. Это называется блочное программирование. Так большая задача делится на некоторое количество малых. Упрощается работа. Опять же, функции можно вставлять из предыдущих наработок. Глупо писать каждую программу "с нуля". Через какое-то время и у Вас соберётся библиотека функций, которую Вы будете просто подключать к проекту.

Последний раз редактировалось omercury; 16.04.2011 в 14:46.
omercury вне форума  
Непрочитано 16.04.2011, 14:42  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
В прерывании долго находиться нельзя. ЗАКОН.
Да это понятно. Просто какая разница будет там инкрементироваться переменная или выполняться функция??? По времени одно и то же... Функция - это инкрементирование переменной в "оболочке", просто для быстрого вызова. Время одно и то же будет, ни там ни там прерывание мы не задержим.

Просто видно исходя из опыта вы так пишете, а я глядя на это туплю. Ладно, хватит лирики.

Как и для чего функция bright_ch() понял. Осенило меня сейчас.
Цитата:
...каждый одиннадцатый вход в неё...
clr_var() тем более понятно.

key_scan() вот пока в голове не укладывается и
PHP код:
#asm("sleep")               //Усыпляем МК 
А как его разбудить???

P.S. Кстати вылезла проблема максимальной яркости. Фонарик её просто проскакивает. Надо по идее чтобы при достижении max яркости фонарик один раз моргнул и это сигнал для меня что надо кнопку отпустить, а не то уменьшаться яркость начнет.

Последний раз редактировалось poligon_85; 16.04.2011 в 14:51.
poligon_85 вне форума  
Непрочитано 16.04.2011, 14:50  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от poligon_85 Посмотреть сообщение
Просто какая разница буд
Разница огромна. За время выполнения опроса кнопки и прочего можно выполнить ещё кучу всего. Кнопка, по понятиям МК, опрашивается очень редко. Что же он в это время совсем ничего делать не должен?

Сообщение от poligon_85 Посмотреть сообщение
А как его разбудить???
Проснётся он от прерывания. Придёт Таймер и разбудит.

С включением/выключением всё понятно?
PHP код:
//Включение/выключение фонаря
void    led_on_off(void)
{
    if  (
PWM_on)                //Если флаг установлен (включен)
    
{    
        
tmpPWM OCR2;       //Сохраняем компаратор
        
OCR2=0xFF;              //Гасим свет
        
PWM_on 0;             //Сбросили флаг
    
}
    else                        
//А если выключен - включить
    
{     
        
OCR2=tmpPWM;//PWM_start;         //Включаем
        
PWM_on 1;             //Установили флаг   
    
}                                               


Последний раз редактировалось omercury; 16.04.2011 в 14:54.
omercury вне форума  
Непрочитано 16.04.2011, 15:04  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Ну и писать программку я начал с этой функции:
PHP код:
//Сканирование кнопки
void    key_scan(void)
{
    if  
KeyPress                //Если кнопка нажата
    
{                            //Проверим, давно ли её нажали
        
if (KeyNew)             //Если флаг установлен (значит "давно")
        
{                                          
            
count++;          //Увеличиваем счётчик задержки
            
if  (countlongkey//Если длинное нажатие
            
{                                 
                
bright_ch();    //Начинаем менять компаратор ШИМ
                
count--;        //Декремент счетчика(увеличивать-то его больше никчему)
                
PWM_on 1;
            }                   
//Выход
        

        else                    
//Нажали только что, на это и укажем
        
{   
            
KeyNew 1;         //Устанавливаем флаг
        
}                       //Выход
    
}   
    else                        
//Если кнопка не нажата Это может означать,  
    
{       //что её и не нажимали или только что отпустили, вот это и проверим даьше
        
if (KeyNew)             //Если флаг установлен (только что отпустили)
        
{                       //Проверим, до скольки успели досчитать
            
if (countlongkey)  //Если меньше длинного(короткое нажатие)
            
{//Можно было и объединить, но не люблю я двойные условия, МК их всё равно по очереди сделает      
                
if (countshortkey//Если больше минимального (короткое, но не дребезг)
                
{                     
                    
led_on_off();   //Включаем/выключаем фонарь
                
}               //Иначе - Это был дребезг
            
}
        }                       
        
clr_var();              //Сброс переменных
    
}                           //Выход  
    
KeyEXE 0;                 //Запрет опроса кнопок   
    #asm("sleep")               //Усыпляем МК

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

Сообщение от poligon_85 Посмотреть сообщение
Кстати вылезла проблема максимальной яркости.
Сейчас сделаем. Надо немного дописать функцию изменения яркости...

Последний раз редактировалось omercury; 16.04.2011 в 15:52.
omercury вне форума  
Непрочитано 16.04.2011, 15:22  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Теперь она выглядит вот так:
PHP код:
#include ‹delay.h›          //Подключили библиотеку задержек
...........................
//Изменение яркости свечения(коэф. заполнения ШИМ)
void    bright_ch(void)
{
    
b_count++;                //Инкремент счётчика задержки
    
if  (b_count›=PWM_del)    //Если досчитали
    
{                    
        
OCR2--;              //Меняем скважность           
            
if (OCR2==0)
            {
                
OCR2=0xFF;   
                
delay_ms(500);      //На полсекунды гасим свет
                
OCR2=0;             //Снова включаем его на полную яркость
                
delay_ms(2000);      //Ждём 2 секунды, чтобы отпустили кнопку
            
}
        
b_count 0x00;        //Сброс счетчика
    
}

Наверху, где подключали описание МК надо подключить библиотеку задержек.
За время её выполнения таймер сработает 80 раз, но это ничего не изменит пока мы не отработаем эту функцию, потому, что всё это не в прерывании.
На всякий случай весь файл m8_PWM+Key_c.zip

Последний раз редактировалось omercury; 16.04.2011 в 19:00.
omercury вне форума  
Непрочитано 16.04.2011, 17:30  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Тут срочно пришлось уехать. Только вернулся. omercury, спасибо, сейчас сяду разбираться.
poligon_85 вне форума  
Непрочитано 16.04.2011, 17:40  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Может при крайних значениях яркости просто останавливать изменение? Без моргания.
omercury вне форума  
Непрочитано 16.04.2011, 17:48  
oleg_harp
Прописка
 
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
oleg_harp на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Может при крайних значениях яркости просто останавливать изменение? Без моргания.
Да, мне кажется, по-хорошему в фонарике плавная регулировка, вообще не нужна, 2-3 значения фиксированных при переключении кнопкой, как в китайских. Я думаю, ТС для учёбы и спортивного интереса это делает.
oleg_harp вне форума  
 

Закладки
Опции темы

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

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, время: 20:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot