CooperFile

CVAvr Uart Нужна помощь

9 сообщений в этой теме

CooperFile    0

Всем привет. CVAVR начал осваивать только недавно. Да и вообще раньше не особо работал с UART. Такой вопрос. Допустим по UART приходят строки типа:

T:21.33 E:0 B:73.0 
T:21.29 E:0 B:73.1 
T:21.25 E:0 B:73.2 

Каким образом можно вытягивать нужную информацию? С последующим выводом в нужные места? Можете показать пример и тыкнуть носом? Заранее спасибо за помощь!
 

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Alex    494

Вопрос - ни о чём. Какие то отрывки из мыслей.
Что значит "вытягивать", что за "нужная" такая информация ? Что за "вывод" и какие такие "нужные места" ?

 

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


Ссылка на сообщение
Поделиться на других сайтах
Berg    13
В ‎09‎.‎03‎.‎2017 в 16:05, CooperFile сказал:

Каким образом можно вытягивать нужную информацию? С последующим выводом в нужные места?

Ну тут все ясно как божий день.

#include <avr/io.h>
#include <stdlib.h>

char rx_buffer[] = "T:21.33 E:0 B:73.0";// к примеру по uart нам прилетело это
char T[7], E[7], B[7];
float Temperatura, Energy, Barrel;
 
int main(void)
{
	char i = 0;
	while(rx_buffer[i] != '\0'){
		if(rx_buffer[i] == 'T'){
		 	for(char r=0; r<7; r++){
			 	if(rx_buffer[i+r+2] == ' ') break;
			 	T[r] = rx_buffer[i+2+r];
		 	}
	 	}
		if(rx_buffer[i] == 'E'){
			for(int r=0; r<7; r++){
				if(rx_buffer[i+r+2] == ' ') break;
				E[r] = rx_buffer[i+2+r];
			}
		}
 	 	if(rx_buffer[i] == 'B'){
	 	 	for(int r=0; r<7; r++){
		 	 	if(rx_buffer[i+r+2] == '\0') break;
		 	 	B[r] = rx_buffer[i+2+r];
	 	 	}
 	 	}
 		i++;
	 }
	 Temperatura = atof(T); Energy = atof(E); Barrel = atof(B);

while(1);
}

В массиве T[] будет строка "21.33", в E[] будет "0", в B[] будет "73.0"

Если данные нужно будет обрабатывать переменные: Temperatura=21.33, Energy=0, Barrel=73

string.jpg

  • Одобряю 1

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


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

В CVAVR не могу запустить программу вопрос-ответ через uart.

не получается  прерывание ISR,

#include <mega8.h>    
ISR (USART_RXC_vect) { int b;  b = UDR; 
  // Это подпрограмма обработки прерывания
Не работает функция ISR (USART_RXC_vect)  - выдает ошибку. чего-то требует .  

остальная часть программы - без ошибок. может какую-то библиотеку надо?

В папке CVAVR не нашел файла interrupt.h  Как делается прерывание по uart ?

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


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

Откуда же нам знать. Может вы их не разрешили глобально и/или конкретно для rx.

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


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

у меня получалось пересылать символы из МК в ПК и обратно из ПК в МК. там все нормально, без прерываний. а тут хочу получить ответ на посыл. и без прерывания не получается.   вот код программы

Скрытый текст

 

#include <mega8.h> 
#include <delay.h>    
// Не работает функция ISR (USART_RXC_vect)  т.к. нет библиотеки interrupt.h ?
ISR (USART_RXC_vect) { int b;            // Подпрограмма обработки прерывания
b = UDR;                                            // Выполняем обработку принятого байта
if (b=='1')   {                                         // Если приняли "1"
USART_Transmit('R');                           // Отправляем букву "R"
USART_Transmit(0x0d);                       // переход в начало строки
USART_Transmit(0x0a); }                    // переход на новую строку
else                                                   // Если нет
if (b=='2') {                                          // Если приняли "2"
USART_Transmit('L');                          // Отправляем букву "L"
USART_Transmit(0x0d);                      // переход в начало строки
USART_Transmit(0x0a); }  }                // переход на новую строку

void USART_Init( unsigned int ubrr) {   // Инициализация модуля USART
UBRRH = (unsigned char)(ubrr>>8);    // Задаем скорость работы USART 
UBRRL = (unsigned char)ubrr;
UCSRB=(1<<RXEN)|( 1<<TXEN);       // Разрешаем прием и передачу по USART 
UCSRB |= (1<<RXCIE);
UCSRC=0x86;                                                    // Инициализация именно для ATmega8
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); }
void USART_Transmit( unsigned char data ) {       // Функция отправки данных
while ( !(UCSRA & (1<<UDRE)) );                       // Ожидание опустошения буфера приема
UDR = data; }                                                    // Начало передачи данных                    

