Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
15.04.2011, 23:01
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от urry
|
Нарисуйте кружочки, как оно из одного в другое переходит и от чего.
|
Ииии??????
|
|
|
|
15.04.2011, 23:10
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Про режим сна не забыли? Выключенный фанарик должен потреблять очень мало энергии.
|
|
|
|
15.04.2011, 23:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
EEPROM убрал. Вставил Ваши значения. Вот код(убрал всё лишнее):
PHP код:
|
#include ‹mega8.h›
#define shortkey 0x3C //80 . Константа - минимум для короткого нажатия #define longkey 0xFE //240. Константа - минимум для длинного нажатия #define PWM_del 0x0A //15. Константа задержки изменения яркости #define PWM_start 0xFA //125. Константа. Стартовое значение яркости
unsigned char tmpPWM = PWM_start; unsigned char count = 0; //Счетчик времени удержания кнопки unsigned char b_count = 0; //Счетчик задержки изменения яркости bit KeyEXE; //Флаг опроса кнопок bit KeyNew; //Флаг нового нажатия bit PWM_on; //Флаг признака включения фонаря
#define KeyPress (!PINB.0) //Вход кнопки #define led_on (PORTB.3)
//Изменение яркости свечения(коэф. заполнения ШИМ) void bright_ch(void) { b_count++; if (b_count›PWM_del) { OCR2--; b_count = 0x00; } } //Сброс переменных void clr_var(void) { count = 0; //Сбросили счётчик задержки срабатывания кнопки b_count = 0; //Сбросили счётчик задержки шага изменения PWM KeyNew = 0; //Устанавливаем флаг } //Включение/выключение фонаря void led_on_off(void) { if (PWM_on) //Если флаг установлен (включен) { tmpPWM = OCR2; OCR2=0xFF; //Гасим свет PWM_on = 0; //Сбросили флаг } else //А если выключен - включить { OCR2=tmpPWM;//PWM_start; //Включаем PWM_on = 1; //Установили флаг } }
//Сканирование кнопки void key_scan(void) { if KeyPress //Если кнопка нажата { if (KeyNew) //Если флаг установлен { count++; if (count›longkey) //Если длинное нажатие { bright_ch(); //Начинаем менять компаратор ШИМ count--; //Декремент счетчика(увеличивать-то его больше никчему) PWM_on = 1; } //Выход } else { KeyNew = 1; //Устанавливаем флаг } //Выход } else //Если кнопка не нажата { if (KeyNew) //Если флаг установлен { if (count‹longkey) //Если меньше длинного { if (count›shortkey) //Если больше минимального { led_on_off(); //Включаем/выключаем фонарь } //Иначе - Это был дребезг } } clr_var(); //Сброс переменных } //Выход KeyEXE = 0; //Запрет опроса кнопок }
interrupt [TIM2_OVF] void Time2_ovf_isr(void) { KeyEXE = 1; //Разрешение опроса кнопок }
void main(void) { // Input/Output Ports initialization PORTB=0x09; DDRB=0x08; // Port C initialization PORTC=0x00; DDRC=0x00; // Port D initialization PORTD=0x00; DDRD=0x00; TCCR0=0x00;//0x04; //off TCNT0=0x00; // Clock value: 31.25kHz ASSR=0x00; TCCR2=0x6C;//6F; TCNT2=0x00; OCR2=0xFF;
// Time(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40;
// Global enable interrupts #asm("sei")
while (1) { if (KeyEXE) { key_scan(); } } }
|
Вот hex
m8_PWM+Key.hex.txt
Видео снимать?
Последний раз редактировалось omercury; 16.04.2011 в 00:25.
|
|
|
|
15.04.2011, 23:24
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Залил приаттаченный хекс. При кратковременном нажатии светодиод чуть тускнеет (полностью не гаснет), повторное нажатие - включается на полную. И так по кругу. При удержании меняется яркость.
Всё, я пошел спать, а то с ума сойду
|
|
|
|
15.04.2011, 23:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Фьюзы какие?
Этот запоминает состояние перед выключением. m8_PWM+Key.hex.txt
Последний раз редактировалось omercury; 15.04.2011 в 23:44.
|
|
|
|
15.04.2011, 23:50
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Вот фьюзы:
|
|
|
|
15.04.2011, 23:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
У Вас тактовая 1 MHz...
даже так.
CKOPT = 1 сделайте. У Вас стоит внешний кварц меньше 1 MHz...
Последний раз редактировалось omercury; 16.04.2011 в 00:12.
|
|
|
|
16.04.2011, 00:24
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
У меня тактирование от внешнего кварца. 8 МГц
|
|
|
|
16.04.2011, 00:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Вижу.
|
|
|
|
16.04.2011, 00:38
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сделал CKOPT = 1, всё то же самое
Это не имеет отношения к частоте.
Цитата:
|
When CKOPT is programmed, the Oscillator output will oscillate a full rail-to-rail swing on the output. This mode is suitable when operating in a very noisy environment...
....
For resonators, the maximum frequency is 8 MHz with CKOPT unprogrammed and 16 MHz with CKOPT programmed.
|
Т.е. CKOPT = 0 при работе с сильными помехами вокруг и при работе на макс. частоте. Так что всё правильно у меня выставлено было.
Последний раз редактировалось poligon_85; 16.04.2011 в 00:58.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:28.
|
|