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

Управление на 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 пользователей онлайн

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

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
×
×
  • Создать...