Форум РадиоКот https://radiokot.ru/forum/ |
|
Динамическая индикация и пара кнопок: нужна помощь https://radiokot.ru/forum/viewtopic.php?f=57&t=80979 |
Страница 1 из 1 |
Автор: | Zhursat [ Вт ноя 20, 2012 23:18:55 ] | ||
Заголовок сообщения: | Динамическая индикация и пара кнопок: нужна помощь | ||
Приветствую, уважаемые коты! Нужна помощь консультативного характера. Делаю типа термостата, который будет следить за температурой воды в системе отопления, и в зависимости от нее включать-выключать нагрузки. Попутно температура будет выводиться на двухразрядный семисегментник. Также в схеме присутстсвуют 2 кнопки: "+" и "-" для установления верхнего порога срабатывания. И вот теперь вопрос: динамическую индикацию температуры на индикаторе я с горем пополам одолел (говорю сразу - с МК на "ВЫ", только-только начинаю). А вот с опросом кнопок получается затык.... Протеус мои кнопки полностью игнорит. Знаю, многие скажут, что все симуляторы - это от лукавого... Но если вдруг найдется желающий взглянуть и ткнуть носом в ошибку - буду признателен. Моих мозгов пока не хватает понять где косяк. Проект протеуса с исходниками во вложении.
|
Автор: | woosterstring [ Ср ноя 21, 2012 04:24:02 ] | ||
Заголовок сообщения: | Re: Динамическая индикация и пара кнопок: нужна помощь | ||
Конечно, программа написана неправильно, но даже в таком состоянии работоспособна. В первую очередь увеличте частоту обновления индикатора, сейчас меньше 4Гц при 1Мгц тактовой. Получается 10^6/TCCR0(1024)/256 = 3,8Гц. В главном цикле, там где опрос кнопок, бессмысленный код, а именно: антидребез не закончен, т.е. это не антидребезг, нет повторной проверки после задержки в 200мс (обычно единичное нажатие 30-50мс и повторная проверка). Ну и в конце главного цикла стоит считывание температуры с датчика, что буквально "затирает" только что инкрементированное или декрементирвоанное значение в переменной indication. Отлаживайте программу поочерёдно, например закомментируйте всё, что касается температуры, отработайте только инкремент. А сам по себе код опроса кнопок рабочий. Я извинюсь, что переписал в терминах GCC, просто с CodeVisione не работаю. СпойлерКод: #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> int set_temp=50; char digits[] = { 0b11000000, //0 0b11111001, //1 0b10100100, //2 0b10110000, //3 0b10011001, //4 0b10010010, //5 0b10000010, //6 0b11111000, //7 0b10000000, //8 0b10010000, //9 0b10001001, //Буква Н 0b11111111 //пустота }; char digit_out[2]; char cur_dig; //Переменные для работы с LED unsigned int indication; //Переменная для хранения чисел void recoding(void) { if (indication < 100) { digit_out[0]=indication/10; digit_out[1]=indication%10; } } int main(void) { PORTB = 0x03; DDRB = 0x0C; PORTC = 0x00; DDRC = 0x06; PORTD = 0x00; DDRD = 0x7F; TCCR0 = 0x02; TIMSK = 0x01; ACSR = 0x80; sei(); while (1) { if (!(PINB & _BV(0))) { set_temp++; _delay_ms(200); indication = set_temp; recoding(); //_delay_ms(1000); }; if (!(PINB & _BV(1))) { set_temp--; _delay_ms(200); indication = set_temp; recoding(); //_delay_ms(1000); }; recoding(); } } ISR(TIMER0_OVF_vect) { PORTD = 0xFF; switch(cur_dig) { case(0): { PORTC |= _BV(1); PORTC &= ~_BV(2); break; }; case(1): { PORTC |= _BV(2); PORTC &= ~_BV(1); break; }; default: break; } PORTD = digits[digit_out[cur_dig]]; cur_dig++; if(cur_dig == 2) cur_dig = 0; }
|
Автор: | U235 [ Ср ноя 21, 2012 07:49:06 ] |
Заголовок сообщения: | Re: Динамическая индикация и пара кнопок: нужна помощь |
Про кнопки есть замечательная тема Помогите опросить кнопку. От себя добавлю - делайте проверку границ переменной set_temp. Код: // Сейчас так set_temp++; //Так лучше if (set_temp < 100) set_temp++; Для кнопки "-" аналогично. |
Автор: | Аlex [ Ср ноя 21, 2012 08:52:38 ] |
Заголовок сообщения: | Re: Динамическая индикация и пара кнопок: нужна помощь |
viewtopic.php?f=20&t=79801 |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |