Динамическая индикация и пара кнопок: нужна помощь

Обсуждаем контроллеры компании Atmel.
Закрыто
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вт янв 31, 2012 21:09:21
Откуда: Украина

Сообщение Zhursat »

Приветствую, уважаемые коты!
Нужна помощь консультативного характера. Делаю типа термостата, который будет следить за температурой воды в системе отопления, и в зависимости от нее включать-выключать нагрузки. Попутно температура будет выводиться на двухразрядный семисегментник. Также в схеме присутстсвуют 2 кнопки: "+" и "-" для установления верхнего порога срабатывания.
И вот теперь вопрос: динамическую индикацию температуры на индикаторе я с горем пополам одолел (говорю сразу - с МК на "ВЫ", только-только начинаю). А вот с опросом кнопок получается затык.... Протеус мои кнопки полностью игнорит. Знаю, многие скажут, что все симуляторы - это от лукавого... Но если вдруг найдется желающий взглянуть и ткнуть носом в ошибку - буду признателен. Моих мозгов пока не хватает понять где косяк.
Проект протеуса с исходниками во вложении.
Вложения
_KOTEL_new.rar
(96.4 КБ) 334 скачивания
Реклама
Нашел транзистор. Понюхал.
Сообщения: 192
Зарегистрирован: Чт сен 16, 2010 19:47:01
Откуда: Украина

Сообщение 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;
}
Вложения
Mega8.hex
(1.15 КБ) 581 скачивание
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Сообщение U235 »

Про кнопки есть замечательная тема Помогите опросить кнопку.
От себя добавлю - делайте проверку границ переменной set_temp.

Код: Выделить всё

// Сейчас так
set_temp++; 

//Так лучше
if (set_temp < 100) set_temp++; 
Для кнопки "-" аналогично.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Реклама
Эиком - электронные компоненты и радиодетали
Закрыто

Вернуться в «AVR»