jjjjjjein 0 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Есть 2 кода. Один, для того, чтобы микроконтроллер принимал по UARTу данные, другой, микроконтроллер передаёт температуру со своего внутреннего датчика в гипертерминал через UART. По отдельности программы работают, а вместе нет. В чем может быть причина? И ещё вопрос. Программный фильтр в начале кода у меня наверно неправильно написан, как можно его исправить? int main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset _DINT(); // Запрещаем прерывания InitializationPortIO (); // Вызов функции инициализации портов ввода/вывода микроконтроллера InitializationTimersMSP430 (); // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 InitializationUSART (); // Вызов функции инициализации модуля USART InitializationADC (); // Вызов Функции инициализации модуля АЦП микроконтроллера _EINT(); // Разрещаем прерывания while (1) { ADC12CTL0 |= ADC12SC; // Выборка и запуск unsigned int i = 0; // Программный фильтр for(i=1; i<=100;) // Программный фильтр { IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр i++; // Программный фильтр } IntDegC = (((IntDegC / 100)- 1855) * 667) / 4096; // Формула для температуры в градусах цельсия //IntDegC = ((IntDegC - 1855) * 667) / 4096; //----------------------------------------------------------------------------------------------------------- if (Flag_1s == true) // Приём по UART { UART_printf ("\r\ntime %u:%u:%u",TimeHour, TimeMinute, TimeSecond); // Передача времени UART_printf ("\r\nT=%u",IntDegC); // Передача температуры //------------------------------------------------------------------------------------------------------- if (ADC_MEASSURING == false) { ADC_MEASSURING = true; Code_ADC_CPU = 0; ADC12CTL0 |= 0x03; } if (FlagAcceptDataUART == true) { // Передача по UART данных if (Counter_UART_RXDATA == 4) {ASCI_TO_DESYATICHNAYA = (BUFER_UART_RXD [0] - 48)*100 + (BUFER_UART_RXD [1] - 48)*10 + (BUFER_UART_RXD [2] - 48);} else if(Counter_UART_RXDATA == 3) {ASCI_TO_DESYATICHNAYA = (BUFER_UART_RXD [0] - 48)*10 + (BUFER_UART_RXD [1] - 48);} else if(Counter_UART_RXDATA == 2) {ASCI_TO_DESYATICHNAYA = (BUFER_UART_RXD [0]) - 48;} UART_printf ("\r\nЗАДАНА МОЩНОСТЬ: %u\r\n" , ASCI_TO_DESYATICHNAYA); char Counter_UART_RXDATA1; for (Counter_UART_RXDATA1 = 0; Counter_UART_RXDATA1 <= 4;) { BUFER_UART_RXD[Counter_UART_RXDATA1] = 0; Counter_UART_RXDATA1 ++; } Counter_UART_RXDATA = 0; FlagAcceptDataUART = false; FlagOverloadBuferUART = false; } Flag_1s = false; } } // return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба По отдельности программы работают, а вместе нет. Раз программы работают по отдельности, то вроде смотреть код необходимости нет. Лучше расскажите словами, что представляет собой пакет данных, какой физический уровень - все, что называется ёмким словом ПРОТОКОЛ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jjjjjjein 0 22 февраля, 2012 Опубликовано 22 февраля, 2012 · Жалоба Через компорт прошиваю в программную память MSP430F135 программатором Olmex. Открываю гипертерминал и контроллер раз в секунду передаёт на экран время и температуру по UARTу. А нужно ещё писать в гипертерминале число от 0 до 100, чтобы эти данные передавались в контроллер. Ещё, может у кого есть примеры программных фильтров. Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 22 февраля, 2012 Опубликовано 22 февраля, 2012 · Жалоба Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать. Погуглите медианную фильтрацию. Усреднение по 100 отсчетам - круто. Учитывая, что в F135 всего 512 байт ОЗУ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirZ 0 22 февраля, 2012 Опубликовано 22 февраля, 2012 · Жалоба IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр Какой смысл в *i ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jjjjjjein 0 22 февраля, 2012 Опубликовано 22 февраля, 2012 · Жалоба Цитата IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр Какой смысл в *i ? В том то и дело, что я не знаю этого, хочу, чтобы переменная (у меня было от 0 до 100, но можно от 0 до 20 например) задавала порядковый номер преобразованию АЦП, а потом, поделив на 20, считать среднее значение преобразований. Это для того, что если будут помехи (т. к. фильтра у контроллера на плате не стоит), не брать в расчет заведомо неверное преобразование АЦП, которое очень отличается от среднего значения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться