Jump to content
Garo

Управление на Atmega8

Recommended Posts

Добрый день! Делаю прибор для контроля датчиков воды.Написал код

 while(1)
    {	
		
		if (PINB&(1<<PINB0))
		PORTD=0x01;
		else if (PINB&(1<<PINB1))
		PORTD=0x02;
		else if (PINB&(1<<PINB2))
		PORTD=0x04;
		else if (PINB&(1<<PINB3))
		PORTD=0x08;
		else  if (PINB&(1<<PINB4))
		PORTD=0x10;
		else  if (PINB&(1<<PINB5))
		PORTD=0x20;
		else  if (PINB&(1<<PINB6))
		PORTD=0x40;
		else if (PINB&(1<<PINB7))
		PORTD=0x80;	      
    }

Все работает, но есть вопрос. При подачи лог.1 одновременно на два порта, загорается только один светодиод (тот который выше по коду). Можно ли как то сделать программно, чтобы лог.1 подавались на заданные порты.

1.jpg

Пробывал писать условия, но там столько вариантов...

void matrix ()
{
	if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5))&&
	(PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xFF;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5))&&
	(PINB&(1<<PINB6)))
	PORTD=0x7F;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5)))
	PORTD=0x3F;
	
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)))
	PORTD=0x1F;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)))
	PORTD=0x0F;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)))
	PORTD=0x07;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)))
	PORTD=0x03;
	
	
	else if ((PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5))&&
	(PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xFE;
	
	
	else if ((PINB&(1<<PINB2)) && (PINB&(1<<PINB3)) && (PINB&(1<<PINB4))
	&& (PINB&(1<<PINB5)) &&
	(PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xFC;
	
	else if ((PINB&(1<<PINB3)) && (PINB&(1<<PINB4))
	&& (PINB&(1<<PINB5)) &&
	(PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xF8;
	
	
	else if ((PINB&(1<<PINB4))
	&& (PINB&(1<<PINB5)) &&
	(PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xF0;
	
	else if ((PINB&(1<<PINB5)) && (PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xE0;
	
	else if ((PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xC0;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5)) &&
    (PINB&(1<<PINB7)))
	PORTD=0xBF;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5)) &&
	(PINB&(1<<PINB6)))
	PORTD=0x7F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB6)) &&
	(PINB&(1<<PINB7)))
	PORTD=0xDF;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB7)))
	PORTD=0x9F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB6)))
	PORTD=0x5F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5)))
	PORTD=0x3F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB5)) && (PINB&(1<<PINB7)))
	PORTD=0xAF;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB5)) && (PINB&(1<<PINB6)))
	PORTD=0x6F;
		else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
		(PINB&(1<<PINB3)) && (PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
		PORTD=0xCF;
		
		
		
		
	
	
	
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB7)))
	PORTD=0x8F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB6)))
	PORTD=0x4F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB5)))
	PORTD=0x2F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)) && (PINB&(1<<PINB4)))
	PORTD=0x1F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB4)) && (PINB&(1<<PINB7)))
	PORTD=0x97;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB4)) && (PINB&(1<<PINB6)))
	PORTD=0x5F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB4)) && (PINB&(1<<PINB5)))
	PORTD=0x37;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB5)) && (PINB&(1<<PINB7)))
	PORTD=0xA7;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB5)) && (PINB&(1<<PINB6)))
	PORTD=0x6F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xCF;
	
	
	
	
	
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) && 
	(PINB&(1<<PINB7)))
	PORTD=0x87;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB6)))
	PORTD=0x47;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB5)))
	PORTD=0x27;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB4)))
	PORTD=0x17;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)) &&
	(PINB&(1<<PINB3)))
	PORTD=0x0F;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB3)) &&
	(PINB&(1<<PINB7)))
	PORTD=0x8B;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB3)) &&
	(PINB&(1<<PINB6)))
	PORTD=0x4B;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB3)) &&
	(PINB&(1<<PINB5)))
	PORTD=0x2B;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB3)) &&
	(PINB&(1<<PINB4)))
	PORTD=0x1B;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB4)) &&
	(PINB&(1<<PINB7)))
	PORTD=0x93;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB4)) &&
	(PINB&(1<<PINB6)))
	PORTD=0x53;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB4)) &&
	(PINB&(1<<PINB5)))
	PORTD=0x33;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB5)) &&
	(PINB&(1<<PINB7)))
	PORTD=0xA3;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB5)) &&
	(PINB&(1<<PINB6)))
	PORTD=0x63;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB6)) &&
	(PINB&(1<<PINB7)))
	PORTD=0xC3;
	
	
	
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB7)))
	PORTD=0x83;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB6)))
	PORTD=0x43;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB5)))
	PORTD=0x23;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB4)))
	PORTD=0x13;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB3)))
	PORTD=0x0B;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)) && (PINB&(1<<PINB2)))
	PORTD=0x07;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB2)) && (PINB&(1<<PINB7)))
	PORTD=0x85;
		else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB2)) && (PINB&(1<<PINB6)))
		PORTD=0x45;
		else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB2)) && (PINB&(1<<PINB5)))
		PORTD=0x25;
		else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB2)) && (PINB&(1<<PINB4)))
		PORTD=0x15;
		else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB2)) && (PINB&(1<<PINB3)))
		PORTD=0x0D;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB3)) && (PINB&(1<<PINB7)))
	PORTD=0x89;	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB3)) && (PINB&(1<<PINB6)))
	PORTD=0x49;	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB3)) && (PINB&(1<<PINB5)))
	PORTD=0x29;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB3)) && (PINB&(1<<PINB4)))
	PORTD=0x19;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB7)))
	PORTD=0x91;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB6)))
	PORTD=0x51;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB4)) && (PINB&(1<<PINB5)))
	PORTD=0x31;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB5)) && (PINB&(1<<PINB7)))
	PORTD=0xA1;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB5)) && (PINB&(1<<PINB6)))
	PORTD=0x61;
	
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xC1;	
		
		
		
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB7)))
	PORTD=0x81;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB6)))
	PORTD=0x41;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB5)))
	PORTD=0x21;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB4)))
	PORTD=0x11;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB3)))
	PORTD=0x09;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB2)))
	PORTD=0x05;
	else if ((PINB&(1<<PINB0)) && (PINB&(1<<PINB1)))
	PORTD=0x03;
	
	else if ((PINB&(1<<PINB1)) && (PINB&(1<<PINB7)))
	PORTD=0x82;
	else if ((PINB&(1<<PINB1)) && (PINB&(1<<PINB6)))
	PORTD=0x42;
	else if ((PINB&(1<<PINB1)) && (PINB&(1<<PINB5)))
	PORTD=0x22;
	else if ((PINB&(1<<PINB1)) && (PINB&(1<<PINB4)))
	PORTD=0x12;
	else if ((PINB&(1<<PINB1)) && (PINB&(1<<PINB3)))
	PORTD=0x0A;
	else if ((PINB&(1<<PINB1)) && (PINB&(1<<PINB2)))
	PORTD=0x06;
	
	else if ((PINB&(1<<PINB2)) && (PINB&(1<<PINB7)))
	PORTD=0x84;
	else if ((PINB&(1<<PINB2)) && (PINB&(1<<PINB6)))
	PORTD=0x44;
	else if ((PINB&(1<<PINB2)) && (PINB&(1<<PINB5)))
	PORTD=0x24;
	else if ((PINB&(1<<PINB2)) && (PINB&(1<<PINB4)))
	PORTD=0x14;
	else if ((PINB&(1<<PINB2)) && (PINB&(1<<PINB3)))
	PORTD=0x0C;
	
	else if ((PINB&(1<<PINB3)) && (PINB&(1<<PINB7)))
	PORTD=0x88;
	else if ((PINB&(1<<PINB3)) && (PINB&(1<<PINB6)))
	PORTD=0x48;
	else if ((PINB&(1<<PINB3)) && (PINB&(1<<PINB5)))
	PORTD=0x28;
	else if ((PINB&(1<<PINB3)) && (PINB&(1<<PINB4)))
	PORTD=0x18;
	
	else if ((PINB&(1<<PINB4)) && (PINB&(1<<PINB7)))
	PORTD=0x90;
	else if ((PINB&(1<<PINB4)) && (PINB&(1<<PINB6)))
	PORTD=0x50;
	else if ((PINB&(1<<PINB4)) && (PINB&(1<<PINB5)))
	PORTD=0x30;
	
	else if ((PINB&(1<<PINB5)) && (PINB&(1<<PINB7)))
	PORTD=0xA0;
	else if ((PINB&(1<<PINB5)) && (PINB&(1<<PINB6)))
	PORTD=0x60;
	
	else if ((PINB&(1<<PINB6)) && (PINB&(1<<PINB7)))
	PORTD=0xC0;
	else if (PINB&(1<<PINB0))
	PORTD=0x01;
	else if (PINB&(1<<PINB1))
	PORTD=0x02;
	else if (PINB&(1<<PINB2))
	PORTD=0x04;
	else if (PINB&(1<<PINB3))
	PORTD=0x08;
	else  if (PINB&(1<<PINB4))
	PORTD=0x10;
	else  if (PINB&(1<<PINB5))
	PORTD=0x20;
	else  if (PINB&(1<<PINB6))
	PORTD=0x40;
	else if (PINB&(1<<PINB7))
	PORTD=0x80;
	else PORTD=0x00;
}