int main(void)  { USART_Init (8);     // главная программа
USART_Transmit('O');                   // Передаем при включении
USART_Transmit('k');                   // сообщение "Ok!", что свидетельствует
USART_Transmit('!');                   // о правильно работе программы
USART_Transmit(0x0d);             // переход в начало строки
USART_Transmit(0x0a);            // переход на новую строку
sei();                                      // разрешаем глобально прерывания
while(1) { )                             // вечный цикл.  тут пусто
 }   }      

 

чего не хватает?    вот говорит

Error:  function argument #1 of type 'flash unsigned char [10]' is incompatible with required parameter of type 'unsigned char []'
 

Изменено пользователем Igor-13

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


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

Какая версия компилятора?

Изменено пользователем солар

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


Ссылка на сообщение
Поделиться на других сайтах
ARV    230
18 часов назад, Igor-13 сказал:

ISR (USART_RXC_vect)

Это не для CVAvr, это для AVR-GCC. Это надо заменить на соответствующий обработчик прерывания, определенный по правилам CVavr, иначе не заработает.

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


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

да, понял. спасибо.  Оказалось, надо делать так -

interrupt [USART_RXC]  void usart_rx_isr(void) {обработчик прерывания} 
А потом, в майне вставить

#asm("sei") // разрешаем глобально прерывания.

И все заработало, вопрос-ответ,  все норм.  Только не выводит "Ок!" почему-то. 

CVAvr версия 2.05.0

