Перейти к содержанию

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


Garo

Рекомендуемые сообщения

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

 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;
}

И то не все.

Изменено пользователем Garo
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

Жизнь не белая или чёрная, а в мелкую серенькую полосочку...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Жизнь не белая или чёрная, а в мелкую серенькую полосочку...

Ссылка на комментарий
Поделиться на другие сайты

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

if (PINB&(1<<PINB0))

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

else

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

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

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

Всем спасибо за помощь! Особенная благодарность 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;

 

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

PORTD &= 0xFE

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

//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;		  
	  }
	
    }
	
}

 

Изменено пользователем Garo
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

23 часа назад, demiurg1978 сказал:

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

 

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

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Изменено пользователем Garo
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...