Детектор ошибок как скорректировать прогу?

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 195
Зарегистрирован: Вт ноя 18, 2008 22:38:13
Откуда: Я просто странник...

Сообщение otmyavrozok »

Доброго времени суток уважаемые обитатели сайта!
МК(мега48) фиксирует ошибочные состояния системы из 6 датчиков,получая информацию через UART,5 замеров кодированы в 5 8-битных чисел,где каждый бит соответствует состоянию датчика,два младших бита всегда 0.Ошибка ,по логике работы схемы,будет,если не менее 4
из 5 значений любого бита будут одинаковы. Уффф... :write:
К сожалению, творцы этого чуда ошиблись,и мк реагирует,только на неизменность всех 6 бит,т.е.ошибку 6 датчиков :o
Помогите сообразить алгоритм для правильной функции,я пока,не могу....
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Нужен просто факт ошибки, или указание на конкретный датчик?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

otmyavrozok писал(а):Ошибка ,по логике работы схемы,будет,если не менее 4
из 5 значений любого бита будут одинаковы.
Попробуйте в таком духе:

Код: Выделить всё

// максимально допустимое кол-во совпадающих бит
#define MAX_EQUAL_BITS 3
// маска старшего проверяемого бита
#define MAXBIT_MASK 0x80
// маска младшего проверяемого бита
#define MINBIT_MASK 0x04

/*
  Функция проверки выборки на наличие ошибки.
  Первый параметр - массив выборок, второй - длина этого массива.
  Если n-й бит результата установлен, это означает, что в данном бите выборки условие не выполнено.
  Если результат = 0, проверка выполнилась успешно.
*/
uint8_t errCheck(uint8_t sample[], int sampleLen)
{
	uint8_t result = 0;

	for (uint8_t mask = MAXBIT_MASK; mask >= MINBIT_MASK; mask >>=1)
	{
		int oneCnt = 0;
		for (int nQuan = 0; nQuan < sampleLen; nQuan++)
		{
			if (sample[nQuan] & mask)
			{
				oneCnt++;
			}
		}

		if ((oneCnt < (SAMPLE_QUAN - MAX_EQUAL_BITS)) || (oneCnt > MAX_EQUAL_BITS))
		{
			result |= mask;
		}
	}

	return result;
}

Только проверьте, пожалуйста. У меня не было возможности протестировать.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 195
Зарегистрирован: Вт ноя 18, 2008 22:38:13
Откуда: Я просто странник...

Сообщение otmyavrozok »

Опрос датчиков и регулировение осуществляет 16-битный мотороловский контроллер,инфу он выводит в виде 0-состояние датчика не изменилось,1-изменилось,ошибка(условное название,на процесс регулирования не влияет,определяет корректность данных)будет,если на интервале времени датчик не меняет состояние или меняет непрерывно.Изначально я думал подключиться к шине опроса датчиков,но разобраться с тамошним протоколом не смог :oops:.Идентифицировать конкретный датчик выдающий ошибку,возможно для определения аппаратных проблем,но хоть бы с необходимым разобраться. :roll:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 195
Зарегистрирован: Вт ноя 18, 2008 22:38:13
Откуда: Я просто странник...

Сообщение otmyavrozok »

Уважаемый Goldsmith,проверю,когда доберусь до компа,отпишусь.
Реклама
Ответить

Вернуться в «AVR»