Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2018, 17:43   #1
Zymcheg
 
Регистрация: 10.04.2012
Сообщений: 3
Радость [C++] Как оптимизировать код.

Доброго времени суток.
Стоит задача создать плату управления шаговым двигателем с индикацией.
Плату разработал собрал (ATmega16L-8PU), на плате имеется:
1) 5 кнопок (4 програмируемые одна reset)
2) 4 светодиода (3 для индикации кнопок, одна на питание)
3) 4 вывода на драйвер управлением ШД.
4) 1 сдвоенный 7-сегментный светодиодный дисплей.

Программу написал но код больно уж топорный хоть и рабочий. Куда копать чтобы автоматизировать и сделать его красивей (короче)? Просьба сильно не ругать и не бить.


Код:
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>

int main(void)
{
	DDRB=0b00000000;
	PORTB=0b00000000;
	DDRD=0b11111111;
	PORTD=0b00000000;
	DDRA=0b11111111;
	PORTA=0b00000000;
	DDRC=0b11111111;
	PORTC=0b00000000;
	
	unsigned int i=0;
	unsigned int a=0;
	unsigned int x=0;
	unsigned int y=0;
		
    while(1)
	
	    {
			m1:
			

		
			PORTD=0b10000000; // Зажигаем светодиод питания
			if (!(PINB&0b00001000)) // Если нажата первая кнопка +1 к переменной I
			{
				PORTD=0b10010000; // зажигаем светодиод
				_delay_ms(300);
				PORTD=0b10000000; // гасим светодиод
				i++;
			}
			if (!(PINB&0b00000100)) // Если нажата вторая кнопка -1 к переменной I
			{
				PORTD=0b11000000; // зажигаем светодиод
				_delay_ms(300);
				PORTD=0b10000000; //гасим светодиод
				i--;
			}
			
						x=i/10; //выводим второй разряд переменной I
						y=i%10; //выводим первый разряд переменной I
						
						if (y==1)
						{
							PORTC=0b00010001;
						}
						
						if (y==2)
						{
							PORTC=0b11100011;
						}
						
						if (y==3)
						{
							PORTC=0b01110011;
						}	
								
						if (y==4)
						{
							PORTC=0b00110101;
						}
						
						if (y==5)
						{
							PORTC=0b01110110;
						}
						
						if (y==6)
						{
							PORTC=0b11110110;
						}
						
						if (y==7)
						{
							PORTC=0b00010011;
						}
						
						if (y==8)
						{
							PORTC=0b11110111;
						}
						
						if (y==9)
						{
							PORTC=0b01110111;
						}
						if (y==0)
						{
							PORTC=0b11010111;
						}
						
							if (x==1)
							{
								PORTA=0b00100001;
							}
							
							if (x==2)
							{
								PORTA=0b11000111;
							}
							
							if (x==3)
							{
								PORTA=0b01100111;
							}
							
							if (x==4)
							{
								PORTA=0b00101101;
							}
							
							if (x==5)
							{
								PORTA=0b01101110;
							}
							
							if (x==6)
							{
								PORTA=0b11101110;
							}
							
							if (x==7)
							{
								PORTA=0b00100011;
							}
							
							if (x==8)
							{
								PORTA=0b11101111;
							}
							
							if (x==9)
							{
								PORTA=0b01101111;
							}
							if (x==0)
							{
								PORTA=0b11101011;
							}
						
						
			if (!(PINB&0b00000010)) // Если нажата третья кнопка запуск ШД
			{
			a=1000/i;
			 while(1)
			 {
				if (!(PINB&0b00000001)) goto m1; // Если нажата четвертая кнопка остановка ШД
				{
					
							PORTD=0b10100001;
							for(i = 0; i >= a; i++)
							{
								_delay_ms(1);
							}
							PORTD=0b10100100;
							for(i = 0; i >= a; i++)
							{
								_delay_ms(1);
							}
							PORTD=0b10100010;
							for(i = 0; i >= a; i++)
							{
								_delay_ms(1);
							}
							PORTD=0b10101000;
							for(i = 0; i >= a; i++)
							{
								_delay_ms(1);
							}
		    	}
		 }
			
         }
        }
}

Последний раз редактировалось Zymcheg; 25.05.2018 в 17:56.
Zymcheg вне форума Ответить с цитированием
Старый 25.05.2018, 17:49   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

1. отредактируйте сообщение и выставьте ему тэг "код" - читать тут глаза сломаешь
2. все ваши иф по номеру (т.к. они последовательны там) можно заменить на массив
типа так
Код:
const static int xarr {0b00010001, 0b00010001, 0b00010001, }; //значения записать по порядку номеров х
PORTA = xarr[x];
А если сильнее покопать, возможно эти числа есть какое-то двоичное значение f(x) и тогда дочтаточно типа так

PORTA=f(x)

(f = функция, подумать нада, лень).

Да кстати, второй цикл там у вас...m1 уберите совсем, if (!(PINB&0b00000001)) goto m1 уберите совсем, а цикл

Цитата:
while ((PINB&0b00000001))
Вобщем обратное условие исходному IF, пусть его while проверяет...и заканчивается, когда не верно.

Последний раз редактировалось alexzk; 25.05.2018 в 17:55.
alexzk вне форума Ответить с цитированием
Старый 25.05.2018, 18:06   #3
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Вот можете глянуть, я под ардуинку на С++ баловался.
https://github.com/alexzk1/startrack/

Все можно современное, главное флаги компилятора выставить
Код:
set(ARDUINO_C_FLAGS      " -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -fdce")
set(ARDUINO_CXX_FLAGS    "${ARDUINO_C_FLAGS} -felide-constructors -fno-threadsafe-statics -std=c++11")
(в моем случае в CmakeList.txt)

Последний раз редактировалось Вадим Мошев; 29.05.2018 в 19:42.
alexzk вне форума Ответить с цитированием
Старый 28.05.2018, 10:31   #4
Zymcheg
 
Регистрация: 10.04.2012
Сообщений: 3
По умолчанию

Спасибо большое. подумаю. Про цикл хорошая идея переделаю.
Ардуинкой не баловался. Сразу AVR +) и Atmel Studio 6.2
Сейчас гляну.
Zymcheg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Swing - Слушатели в Java, как создать 1 слушатель для всех этих кнопок и оптимизировать код? ~Paradox~ Общие вопросы по Java, Java SE, Kotlin 2 06.05.2016 09:50
Как оптимизировать код? цикл доводит работу процессора до 100% stdio Общие вопросы C/C++ 14 21.02.2012 00:52
Как оптимизировать код C++ slim>>> Помощь студентам 10 25.01.2011 00:05
Как оптимизировать код перевода BMP в JPEG artemavd Общие вопросы Delphi 7 12.11.2010 12:18
Как оптимизировать код Delphi OST_K Помощь студентам 1 30.05.2010 06:59