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

Управление на 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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

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

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

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

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

Постоянно переключаются.  И зависает программа, т.е после отключения лог.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 пользователей онлайн

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