Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
09.08.2011, 14:30
|
|
Частый гость
Регистрация: 07.08.2009
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Как реализовать меню в термодатчике
Доброго времени суток! Я начинающий в програмировании.У меня к Вам вопросик. Хочу сделать термодатчик на Atmega8, семисегментник и 3 кнопки "+", "-", "set". в проге "+" и "-" работают хочу реализовать в ход в меню кнопкой set установка верхнего и нижнего порога. Подскажите как реализоать такое меню.
Заранее спасибо!
Пишу на C
|
|
|
Сказали "Спасибо" Nixon83
|
|
|
09.08.2011, 14:54
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
Так для начала предоставили бы кусок кода из своей программы который реагирует на нажатие кнопок "+","-" (как производится опрос кнопок),тогда можно решить как его модифицировать. На данный момент можно только рекомендовать при нажатии "set" переходить к программе установок параметров (хотя это и так очевидно) при повторном нажатии-выход в основную программу.
Последний раз редактировалось heady69; 09.08.2011 в 14:59.
|
|
|
Сказали "Спасибо" heady69
|
|
|
09.08.2011, 15:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
|
|
|
|
09.08.2011, 15:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
за год небось не разобрался
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
09.08.2011, 15:24
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
Сообщение от picavr
|
за год небось не разобрался
|
Да вроде пара месяцев всего-то! Успеет еще...
Последний раз редактировалось heady69; 09.08.2011 в 15:28.
|
|
|
Сказали "Спасибо" heady69
|
|
|
09.08.2011, 15:28
|
|
Частый гость
Регистрация: 07.08.2009
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
Вот кусок кода!
void temp_test() {
if (JUMPER==0) {
if (alarm_temp›temp) ALARM=1; else ALARM=0;
}else{
if (alarm_temp‹temp) ALARM=1; else ALARM=0;
}
}
void temp_inc() {
if (alarm_temp‹1250) alarm_temp++;
}
void temp_dec() {
if (alarm_temp›-550) alarm_temp--;
}
void main() {
PORTB=0;
DDRB=0x0f;
PORTD=0;
DDRD=0xff;
PORTC=0;
DDRC=0x10;
TCCR0=0;
TCNT0=0xfd;
TIMSK=1;
#asm("sei");
led_buff[0]=dig_table[11];
led_buff[1]=dig_table[11];
led_buff[2]=dig_table[11];
led_buff[3]=dig_table[11];
delay_ms(200);
TCCR0=2;
ds_init();
while (ds_ok==0);
epp_read();
while (1) {
if (menu_tmr==0) ds_calc();
if (menu_tmr==15) {
ds_read();
temp_test();
}
if (BTN_PLUS==0&&btn0==0&&btn1==0) {
btn0=1;
temp_inc();
btn_timeout=30;
}
if (BTN_PLUS==0&&btn0!=0&&btn_timeout‹20) {
btn_timeout=20;
temp_inc();
}
if (BTN_PLUS!=0&&btn0!=0) {
btn0=0;
btn_timeout=20;
}
if (BTN_MINUS==0&&btn0==0&&btn1==0) {
btn1=1;
temp_dec();
btn_timeout=30;
}
if (BTN_MINUS==0&&btn1!=0&&btn_timeout‹20) {
btn_timeout=20;
temp_dec();
}
if (BTN_MINUS!=0&&btn1!=0) {
btn1=0;
btn_timeout=20;
}
if (btn_timeout›0) {
led_temp(alarm_temp);
btn_timeout--;
if (btn_timeout==0) epp_write();
}else{
led_temp(temp);
}
delay_ms(50);
menu_tmr++;
if (menu_tmr›19) menu_tmr=0;
}
}
|
|
|
Сказали "Спасибо" Nixon83
|
|
|
09.08.2011, 16:04
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
Неплохо было-бы комментариями разбавить... BTN_PLUS (нога AVR ?), btn0 (предыдущее состояние?).
Если у вас динамическая индикация на индикаторах,неплохо бы в программу опроса кнопок свалить туда-же,и в основной программе проверять колько код кнопки передаваемый из программы опроса ,ИМХО проще было-бы,чем париться с таймаутами в основной.
Почему не вставить тогда что-то подобное:
Код:
|
if (BTN_SET==0&&btn2!=0&&btn_timeout‹20) {
btn_timeout=20;
set_params(); //переход на установку параметров
}
if (BTN_SET!=0&&btn2!=0) {
btn2=0;
btn_timeout=20;
} |
Последний раз редактировалось heady69; 09.08.2011 в 16:12.
|
|
|
Сказали "Спасибо" heady69
|
|
|
09.08.2011, 16:17
|
|
Частый гость
Регистрация: 07.08.2009
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
menu_tmr это счетчик по кругу 0-19, 20 тиков примерно 1 секунда
#include ‹mega8.h›
#asm
.equ __w1_port=0x15
.equ __w1_bit=0
#endasm
#include ‹1wire.h›
#include ‹delay.h›
//#define LED_CATODE
#define LED_DOT_MASK 0x7f
#define ALARM PORTC.4
#define BTN_PLUS PINC.3
#define BTN_MINUS PINC.2
#define JUMPER PINC.1
#define DS18S20_FAMILY 0x10
#define DS18B20_FAMILY 0x28
#define DS1822_FAMILY 0x22
#define DS_READ_ROM 0x33
#define DS_SKIP_ROM 0xcc
#define DS_CONVERT_T 0x44
#define DS_WRITE_SCRATCHPAD 0x4e
#define DS_READ_SCRATCHPAD 0xbe
#define DS_12BITS 0x7f
flash byte dig_table[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0,0xff,0xbf};
byte menu_tmr=0;
byte led_dig=0;
byte led_buff[4];
trom ds_rom;
tscratchpad ds_sp;
int temp;
bit ds_ok=0;
bit btn0=0; //флаг кнопки
bit btn1=0;
byte btn_timeout=40;
int alarm_temp;
eeprom int epp_alarm_temp=0;
interrupt [TIM0_OVF] void tmr0_ovf() {
#ifdef LED_CATODE
PORTB=0x0f;
PORTD=~led_buff[led_dig];
PORTB=(~(1‹‹led_dig))&0x0f;
#else
PORTB=0;
PORTD=led_buff[led_dig];
PORTB=1‹‹led_dig;
#endif
led_dig++;
if (led_dig›3) led_dig=0;
}
|
|
|
Сказали "Спасибо" Nixon83
|
|
|
09.08.2011, 16:32
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
Сообщение от Nixon83
|
menu_tmr это счетчик по кругу 0-19, 20 тиков примерно 1 секунда
|
Т.е. другими словами,задается задержка DS1820 для окончания им измерения температуры.
ТОгда надо прописать подключение кнопки set,в основную код который выше и программу установки парам. Тоолько в ней опять придется городить опрос кнопок по вашей теме... Удобней наверное все-таки перенести опрос кнопок в прерывание.
P.S. Заодно и задержку опроса термометра. Пусть выставляет флаг разрешения опроса.
Последний раз редактировалось heady69; 09.08.2011 в 16:49.
|
|
|
Сказали "Спасибо" heady69
|
|
|
09.08.2011, 16:36
|
|
Частый гость
Регистрация: 07.08.2009
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: как реализовать меню в Термодатчике
как-то так! И хоть кол чеши не могу организовать меню!
|
|
|
Сказали "Спасибо" Nixon83
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:29.
|
|