И то не все.

Edited by Garo

Share this post


Link to post
Share on other sites

А зачем в выходной порт писать константу?

обычно смотрят на изменение входного сигнала, и по изменению инвертируют нужный бит выходного.

Share this post


Link to post
Share on other sites

Опрос по внешнему прерыванию я напишу. А если сработают одновременно несколько датчиков и надо посмотреть именно какие?

Share this post


Link to post
Share on other sites

Особенности схемотехники и трассировки печатных плат для STM32WB55

Разработка новых устройств на базе беспроводного микроконтроллера STM32WB от STMicroelectronics может быть сделана в короткий срок, если выполнять некоторые важные правила и воспользоваться готовыми конструктивными решениями и рекомендациями инженеров ST.

Читать статью

переделайте без "else if" просто каждое условие свой if, тогда при сработке одного код будет выполняться дальше и проверит остальные датчики. У вас сейчас если срабатывает один из else if выполнение прерывается 

Share this post


Link to post
Share on other sites
                     

CoolGaN - на предельной скорости коммутации!

Решения на галлий-нитриде (GaN) обладают фундаментальными преимуществами перед кремнием. В частности, имея более высокую критическую напряжённость электрического поля, в сравнении с традиционными кремниевыми транзисторами, транзисторы на основе галлий-нитрида обладают выдающимися динамическими характеристиками, что позволяет коммутировать их на высоких частотах. Семейство CoolGaN™ – это именно то, что необходимо, чтобы поднять ваши устройства на принципиально новый уровень. Мы собрали все самые интересные материалы по данной теме на одной странице.

