Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART передача и приём
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
jjjjjjein
Есть 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;
  }
Dog Pawlowa
Цитата(jjjjjjein @ Feb 21 2012, 13:36) *
По отдельности программы работают, а вместе нет.

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

jjjjjjein
Через компорт прошиваю в программную память MSP430F135 программатором Olmex. Открываю гипертерминал и контроллер раз в секунду передаёт на экран время и температуру по UARTу. А нужно ещё писать в гипертерминале число от 0 до 100, чтобы эти данные передавались в контроллер. Ещё, может у кого есть примеры программных фильтров. Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать.
MrYuran
Цитата(jjjjjjein @ Feb 22 2012, 09:35) *
Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать.

Погуглите медианную фильтрацию.
Усреднение по 100 отсчетам - круто.
Учитывая, что в F135 всего 512 байт ОЗУ
VladimirZ
Цитата
IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр

Какой смысл в *i ?
jjjjjjein
Цитата
IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр

Какой смысл в *i ?

В том то и дело, что я не знаю этого, хочу, чтобы переменная (у меня было от 0 до 100, но можно от 0 до 20 например) задавала порядковый номер преобразованию АЦП, а потом, поделив на 20, считать среднее значение преобразований. Это для того, что если будут помехи (т. к. фильтра у контроллера на плате не стоит), не брать в расчет заведомо неверное преобразование АЦП, которое очень отличается от среднего значения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.