Страница 1 из 1
Динамическая индикация и пара кнопок: нужна помощь
Добавлено: Вт ноя 20, 2012 23:18:55
Zhursat
Приветствую, уважаемые коты!
Нужна помощь консультативного характера. Делаю типа термостата, который будет следить за температурой воды в системе отопления, и в зависимости от нее включать-выключать нагрузки. Попутно температура будет выводиться на двухразрядный семисегментник. Также в схеме присутстсвуют 2 кнопки: "+" и "-" для установления верхнего порога срабатывания.
И вот теперь вопрос: динамическую индикацию температуры на индикаторе я с горем пополам одолел (говорю сразу - с МК на "ВЫ", только-только начинаю). А вот с опросом кнопок получается затык.... Протеус мои кнопки полностью игнорит. Знаю, многие скажут, что все симуляторы - это от лукавого... Но если вдруг найдется желающий взглянуть и ткнуть носом в ошибку - буду признателен. Моих мозгов пока не хватает понять где косяк.
Проект протеуса с исходниками во вложении.
Re: Динамическая индикация и пара кнопок: нужна помощь
Добавлено: Ср ноя 21, 2012 04:24:02
woosterstring
Конечно, программа написана неправильно, но даже в таком состоянии работоспособна.
В первую очередь увеличте частоту обновления индикатора, сейчас меньше 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;
}
Re: Динамическая индикация и пара кнопок: нужна помощь
Добавлено: Ср ноя 21, 2012 07:49:06
U235
Про кнопки есть замечательная тема
Помогите опросить кнопку.
От себя добавлю - делайте проверку границ переменной set_temp.
Код: Выделить всё
// Сейчас так
set_temp++;
//Так лучше
if (set_temp < 100) set_temp++;
Для кнопки "-" аналогично.
Re: Динамическая индикация и пара кнопок: нужна помощь
Добавлено: Ср ноя 21, 2012 08:52:38
Аlex