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

Алгоритмы кода прошивок микросхем процессора ATMEGA16 на Си


tifaso

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

Нужно в общем написать прошивки на две микросхемы процессора ATMEGA16 они будут работать в паре (так сделал потому что выводов на микросхеме не хватало). Написать я и сам смогу, да собственно и сам буду писать. Только нужно понять алгоритмы кода как лучше сразу записать. Сам я уже пробовал написать, но работать почему то оно отказалось. В схеме всё верно перепроверено уже десятки раз. Тут проблема именно с отзывчивостью управления, то работает, то нет.

Вот прилагаю схемы блока питания и процессора так как они работают в связке.

141729815_.JPG.55d00ef12ab8f8821f7c9a7fc423b246.JPG

1170390082_.thumb.JPG.1eaa9fbf82928eb6fc75718fb187d3c1.JPG

На схеме процессора стоит приёмник пульта на ATTINY2313 там взят готовый проект написанный на ассемблере и с некоторыми правками был добавлен. Проверено там всё работает сигналы там проходят. Далее через развязку на транзисторах всё это приходит к микросхеме ATMEGA16 туда же подключаются кнопки расположенные на самом устройстве. Вся аудиосистема которую я разрабатываю очень большая и сложная. Сейчас я уже на финишной прямой. Осталось дело только за прошивкой двух микросхем.

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

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

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

Спойлер

 

/*
  Программа для процессора аудиосистемы на 
  микросхеме ATMEGA16 с индексом PR1 что 
  означает первый из двух микросхем которые работают в паре
 */ 

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

volatile unsigned power=0;
volatile unsigned power_bat=0;
volatile unsigned audio=0;
/*
  audio=0 MP3 PLAYER
  audio=1 FM Радиоприёмник
  audio=2 внешний вход аудиосигнала
 */