Изменено пользователем Igor-13

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Никитос
      Всем привет. Сделал устройство с семисегментным индикатором,но понадобилось снимаемые значения еще и на пк выводить. А порт UART'а занят,связь нужна симплексная,т.е. в одну сторону. Можно ли как-то вывести инфу на порт В0?Или проще задействовать реализацию железа,а индикатор перебросить на другие порты?
    • Автор: Atreides
      Добрый день. Мне требуется реализовать программный юарт на атмеге16. Он нужен для того, чтобы принятые по нему данные отправить на аппаратный юарт. В интернете нашел примеры кода, но понять его мне трудно. Прошу вас словами в общих чертах объяснить принцип реализации программного юарта. Буду рад примерам, которые, на ваш взгляд, являются наиболее простыми и понятными. Заранее спасибо.
    • Автор: dim3740
      Читается порт UART на микроконтроллере Atmega. Применяю типовой алгоритм, но аппаратно вижу ошибки. Что неверное, или отчего они могут быть?
       
      unsigned char rx_buffer[128]; //накопительный буфер unsigned char indexW; // индекс при наполнении накопительного буфера unsigned char Count; // счетчик накопительного буфера unsigned char indexR; // индекс при опорожнении накопительного буфера int Max; // максимум до переполнения char tempMessage; // временная переменная int main(void) {    Max=100; // пробовал разные    while(1)     {         _delay_us(40); // пробовал от 10 мкс до мс                          if (Count > 0)          {             tempMessage=rx_bufferR[indexR];                                        MesComplite(tempMessage); //тут анализ каждого считанного байта. Это занимает время                                          //поэтому и нужен буфер                          indexR++;                            if (indexR>=Max)  indexR=0;  //Значение Max одинаковое для чтения и записи. Может разные проба?                          cli();  // для надежности запрет прерывания             Count--;             sei(); //разрешение                          if (Count>=Max)  Count=0;                  }              } } ISR(USART_RXC_vect)   {     if (UCSRA & (1<<7))        {                  rx_buffer[indexW]=UDR;                  indexW++;                    if (indexW>=Max)  indexW=0;                   Count++;                  if (Count>Max)  Count=0;           } }
      1. Задержка нужна в цикле whole? У меня при нуле еще больше ошибок(((
      2. Размеры 128 и 100 методом подбора?
      3. Инкременты ++ ставить после команды?
      4. запреты прерывания нужны?
      5. If делаю на "равенство и больше". Верно?
      6. Какие есть иные методы повышения надежности, кроме повторной отправки при ошибке?
    • Автор: Дмитрий Кузьмичёв
      Доброго времени суток!!! Я столкнулся с тем, что не работает UART и не реагирует на AT-команды. Пробовал с 2-мя переходниками: CH340 и FT232RL, тот, что в Arduino. Пробовал и менять контакты RX-TX местами, и скорость менял (должно быть 9600 бод) - терминал молчит от слова совсем. CH340 просто светит своим индикатором приема, а FT232 моргнет при включении и все. Должно выводиться в терминале при включении ON, но не выводится ничего и никак не реагирует. Проверял и обвязкой, и упрощенным подключением (4 провода - 2 питания и 2 UART), и напряжение то 3.3 делал, то 3.7, то питал с аккумулятора - молчание. Подумал, что UART нагнулся из-за моих кривых рук - махнулся с другом на свежую, проверить UART, но результат тот же, полагаю, что в моем даже и не сдох. А сам модуль работает, не считая злосчатного UART. Так в чем может быть проблема? 
  • Сообщения

    • @Крашер , ну Вы совсем, что ли ребёнок?
      Аккумуляторщик? В военном билете и в наши годы - Вы что, меня, за идиота, что ли, принимаете? Простите, но я Вас как-то вновь не понимаю. Учтём, что нет пока ответа на поставленный вопрос : Уже вследствие этого я могу смело делать выводы о компетенции..
    • Автор идеи @avv_rem , а переработка моя. Я практик а не теоретик, нашёл решение практически. Работает ну и слава богу! Ток ограничивает, от КЗ защищает  красота!
    • Везет! А у мну латр лежит, а провода нет))) Ничего не намотать))
    • Запустил второй канал, пока нагрузка с трансформатора резики. Общее потребеление околок 104мА. Выходные 23,5мА   на 211в Ua, секта 106в . Второй канал чуть отличается в режимах, 24мА на 210в и секта 110в. На второй канал R20 больше на 500 ом воткнул, но думаю пофиг. Выведу балансом громкость. Мучаю держу уже минут 40..50, на БП радиатор нагрелся до 44С, вроде дальше не идет. Поставил пока маленький трансформатор на переменку накал. 6.16 на лампах. Чуть больше двух спичечных коробков. Анодный так же поискал по меньше, с кулак. Оба греются до 31С. Фон не слушал, сегодня лень уже подключать динамики. Да, надо что то с регуляторами по входу приделать, уровень громкости то надо регулировать. Выходные от ЕЛ34, каждый с два кулака. Как то маленьким усилитель у меня явно не выходит.  ПС оос не подключал.   
    • Ну, м-да! Конечно, не студент.
      Извините. (Но вопросы остались).
    • А, не выпытывать эту схему в песочнице, но самому привести и"на пальцах" показать ошибочность мнения многих...    Наиболее близкое пояснение. "Качели" там возникают в любом случае. Особенно - при большой разнице основных характеристик аккумуляторов.  Хоть при бездействии, хоть при разряде-заряде. 
    • Нет, строго научно обосновать не могу. Возможно, можно сослаться на упомянутого вами Киргофа. Но понимаю, что мирно спать аккумуляторы с разным внутренним сопротивлением, хоть и заряженные до одинакового напряжения, не будут.