ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
68922 Топик полностью
megajohn (14.09.2006 20:00, просмотров: 1) ответил AVR на Жень, не трать времени - пусть аффтар сам все пишет и считает. Пурга это, а не код
А не скажите ! Времени зря не потратил - впервые переделал сортировку индексами на указателями и понял что это рулёз ! Но так как не вижу конечной путёвой цели на этом заканчиваю. Внутри [+] передаю автору, то что оптимизнул 
#include <iom128.h>
#include <inavr.h>

#define b00000000 0
#define b00000001 1
#define b00000010 2
#define b00000100 4
#define b00001000 8
#define b00010000 16
#define b00100000 32
#define b01000000 64
#define b10000000 128

#define NUMBER 24

__flash char mass_time [] = {50, 51, 52, 53, 100, 100, 100, 100, 100};
__flash char mass_channel [] = { 0, 2, 3, 6,  7,  1,  4,  5,  8};
__flash char pattern [3][NUMBER] = {
	b00000001, b00000000, b00000000,
	b00000010, b00000000, b00000000,
	b00000100, b00000000, b00000000,
	b00001000, b00000000, b00000000,
	b00010000, b00000000, b00000000,
	b00100000, b00000000, b00000000,
	b01000000, b00000000, b00000000,
	b10000000, b00000001, b00000000,
	b00000000, b00000010, b00000001,
	b00000000, b00000100, b00000000,
	b00000000, b00001000, b00000000,
	b00000000, b00010000, b00000000,
	b00000000, b00100000, b00000000,
	b00000000, b01000000, b00000000,
	b00000000, b10000000, b00000000,
	b00000000, b00000000, b00000001,
	b00000000, b00000000, b00000010,
	b00000000, b00000000, b00000100,
	b00000000, b00000000, b00001000,
	b00000000, b00000000, b00010000,
	b00000000, b00000000, b00100000,
	b00000000, b00000000, b01000000,
	b00000000, b00000000, b10000000
	};

void main (void)
{
	PORTA = 0x55; //Для удобства отслежки в АСМе

	char k = 1, i, j, def;
	char *p1, *p2, *min, *s1, *s2;
	//Для чистоты эксперимента значения получены в Excel =ОКРУГЛ(СЛЧИС() * 100; 0)
	char time[NUMBER] = {32, 11, 56, 31, 84, 76, 6, 51, 51, 25, 9, 5, 75, 54, 43, 69, 76, 98, 17, 46, 47, 31, 13, 14};
	char channel[NUMBER] = {94, 53, 45, 16, 90, 21, 53, 80, 35, 79, 37, 94, 60, 6, 69, 44, 58, 52, 33, 78, 63, 70, 57, 53};        //таблица уставок
	char pwmtable [4][NUMBER]; //рабочая таблица
	
	//Упорядочение входных уставок по времени (Вариант MJ)
	p1 = &time[0];
	s1 = &channel[0];
	
	for(i = 0; i < NUMBER; i++)
	{
		min = p1;
		p2 = p1 + 1;
		for(j = i + 1; j < NUMBER; j++)
		{
			if(*p2 < *min) min = p2;
			p2++;
		}
	
		if (min != p1)
		{
			k = *p1;
			*p1 = *min;
			*min = k; //строка *p1 ^= *s1 ^= *p1 ^= *s1; не эффективна по критерию сокращения времени
			
			//Смена channels возможно не работоспособна
			s2 = s1 + (min - p1);
			k = *s1;
			*s1 = *s2;
			*s2 = k;
		}
		p1++;
		s1++;
	}

	//Формирование рабочей таблицы очередного шим
	pwmtable[0][0] = time[0];
	pwmtable[1][0] = pattern[1][channel[0]];
	pwmtable[2][0] = pattern[2][channel[0]];
	pwmtable[3][0] = pattern[3][channel[0]];

	k = 0;
	for(i = 0; i < NUMBER; i++)
	{
		if(pwmtable[0][k] = time[i])
		{
			pwmtable[0][k] = time[i];
			pwmtable[1][k] |= pattern[1][channel[i]];
			pwmtable[2][k] |= pattern[2][channel[i]];
			pwmtable[3][k] |= pattern[3][channel[i]];
		}
		else
		{
			pwmtable[0][k + 1] = time[i];
			pwmtable[1][k + 1] = pwmtable[1][k] | pattern[1][channel[i]];
			pwmtable[2][k + 1] = pwmtable[2][k] | pattern[2][channel[i]];
			pwmtable[3][k + 1] = pwmtable[3][k] | pattern[3][channel[i]];
			k++;
		}
	}
	
	//Для входных уставок /*И нафиг они нужны в конце файла ??? MJ (c)*/
	for (i = 0; i < 9; time[i] = mass_time[i], channel[i++] = mass_channel[i]);
	
	PORTA = 0xAA; //Для удобства отслежки в АСМе

}