int main(void)
{
	DDRA = 0b00000000;
	DDRB = 0b00000000;
	DDRC = 0b11111110;
	DDRD = 0b11111111;
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	PORTC = 0b00000000;
	PORTD = 0b00000000;
	
    while(1)
    {
        //Кнопка включения
		if (~PINB & (1<<2))
		{
			_delay_ms(1);
			if (~PINB & (1<<2))
			{
				while(~PINB & (1<<2));
				if (PINC)
				{
					PORTC |= (1<<3);
					PORTD = 0b00001001;
					PORTC &= ~((1<<7)|(1<<1)|(1<<2));
					power=0;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
				else
				{
					PORTC |= (1<<3);
					PORTD = 0b00010010;
					PORTC |= (1<<7);
					power=1;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
		}	
		
		//Кнопка включения зарядного
		if (~PINA & (1<<6))
		{
			_delay_ms(1);
			if (~PINA & (1<<6))
			{
				while(~PINA & (1<<6))
				if (PINC)
				{
					PORTC |= (1<<3);
					PORTC &= ~(1<<6);
					power_bat=0;
					_delay_ms(300);
					PORTC &= ~(1<<3);
				}
				else
				{
					PORTC |= ((1<<6)|(1<<3));
					power_bat=1;
					_delay_ms(300);
					PORTC &= ~(1<<3);
				}
			}
		}
		
		
		
		//Если аудиосистема включена
		if (power==1)
		{
			//Проверяем сигнал наличия сети
			if (~PINC & (1<<0))
			{
				PORTC |= (1<<1);
				PORTC &= ~(1<<2);
				PORTD = 0b11110110;
			}
			else
			{
				PORTC |= (1<<2);
				PORTC &= ~(1<<1);
				PORTD = 0b01101111;
			}
			
			//Кнопка переключателя FM / MP3
			if (~PINB & (1<<1))
			{
				_delay_ms(1);
				if (~PINB & (1<<1))
				{
					if (audio==0)
					{
						PORTD = 0b01001001;
						audio=1;
						PORTC |= ((1<<5)|(1<<3));
						PORTC &= ~(1<<4);
						_delay_ms(300);
						PORTD = 0b00000000;
						PORTC &= ~(1<<3);
					}
					else
					{
						PORTD = 0b00100100;
						audio=0;
						PORTC |= (1<<3);
						PORTC &= ~((1<<4)|(1<<5));
						_delay_ms(300);
						PORTD = 0b00000000;
						PORTC &= ~(1<<3);
					}
				}
			}
			
			//Кнопка переключателя внешнего входа
			if (~PINA & (1<<7))
			{
				_delay_ms(1);
				if (~PINA & (1<<7))
				{
					audio=2;
					PORTC |= ((1<<4)|(1<<3));
					_delay_ms(300);
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка включения цветомузыки
			if (~PINB & (1<<0))
			{
				_delay_ms(1);
				if (~PINB & (1<<0))
				{
					while(~PINB & (1<<0))
					if (PIND)
					{
						PORTC |= (1<<3);
						//Передача сигнала на PR2
						PORTD = 0b01000000;
						_delay_ms(300);
						PORTD = 0b00000000;
						PORTC &= ~(1<<3);
					}
					else
					{
						PORTC |= (1<<3);
						//Передача сигнала на PR2
					    PORTD = 0b10000000;
						_delay_ms(300);
						PORTD = 0b00000000;
						PORTC &= ~(1<<3);
					}
					
				}
			}
			
			//Кнопка режима точка
			if (~PINB & (1<<4))
			{
				_delay_ms(1);
				if (~PINB & (1<<4))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b00010000;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка режима столбик
			if (~PINB & (1<<5))
			{
				_delay_ms(1);
				if (~PINB & (1<<5))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b00001000;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка нормального режима
			if (~PINB & (1<<3))
			{
				_delay_ms(1);
				if (~PINB & (1<<3))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b00100000;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка PLAY / PAUSE // STEREO
			if (~PINB & (1<<6))
			{
				_delay_ms(1);
				if (~PINB & (1<<6))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b00000100;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка REPEAT / BASS
			if (~PINB & (1<<7))
			{
				_delay_ms(1);
				if (~PINB & (1<<7))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b00000010;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка VOL-
			if (~PINA & (1<<4))
			{
				_delay_ms(1);
				if (~PINA & (1<<4))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b00000001;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка VOL+
			if (~PINA & (1<<5))
			{
				_delay_ms(1);
				if (~PINA & (1<<5))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b00100001;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка CH-
			if (~PINA & (1<<2))
			{
				_delay_ms(1);
				if (~PINA & (1<<2))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b10010000;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка CH+
			if (~PINA & (1<<3))
			{
				_delay_ms(1);
				if (~PINA & (1<<3))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b01001000;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка PREV
			if (~PINA & (1<<0))
			{
				_delay_ms(1);
				if (~PINA & (1<<0))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b11011011;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}
			
			//Кнопка NEXT
			if (~PINA & (1<<1))
			{
				_delay_ms(1);
				if (~PINA & (1<<1))
				{
					PORTC |= (1<<3);
					//Передача сигнала на PR2
					PORTD = 0b10010010;
					_delay_ms(300);
					PORTD = 0b00000000;
					PORTC &= ~(1<<3);
				}
			}		
		}
    }
}
Спойлер
/*
  Программа для процессора аудиосистемы на
  микросхеме ATMEGA16 с индексом PR2 что
  означает второй из двух микросхем которые работают в паре
 */ 

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

volatile unsigned power=0;
volatile unsigned audio=0;
volatile unsigned color_music=0;
/*
  audio=0 MP3 PLAYER
  audio=1 FM Радиоприёмник
  audio=2 внешний вход аудиосигнала
 */

int main(void)
{
	DDRA = 0b11111111;
	DDRB = 0b00000000;
	DDRC = 0b11111111;
	DDRD = 0b11111111;
	
	PORTA = 0b00000000;
	PORTB = 0b00000000;
	PORTC = 0b00000000;
	PORTD = 0b00000000;
	
    while(1)
    {
        //Сигнал включения
		if (PINB == 0b01001000)
		{
			power=1;
			PORTA |= (1<<6);
		}
		
		//Сигнал выключения
		if (PINB == 0b10010000)
		{
			power=0;
			PORTD &= ~(1<<0);
			PORTA &= ~(1<<6);
		}
		
		//Сигнал включения цветомузыки
		if (PINB == 0b00000001)
		{
			color_music=1;
			PORTD |= ((1<<7)|(1<<0));
		}
		
		//Сигнал выключения цветомузыки
		if (PINB == 0b00000010)
		{
			color_music=0;
			PORTD &= ~((1<<7)|(1<<0));
		}
		
		//Сигнал работы от сети
		if (PINB == 0b01101111)
		{
			PORTA &= ~(1<<6);
		}
		
		//Сигнал работы от аккумулятора
		if (PINB == 0b11110110)
		{
			PORTA |= (1<<6);
		}
		
		//Сигнал FM
		if (PINB == 0b10010010)
		{
			audio=1;
		}
		
		//Сигнал MP3
		if (PINB == 0b00100100)
		{
			audio=0;
		}
		
		//Сигнал нормального режима
		if (PINB == 0b00000100)
		{
			PORTC &= ~(1<<0);
			PORTC |= (1<<1);
		}
		
		//Сигнал режима точка
		if (PINB == 0b00001000)
		{
			PORTC |= (1<<0);
			PORTC &= ~(1<<1);
		}
		
		//Сигнал режима столбик
		if (PINB == 0b00010000)
		{
			PORTC |= ((1<<1)|(1<<0));
		}
		
		//Сигнал PLAY / PAUSE // STEREO
		if (PINB == 0b00100000)
		{
			if (audio == 0)
			{
				PORTA |= (1<<1);
				_delay_ms(300);
				PORTA &= ~(1<<1);
			}
			if (audio == 1)
			{
				PORTC |= (1<<6);
				_delay_ms(300);
				PORTC &= ~(1<<6);
			}
		}
		
		//Сигнал REPEAT / BASS
		if (PINB == 0b01000000)
		{
			if (audio == 0)
			{
				PORTA |= (1<<0);
				_delay_ms(300);
				PORTA &= ~(1<<0);
			}
			if (audio == 1)
			{
				PORTC |= (1<<7);
				_delay_ms(300);
				PORTC &= ~(1<<7);
			}
		}
		
		//Сигнал VOL-
		if (PINB == 0b10000000)
		{
			if (audio == 0)
			{
				PORTA |= (1<<5);
				_delay_ms(300);
				PORTA &= ~(1<<5);
			}
			if (audio == 1)
			{
				PORTC |= (1<<2);
				_delay_ms(300);
				PORTC &= ~(1<<2);
			}
		}
		
		//Сигнал VOL+
		if (PINB == 0b10000100)
		{
			if (audio == 0)
			{
				PORTA |= (1<<4);
				_delay_ms(300);
				PORTA &= ~(1<<4);
			}
			if (audio == 1)
			{
				PORTC |= (1<<3);
				_delay_ms(300);
				PORTC &= ~(1<<3);
			}
		}
		
		//Сигнал CH-
		if (PINB == 0b00001001)
		{
			if (audio == 1)
			{
				PORTC |= (1<<4);
				_delay_ms(300);
				PORTC &= ~(1<<4);
			}
		}
		
		//Сигнал CH+
		if (PINB == 0b00010010)
		{
			if (audio == 1)
			{
				PORTC |= (1<<5);
				_delay_ms(300);
				PORTC &= ~(1<<5);
			}
		}
		
		//Сигнал PREV
		if (PINB == 0b11011011)
		{
			if (audio == 0)
			{
				PORTA |= (1<<2);
				_delay_ms(300);
				PORTA &= ~(1<<2);
			}
		}
		
		//Сигнал NEXT
		if (PINB == 0b01001001)
		{
			if (audio == 0)
			{
				PORTA |= (1<<3);
				_delay_ms(300);
				PORTA &= ~(1<<3);
			}
		}
    }
}

 

 

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

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

Надо писать по другому. И чтобы было больше ног, можно поставить расширители портов. 

Мне в свое время очень помогли вот эти статьи 

http://easyelectronics.ru/avr-uchebnyj-kurs-arxitektura-programm.html

http://easyelectronics.ru/avr-uchebnyj-kurs-arxitektura-programm-chast-2.html

http://easyelectronics.ru/avr-uchebnyj-kurs-arxitektura-programm-chast-3.html

http://easyelectronics.ru/avr-uchebnyj-kurs-vytesnyayushhij-dispetcher-zadach.html

С уважением, Михаил, EEP Lab

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

Ну тут уже схему переделывать я не буду сильно это уже сложно и затратно будет. Поэтому нужно просто переписать код в микросхемах. Задержки нужны без них никак. На них выполняется выдержка времени для того чтоб сигналы успели правильно обработаться и выполнится как во второй микросхеме так и в первой. Чтобы отобразилась верно вся индикация на светодиодах и отработали реле. Единственное что я думаю тут нужно будет отрегулировать время выдержки. Тут уже нужно как то просто наверное выносить код кнопок из цикла и вызывать определёнными условиями, но опять же вызывать придётся из этого же цикла. Больше я как то и не знаю как ещё это сделать. Хотя ещё есть возможность попробовать сделать через таймер.

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

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

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

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

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

Я юзаю для формирования задержек программные таймеры.

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

Pr1_2021.zip

С уважением, Михаил, EEP Lab

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

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

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

Если будет что-то непонятно в моем коде - спрашивайте.

А функция delay_ms() это тупой цикл для создания паузы. И когда оно встречается в коде, все встает колом на время, пока эта пауза не завершится (кроме прерываний, они наступят, если не были запрещены). Поэтому их лучше вообще не использовать, либо применять, но аккуратно и со знанием дела.

С уважением, Михаил, EEP Lab

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

Ну я в программировании микросхем ещё новичок и ка я смотрел и учился по по видео урокам из инета там только delay_ms() и применялась для задержек. Ну а я большего и не знал.

Только единственное я код пишу в Atmel Studio 6.2. Седьмая версия у меня так и не встала на комп.

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

@aitras Я уже это знаю нашёл файлик с кодом и открыл. Но разбираться со всем этим делом буду уже завтра. Сегодня уже время позднее 23:30 на часах. В такое время такими делами я не занимаюсь. Лучше по утру на свежую голову. Будут вопросы напишу.

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

3 часа назад, tifaso сказал:

Написать я и сам смогу, да собственно и сам буду писать

Вот и чудненько. Начинать надо с
 

int main(){

//(а тута как раз код положи)

}

Хотя я бы тебе рекомендовал ассемблер. Ну их нафиг, эти высокоуровневые языки в микроконтроллерах.

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

@Огонёк Ну с ассемблером ещё сложней я там вообще всего то пару команд кое как по справочникам освоил чтобы одну прошивку подредактировать под себя и всё. Поэтому ну его нафиг этот ассемблер. Лучше уж хоть на си я мало майски как то да напишу для себя прошивки. 

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

1 час назад, tifaso сказал:

Задержки нужны без них никак.

Так-то да, да не так. В задержке МК может тупо считать до миллиона, а может что-то полезное делать, пок вдруг не. Выбор за тобой, за программистом.

Почитай даташит на МК. Бумага большая, но интересная.

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

7 минут назад, bulat943 сказал:

А зачем тут 3 микроконтроллера?  Делайте на атмега16 и регистре сдвига,кнопки матрицей 4х4,делов то...

Хотя,хозяин-барин

Очень тут всё это сложно увязать. Во первых ATTINY2313 это приёмник пульта. Это уже взят готовый проект и написан он на ассемблере, а остальное пишется на си. Переделывать не вариант нету осциллографа а без него и не сделаешь такую штуку. Потом узлов коммутации, индикации и управления очень много. Так что в одну микросхему никак не уложится тупо не хватает портов (то есть ножек микросхем).

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

Не нужен осциллограф для того, чтобы разобраться с ПДУ. Там всё довольно просто и в Сети есть документация. Вот, типа такой:
http://wiki.lemaker.org/LeMaker_Guitar:IR

В коде просто вешаем обработчик прерывания на нужный фронт (обычно спадающий) сигнала с приёмника ПДУ. На каком-то таймере крутим счётчик времени. В обработчике измеряем длительности импульсов и раскодируем команду ПДУ.

Если не хватает ног на вывод, то делаем так: https://arduino.ru/Tutorial/registr_74HC595

Кнопки можно подключить так: http://arduino-kid.ru/blog/rezistivnye-knopki

Одного ATmega16 хватит выше крыши.

Я для аудиосистемы делал всё на одном МК, ATtyny2313

При этом МК управляет громкостью на PGA2310, обрабатывает ПДУ и энкодер, переключает входы. Выключает УМЗЧ, если долго нет звука. 

Причём ёще на разные входы можно настроить разную чувствительность, реализован режим настроек. Также для каждого входа настраивается ШИМ сигнал для настройки чувствительности анализатора спектра.
Вывод на четыре семисегментных индикатора. Специально в статике, чтобы помех меньше давало. 

629656458_.thumb.GIF.5b3313b2ec5c9895e40a627891e81e86.GIF

Reset от 74HC595 можно было не разводить, ещё один пин можно было сэкономить (один свободный остался и так).

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

@ChePay Ну во первых у меня это не ардуино и то что предлагаешь тут ни разу не подойдёт. По поводу пульта с приёмником. У меня чисто комплектный вариант где я собирал сам и пульт и приёмник. А там используется своя кодировка написанная чешским автором. В инете можно найти. Просто я больше нигде не встречал такого варианта чтобы был и пульт и приёмник в комплекте. Варианты со всякими другими магазинными пультами даже не рассматриваю. Система должна быть комплектная. Поэтому я и использовал именно эту систему.

Ну в моей аудиосистеме никак не увязать на одной микросхеме там ещё и цветомузыка завязана ещё на 3 режима работы и радио и плеер. В общем много чего.

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

18 минут назад, tifaso сказал:

Ну во первых у меня это не ардуино и то что предлагаешь тут ни разу не подойдёт

Причем тут ардуино? важен принцип

18 минут назад, tifaso сказал:

А там используется своя кодировка написанная чешским автором

у него и протокол описан в деталях,и осциллограммы есть

Спойлер

 

20 минут назад, tifaso сказал:

Ну в моей аудиосистеме никак не увязать на одной микросхеме

Вам будет сложнее отыскать причину того или иного неадекватого поведения системы

и еще вопрос к вам-данный пульт и приемник предназначен для включения/выключения нагрузками,то есть нажал кноку определенную-нагрузка включилась,нажал второй раз-нагрузка отключилась,как вы это обработаете?

Ссылка на автора пульта

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

Я б наверное частоту процессора увеличил. 1Мгц маловато. Может где то не успеть. Особенно при  обработки прерывания. (По моему там только на обработку прерывания 12 тактов идет).

А расширить входы выходы особенно для статических режимов индикации и управления удобно  с помощью регистров-защелок 74нс573. легко наращивается количество периферии. практически не ест программные ресурсы . выставить байт в порт и подать короткий импульс на нужный регистр.И можно забыть до следующей записи.

Порт можно в это время использовать для других задач.

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

@oleg korotkov Вроде как мне объяснял автор видео уроков по которым я учился. Так выставляется частота внутреннего кварца по умолчанию на 8 мегагерц. Как оно на самом деле не знаю. Я уже после столько расхождений узнал что половина из тех видео уроков не точна и многие делают по другому. Но это однако были мною получены первые знания и первый опыт в программировании собственно с этого я начинал. Может оно и действительно стоит переписать частоту по другому.

Я вот сейчас смотрю всё что мне тут написали. Возможно действительно стоит переделать плату самого процессора. Попробовать пере компановать всё. Найти эти расширители портов 74HC573, но тут тоже нужно понять как с ними работать. Приёмник на ATTINY2313 я трогать в любом случае не буду он работает хорошо и трогать его не стоит очень сложно там всё. Лучше отлавливать сигналы с него и обрабатывать их.

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

1343443399_.jpg.a1a11636dcebdb10206c62b6a2441209.jpg

В общем так буду сейчас всё изучать как и что лучше сделать перерабатывать всю плату и нужно будет прикупить расширители портов и скорей всего ещё и текстолит для платы. Если конечно у себя не найду подходящего листа. Ладно что же подсказывайте интересует как работать с расширителями портов типа 74HC573 и как сделать такую клавиатурку, а именно программная часть данной конструкции.

Так оно конечно в одной микросхеме лучше всем управлять. Поэтому я буду стремится оставить только одну ATMEGA16 и приёмник ATTINY2313. Просто я не знал что здесь можно сделать лучше чем я придумывал.

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

13 часов назад, tifaso сказал:

...Так что в одну микросхему никак не уложится тупо не хватает портов (то есть ножек микросхем).

Вам тупо не хватает знаний. Пример с расширением портов для индикации Вам уже выложили. Вариант для реле такой-же. А если добавить в конце цепочки 595-х еще парочку (решение в лоб) и подавать на них одну единичку, смещая ее каждый цикл, то можно повесить 16 кнопок, принимая сигнал с которых на одну линию порта, можно детектировать нажатую кнопку по фазе передаваемого сигнала. В результате - на реле и кнопки Вам понадобится 5 линий МК. Так Вы приблизитесь к применению Atmega328P (которого вполне может хватить... если еще подумать). Другое дело Вам не найти варианты исходников, которые Вы склеиваете друг с другом для получения желаемого результата.

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

@Геннадий Знаний очень мало я и сказал что я новичок в этом деле. Так из того что предлагали по ссылкам я мало чего понял. Может хоть кто то объяснить своими словами просто и подробно как это делается.

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

11 часов назад, bulat943 сказал:

и еще вопрос к вам-данный пульт и приемник предназначен для включения/выключения нагрузками,то есть нажал кнопку определенную-нагрузка включилась,нажал второй раз-нагрузка отключилась,как вы это обработаете?

Здесь это я уже поправил в моей системе там просто проходит сигнал, то есть плюс питания на короткое время я специально настраивал время так чтоб ATMEGA16 успела принять сигнал от приёмника. Такая связка вполне хорошо работает я уже в другом проекте использовал эту же систему пульта с приёмником. Кстати как то ранее здесь на форуме и решил эту проблему.

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

Вешаете цепочку из пяти регистров 74HC595 (4 линии МК), 3 из которых будут формировать 24 линии управления реле и 2 линии кнопок (16 шт.). Для релюшек можно добавить ULN2003 или, как у Вас, транзисторы. Для кнопок возьмите еще одну линию МК, как вход. Для всего этого в коде достаточно применить массив в 5 байт. Каждый бит массива будет соответствовать одной выходной линии 595-регистров. Вот и жонглируйте этими битами в массиве, как линиями портов. После завершения операции изменения состояний, выводите этот массив в регистры одним пакетом. Так Вы получите расширение портов 5 в 24 выхода реле + 16 линий кнопок, сигнал с которых будет возвращаться в МК. Мало реле добавьте еще один регистр и один байт в массив. Это позволит получить еще 8 выходов без увеличения задействованных линий МК.

ЗЫ. Лет 14 назад мне хватило одной Atmega8 для работы с ИК пультом ДУ и управлением 240 (не предел) линиями нагрузки (табло ценников на заправках) + несколько сервисных линий... А Вам одной Меги16 не хватает на такую простую схему.

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

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

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

  • Сообщения

    • в первый пост выложил новую версию загрузчика BootLoader12.zip. сделаны изменения в компьютерной программе и в файле помощи. по просьбе nik1234 добавил выбор доступного (свободного) СОМ порта. если ранее программа открывала первый же свободный порт, а свободных портов имелось несколько, то программа могла открыть не тот порт, к которому подключен МК. и тогда никогда не получится установить соединение между компьютерной программой и загрузчиком. его просьба оказалась очень логичная и актуальная. у меня на ноуте создается только один свободный порт, к которому подключен конвертер. поэтому у меня не может быть проблемы с открытием другого свободного порта. а у него системник с физическими СОМ портами, и нужно выбрать тот порт, к которому подключен МК.
    • А не сохранилось у вас фото с другой стороны или "лейки" данной платы? И к какому виду надо привести схему, если в квартире нет заземления?
    • korsaj, спокойствие, только оно.  Два сопротивления на выход от ПК, 330 Ом и 150 Ом - последовательно. Масса общая. Выход с пк подключаем на 330 Ом. Вх. саба в точку соединения 330 Ом и 150 Ом. Не парьтесь, если не найдёте именно эти номиналы. + - 50 процент - сойдёт. ( 330 Ом, пойдёт от 220 Ом до 470 Ом). ( 150 Ом, пойдёт от 100 Ом до 180 Ом). У вас не прибор. И забудете...
    • усилитель жив еще? По звуку понравился, с учетом вашего опыта отслушивания многих конструкций? Хотя на Веге уже решили, что Маньяк- лучший из форумной самодеятельности. Вроде бы, никто не возражал
    • Думаю, причина в сайте. Вчера нормально было. Мои слова копировали и они были моими... Выше, в сообщениях.  Да всё равно.
    • Без "помудохаться" за последнее время у меня были младший Парус, Фотон, СSC-Lite. Остальное (поболее) с "помудохаться",  в разной степени. Хотя в части случаев можно было и "забить"... Так что не пугает. И платы есть уже. Не понравится-распаяю потихоньку, по мере потребностей в компонентах.
×
×
  • Создать...