Например TDA7294

Форум РадиоКот :: Просмотр темы - Динамическая индикация и пара кнопок: нужна помощь
Форум РадиоКот
https://radiokot.ru/forum/

Динамическая индикация и пара кнопок: нужна помощь
https://radiokot.ru/forum/viewtopic.php?f=57&t=80979
Страница 1 из 1

Автор:  Zhursat [ Вт ноя 20, 2012 23:18:55 ]
Заголовок сообщения:  Динамическая индикация и пара кнопок: нужна помощь

Приветствую, уважаемые коты!
Нужна помощь консультативного характера. Делаю типа термостата, который будет следить за температурой воды в системе отопления, и в зависимости от нее включать-выключать нагрузки. Попутно температура будет выводиться на двухразрядный семисегментник. Также в схеме присутстсвуют 2 кнопки: "+" и "-" для установления верхнего порога срабатывания.
И вот теперь вопрос: динамическую индикацию температуры на индикаторе я с горем пополам одолел (говорю сразу - с МК на "ВЫ", только-только начинаю). А вот с опросом кнопок получается затык.... Протеус мои кнопки полностью игнорит. Знаю, многие скажут, что все симуляторы - это от лукавого... Но если вдруг найдется желающий взглянуть и ткнуть носом в ошибку - буду признателен. Моих мозгов пока не хватает понять где косяк.
Проект протеуса с исходниками во вложении.

Вложения:
_KOTEL_new.rar [96.4 KiB]
Скачиваний: 319

Автор:  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;
}


Вложения:
Mega8.hex [1.15 KiB]
Скачиваний: 570

Автор:  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/