Перейти к содержанию
    

UART передача и приём

Есть 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;
  }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По отдельности программы работают, а вместе нет.

Раз программы работают по отдельности, то вроде смотреть код необходимости нет.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Через компорт прошиваю в программную память MSP430F135 программатором Olmex. Открываю гипертерминал и контроллер раз в секунду передаёт на экран время и температуру по UARTу. А нужно ещё писать в гипертерминале число от 0 до 100, чтобы эти данные передавались в контроллер. Ещё, может у кого есть примеры программных фильтров. Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать.

Погуглите медианную фильтрацию.

Усреднение по 100 отсчетам - круто.

Учитывая, что в F135 всего 512 байт ОЗУ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр

 

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

 

В том то и дело, что я не знаю этого, хочу, чтобы переменная (у меня было от 0 до 100, но можно от 0 до 20 например) задавала порядковый номер преобразованию АЦП, а потом, поделив на 20, считать среднее значение преобразований. Это для того, что если будут помехи (т. к. фильтра у контроллера на плате не стоит), не брать в расчет заведомо неверное преобразование АЦП, которое очень отличается от среднего значения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...