Читать статьи

А глючит как? постоянно переключаются выводы? или не фиксируются?

Share this post


Link to post
Share on other sites

Постоянно переключаются.  И зависает программа, т.е после отключения лог.1 со всех портов (или с одного) все равно идут переключения и никакой реакции на кнопку reset. (это все в протеусе)

Share this post


Link to post
Share on other sites

ИМХО конечно. но стоит почитать вообще про правильную обработку кнопок и логические байтовые операции.

Попробуйте по следующему алгоритму:

Взяли байт из входного порта.

сравнили с сохраненным состоянием.

Если есть разница записываем текущее состояние в переменную для сравнения и ее-же записываем в выходной порт.

Если разницы нет, делаем паузу и по новой.

Share this post


Link to post
Share on other sites

каждый вывод порта проверяем по отдельности:

if (PINB&(1<<PINB0))

    PORTD |= 0x01;  по ИЛИ ставим в 1 разряд порта

else

    PORTD ~= 0x01; сбрасываем разряд порта

и так повторяем для каждого вывода порта.

Share this post


Link to post
Share on other sites

Всем спасибо за помощь! Особенная благодарность Starichok ! Все получилось. Вот код:

if (PINB&(1<<PINB0))	
			  PORTD |=0x01;
	    else PORTD ==~0xFE;
		if (PINB&(1<<PINB1))
		      PORTD |=0x02;
		else PORTD ==~0xFD;
	    if (PINB&(1<<PINB2))
	          PORTD |=0x04;
	    else PORTD ==~0xFB;	
		if (PINB&(1<<PINB3))
		      PORTD |=0x08;
		else PORTD ==~0xF7;		
		if (PINB&(1<<PINB4))
		      PORTD |=0x10;
		else PORTD ==~0xEF;		
		if (PINB&(1<<PINB5))
		     PORTD |=0x20;
		else PORTD ==~0xDF;
		if (PINB&(1<<PINB6))
		     PORTD |=0x40;
		else PORTD ==~0xBF;		
		if (PINB&(1<<PINB7))
		     PORTD |=0x80;
	    else PORTD ==~0x7F;

 

