Страница 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