реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> UART передача и приём, UART передача и приём
jjjjjjein
сообщение Feb 21 2012, 10:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 31-10-11
Пользователь №: 68 059



Есть 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;
  }
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 21 2012, 12:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(jjjjjjein @ Feb 21 2012, 13:36) *
По отдельности программы работают, а вместе нет.

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



--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
jjjjjjein
сообщение Feb 22 2012, 05:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 31-10-11
Пользователь №: 68 059



Через компорт прошиваю в программную память MSP430F135 программатором Olmex. Открываю гипертерминал и контроллер раз в секунду передаёт на экран время и температуру по UARTу. А нужно ещё писать в гипертерминале число от 0 до 100, чтобы эти данные передавались в контроллер. Ещё, может у кого есть примеры программных фильтров. Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 22 2012, 05:37
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(jjjjjjein @ Feb 22 2012, 09:35) *
Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать.

Погуглите медианную фильтрацию.
Усреднение по 100 отсчетам - круто.
Учитывая, что в F135 всего 512 байт ОЗУ


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
VladimirZ
сообщение Feb 22 2012, 09:02
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 8-02-05
Из: Харьков
Пользователь №: 2 496



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

Какой смысл в *i ?
Go to the top of the page
 
+Quote Post
jjjjjjein
сообщение Feb 22 2012, 09:47
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 31-10-11
Пользователь №: 68 059



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

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

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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 20:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016