Share this post


Link to post
Share on other sites

PORTD ==~0xFE - это ошибка.

два знака "равно" - это условие сравнения на равенство. а тебе нужно присвоить новое значение. 

а присвоение - один знак "равно".

и присвоить новое значение нужно так, чтобы не исказить другие биты порта.

выше я тоже наспех написал с ошибкой. чтобы сбросить бит, нужно сделать операцию "И" с инверсным числом.

должно быть так:

PORTD &= 0xFE

Share this post


Link to post
Share on other sites

Спасибо, исправил. Почему же код работал? Или это только в протеусе, в МК заглючил бы? Работал правда немного по другому. Сейчас если убрать входной сигнал, то на выходе лог.0. А до этого с прежним кодом (где была ошибка) если убрать входной сигнал,  то на выходе оставалась лог.1. Запоминался сработавший датчик.

Share this post


Link to post
Share on other sites

потому что из-за твоей ошибки у тебя не было сброса 1 после снятия входного сигнала.

Share this post


Link to post
Share on other sites

Все не так. Нам неизвестен замысел устройства. Нет ТЗ. Описания алгоритма работы устройства. По вашей портянке никто не будет разбираться. Будут только догадки. Во-первых, у контактов есть дребезг. Читайте в гугле, что это такое. Это означает, что считали порт, вроде есть значения, но из-за дребезга эти значения не верны. А по программе уже что-то нужно делать на основании считанного значения. В протеусе у вас все будет работать, на железе нет.

Поэтому. ТЗ, описание алгоритма работы устройства в студию.

Share this post


Link to post
Share on other sites
On 11/8/2019 at 10:47 AM, Garo said:

Вот код:

В Вашем случае, когда пины портов совпадают, можно написать проще, вот так:

while(1)
{
	PORTD = PORTB;
}

 

Share this post


Link to post
Share on other sites

Проблема решена. То,что не мне нужно я уже узнал. Дребезг контактов учел (поставил счетчик).  За "портянку" - обидно!

Вот код программы:

//Atmega8 

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


void preset()
{
	DDRB=0x00;
	PORTB=0x00;
	DDRD=0xFF;
	PORTD=0x00;
	DDRC=0b00111100;
	PORTC=0b00000000;
	for (int i=0; i<=7; i++)
	{
	     PORTD = (1<<i);
		_delay_ms(200);
	}
PORTD=0x00;
}
void matrix ()
{
	if (PINB&(1<<PINB0))
	PORTD |=0x01;
	else PORTD &=0xFE;
	if (PINB&(1<<PINB1))
	PORTD |=0x02;
	else PORTD &=0xFD;
	if (PINB&(1<<PINB2))
	PORTD |=0x04;
	else PORTD &=0xFB;
	if (PINB&(1<<PINB3))
	PORTD |=0x08;
	else PORTD &=0xF7;
	if (PINB&(1<<PINB4))
	PORTD |=0x10;
	else PORTD &=0xEF;
	if (PINB&(1<<PINB5))
	PORTD |=0x20;
	else PORTD &=0xDF;
	if (PINB&(1<<PINB6))
	PORTD |=0x40;
	else PORTD &=0xBF;
	if (PINB&(1<<PINB7))
	PORTD |=0x80;
	else PORTD &=0x7F;
}


