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

Высококачественные конденсаторы Panasonic для надежности вашей электроники!

Электролитические алюминиевые конденсаторы Panasonic отличаются повышенной надежностью, длительным сроком службы, низким импедансом и выдерживают большой ток пульсаций, в то время как семейства полимерных конденсаторов Panasonic SP-CAP, POSCAP, OS-CON и HYBRID характеризуют сверхнизкий ESR и увеличенная емкость, работа при высоких напряжениях и в расширенном температурном диапазоне. Приобретая продукцию Panasonic, вы гарантированно получаете самое передовое решение для ваших задач. Для облегчения вашего выбора, мы подготовили подборку полезных материалов.

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

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

Share this post


Link to post
Share on other sites
                     

Вебинар "Как создать BLE-устройство на базе новейшего беспроводного микроконтроллера STM32WB55"

27 ноября 2019 года компания КОМПЭЛ приглашает разработчиков, технических руководителей и энтузиастов беспроводной связи на вебинар, посвященный новинке 2019 года – мультипротокольному беспроводному микроконтроллеру STM32WB55, который позволяет создавать устройства на базе стандартов BLE 5.0; BLE Mesh; 802.15.4/ZigBee и Thread. На вебинаре мы покажем, как с помощью привычных инструментов STM32Cube и STM32CubeMX можно создать свое первое, надежно работающее BLE-приложение.

Зарегистрироваться на вебинар

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

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...

  • Сообщения

    • Не совсем похожую.В вопросе фигурировали цифры 8.ххх, т.е., точка стояла после восьмерки. Логически рассуждая, это 8 МГц, т.е., одна из самых распространенных тактовых частот для МК. А что кварц окукленный - так он намного дешевле, чем в металлическом корпусе. Можно изготавливать в таком же технологическом процессе, что и кварцевые фильтры.
    • Лично я просто кладу сердичником на нагреватель греющегося паяльника, ожидаю 3...5 минут, пока феррит не нагреется и плавненько, через тряпочки (горячо ведь), с легким пошатыванием растягиваю половинки в стороны. Горячий феррит хрупкий, поэтому - плавненько, плавненько, без фанатизма. Если сразу не идет - лучше подогреть чуток подольше. Проблема была только один раз из почти сотни - действительно, чем-то "термоядерным" склеили. А при обратной сборке склеиваю циакриновым клеем. Пишут, что это не самый удачный для данной цели компаунд, но, опять же, лично у меня проблем с ним пока что не было. Обязательно сохранить прокладку между половинками (если сердечник без зазора в центральном керне)!!! А вот идею с дополнительным "понижателем" оставьте на самый крайний случай . P.S. И соблюдайте Правила форума, иначе буду тупо удалять посты.
    • @Олександр Олексійович , скорее всего это так называемый "кварц" или "кварцевый резонатор" (может быть, что и фильтр, но маловероятно). Плохо видно, что там после 8-ки с точкой (нули или 86?), вот в сети похожую фотку нашёл:
    • Guest Алексей
      Никогда таким не занимался, страшно ломать блок,если чтото пойдет не так.... насколько я читал - ферит на какомто клею сидит который фиг сломаешь, только греть непонять чем (когда нет фена) и не всегда обратно встает. Короче говоря, оставляю эту идею на самый самый самый крайний случай. Было бы 2 одинаковых транса = решился бы, а так.... По транзисторам что-нибудь скажите? нагрузка идет от от одного к другому или распределяется между всеми?
    • Тоесть Вы изначально решили "хочу золото" собрали и пошли начали его выкапывать, завтра хочу серебро, собрали другую?  Вот как нужно подходить к вопросу! Но я незнаю что в земле может зарыто но забрал бы ценнее гвоздя Сложно общаться с профессионалами пока сам не проф )))
    • опасаюсь:-)один раз поторопился уже:-)  
    • Правильно полагаете. Снимайте трансформатор и сматывайте часть вторичной обмотки, не трогая остальных. Ну, и с резисторами делителя ОС подшаманьте, конечно. И будет Вам счастье.
×
×
  • Create New...