void timer_ini (void) //настройка таймера (0.25 сек.)
{
	TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
	TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)	
	OCR1AH = 0b00000111; //записываем в регистр число 1953 
	OCR1AL = 0b10100001; //для сравнения (0.25 сек.)(1 сек.=7812 (при делителе 1024 и F_CPU 8000000))
	TCCR1B |= (1<<CS12)|(1<<CS10);//установим делитель (1024)
}
//_______________________________________
ISR (TIMER1_COMPA_vect)//вектор срабатывания
{	
	if (((PIND&(1<<PIND0)) || (PIND&(1<<PIND1)) || (PIND&(1<<PIND2)) || (PIND&(1<<PIND3))
	|| (PIND&(1<<PIND4)) || (PIND&(1<<PIND5)) || (PIND&(1<<PIND6)) || (PIND&(1<<PIND7))))
         {
			 _delay_ms(100);	
			 PORTC |=0x38;			
		 }
}

int main(void)
{
	preset();
	timer_ini();
	sei();
	unsigned char count=0;
    while(1)
    {			
	matrix();  
	 if ((PINC&(1<<PINC0)) && (PINC&(1<<PINC3)))
	{
		 PORTC &=0xFB; 
	}
	else
	  if ((PINC&(1<<PINC3)))
	  {
		  PORTC &=0xFB;
	  }
	 if (PINC&(1<<PINC0))
	       {
			 if (count<5)
			 {
				 count++;
			 }  
		   else
		   if  (PINC&(1<<PINC4))
		   PORTC &=0xFB; 
		   else
	      PORTC =0x04;		  
			 }		   
	else
	 if (PINC&(1<<PINC1))
	  {
		  if (count<5)
		  {
			  count++;
		  }
		  else
		   if  (PINC&(1<<PINC4))
		   {
			  PORTC =0x38;
		   }
		   else  
			  PORTC =0x08;		  
	  }
	
    }
	
}

 

Edited by Garo

Share this post


Link to post
Share on other sites

Конечные автоматы. Программные таймеры. Алгоритм + структура данных = программа. Табличной метод. 

Вся ваша портянка может уместиться в несколько строк.

Мало того, программу можно лепить как угодно.

Share this post


Link to post
Share on other sites

Что вы докопались до моей программы! Кто мне помог, тем я сказал спасибо. Вам то что надо от меня? 

Share this post


Link to post
Share on other sites

Подсказываю вам направление, если собираетесь двигаться дальше в освоении микроконтроллеров.

Share this post


Link to post
Share on other sites
23 часа назад, demiurg1978 сказал:

Вся ваша портянка может уместиться в несколько строк.

 

Вот и написали бы эти "пару строк" по выложенному исходнику. А то только умные слова . Человека рассердили, понимаешь )))

Share this post


Link to post
Share on other sites

1 - Проблема всех начинающих в данном случае - отсутствие целых пластов знаний.

2 - В данном случае ТЗ неизвестно. Писать по выложенной портянке, угадывать, что там пожелал автор - нет ни малейшего желания.

3 - "Несколько строк" - метафора. Чтобы написать эти несколько строк, должны быть программные модули. Программные таймеры, конечные автоматы. Опрос входов (с учетом дребезга). Если в лоб, табличный интерпретатор, все еще проще, но опять же опрос входов с учетом дребезга, что опять же тянет за собой программные таймеры. И скорее всего автомат.

Поэтому. Пора осваивать, знакомиться, изучать. Цикл статей Татарчевского Применение SWITCH технологии при разработке прикладного программного обеспечения для микроконтроллеров.

Даю замануху. Применяя этот подход, получаем: сокращение затрат времени на создание проектов в разы. Псевдопараллельность процессов. А это всегда больная точка и проблема для новичков.

Я сам был новичком. И проходил все это. И точно также недоумевал, на что мне тыкают опытные участники форумов. Понимание пришло позже, когда начал вникать в тему.

Share this post


Link to post
Share on other sites
12.11.2019 в 09:54, Garo сказал:

ISR (TIMER1_COMPA_vect)//вектор срабатывания
{	

			 _delay_ms(100);	

}

 

Кто Вас учил этому ? :rake:

Share this post


Link to post
Share on other sites

У Вас претензия только к задержки? Если да, то с Вами согласен, она там не к чему. Я не понимаю, что за полемика здесь присутствует. Зачем я должен кому то давать тех. задания.У меня был только один вопрос (см. первый пост), я там запутался и мне подсказали путь. А мне подсказывают какие то пути, про которые и сам знаю. Мне 52 года. Здесь технический форум или нравоучительный Все остальное я изучаю ( и таймеры и прочее). Теория должна подкрепляться практикой, что я и пытаюсь делать, все постепенно. Я же не прошу за меня написать программный код. Извините если кого обидел или задел профессиональное самолюбие. 

Edited by Garo

Share this post


Link to post
Share on other sites
6 минут назад, Garo сказал:

она там не к чему

Зачем же тогда она там стоит ?

Претензий у меня нет вообще никаких, код Вы пишите не мне :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • обновлю.  фэмы.  кварцы в карболите   кварцы в металл. корпусе . 
    • Это зависит от площади озвучиваемого помещения или улицы. Проще говоря для площади до 100квм пары 4а32 вполне хватает, причём с их чуйкой мощного усилка они не потребуют. Усь на паре tda7293 по схеме итуна или комбинированной оос справиться на раз два. Знаю очень много проводильщиков свадеб и мероприятий у которых самодельная акустика на Ломовских 4а32 и его поздних модификациях от Ноэма. А один 2а12 можно оформить в активный саб и при надобности включать его к паре в режиме трифоник. Для этого к усилку пары 4а32 надо сделать простой фвч с изменяемой Fсрез для разгрузки по нч и согласования с сабом. Два таких саба можно юзать на улице а в небольших помещениях вообще обойтись без саба, иначе все гости оглохнут от гудежа. Просто предварительно всегда надо смотреть помещение на предмет установки аппаратуры, где будет танцпол и оценки что с собой брать пару или трифоник.
    • 0х0с - обычный General Purpose Register, причём в середине их области адресов... Отлажу в MPLab. В нём всё работает. Да и в принципе правильно, что отлаживать надо в той среде, в какой написано. Там есть хоть и не такой цветастый, но Логический анализатор. Глубины записи правда не хватает, но отладить по кускам - не особая проблема. С теми, что столкнулся тут - не сравнить.   Уже не могу. Спасибо за потраченное время, узнал много нового. Протеуса снёс. Только что откатил систему Акронисом. Во время экспериментов с Протеусом (может конечно совпало, но с 14-го года, как поставил на эту машину W7, ТАКИХ глюков не было тфу-тьфу-тфу, а ставил много чего) он пару раз зависал при выходе. Закрывал Диспетчером задач, перезагружался и заметил -  слетела ЗАГРУЗКА Windows. Вместо заставки "собирающееся цветное окошко" стала полоса индикатора загрузки с зелёным бегунком. Не знаю, может с дистрибутивом вирус подцепил, хотя проверял, ничего не обнаружил. Проверьте на всякий случай мой архив, а лучше выкиньте его нафиг. Если можете, то и архив из моего сообщения. Бережёного Бог бережёт.  
    • пробуйте 16f505_test1.zip КМК это баг модуля при обращении к регистру с адресом 0x0C
    • @IMXO , спасибо, это обнадёживает. Я ожидал, что заработает. Может это из-за версии MPLab, в которой скомпилировано? У вас какая? Хотя 8.40 - вроде тех же лет, что и Протеус 7... Кстати, а "не работает" - какая ошибка выдаётся, такая же?
    • М-да... попробовал, действительно не работает...
×
×
  • Create New...