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. Так в чем может быть проблема? 
  • Сообщения

    • @colorad Я скачал программу Digital Osciloscope последней версии. Если честно - не впечатлила. Во-первых у меня встроенный аудиочип, но он на самом деле не такой фиговый, в микрофоне, по входу я могу поставить дискретизацию 96000 Гц 24 Бит максимум, а на выходе 192 кГц 24 Бит. Да, может быть реальная дискретизация немного меньше, ведь на таких частотах работает не каждая внешняя аудиокарта, но я когда-то читал про этот аудиочип - писали не такой он и паршивый, точно способен работать выше чем на 44.1 кГц. Так вот, я поставил максимальную частоту дискретизации на микрофон и на аудиовыход, но эта  программа упорно работает на 44.1 кГц . Нигде в настройках я не нашел как поменять частоту дискретизации. Пусть, да, втроенное аудио не будет выдавать корректно 96 и 192 кГц. Но это будет лучше 44.1 - однако она так не настраивается, что не радует... И даже на 44.1 кГц она работает паршиво. Я подал на вход микрофона синусоиду с выхода усилителя через резистор не помню какого номинала. Частота синусоиды - 16.5 Гц. Амплитуда мультиметром - 35 мВ. И вот что она показывает (см. скриншот) - дикие зигзаги. А ведь сигнал 16.5 Гц. Меньше у меня мобильный телефон не генерирует. Я его использую как генератор синусоиды. Увеличение амплитуды до 200 мВ - такие же зигзаги только в другом масштабе. При 44.1 кГц можно было бы хотя бы до 100 Гц более-менее гладно показывать, так просто нереально ничео понять, клиппинг там или нет. Расстраивает она конечно, ожидал большего все таки, даже на 44.1 кГц. Подскажите, есть ли какое-то продвинутое максимально ПО, программный осцилограф, который может работать выше чем на 44.1 кГц, если аудиокарта позволяет и не рисует такие зигзаги а сглаживает их, и считает быстрее. У меня ЦП был загружен на 15%. У меня интел четыреядерный. Оно могло бы грузить его хоть на 100%, ресурсы есть, оно их не использует... И рисует загогулины.
    • 5126,20 - это если без каких либо своих запасов. Да и текстолит у Вас вряд ли весь ушел. Это если на коммерческую основу, тогда ещё и припой считать надо...
    • Мой предыдущий пост неверен - мои заблуждения не имеют место, были проблемы с микрокапом. Моделировал в микрокапе чтобы разобраться полностью в схеме, но сначала с плохими моделями, была дефектная библиотека моделей, поменял на нормальные модели и схема в микрокапе заработала.  Вообще, если кто-то столкнется с заменой микросборки, то эту схему можно смело собирать, нужно только в эмиттер VT3 поставить резистор 750-1000 Ом, емкость c4 увеличить до 470 нФ, резисторы в делителе  R12, R13 8.2 кОм и 13 кОм соответственно - нужно для более полного диапазона регулирования. Транзисторы я использовал MMBT3904 и MMBT3906 в SOT23, такие были. Заработала сразу. Печатную плату сборки развел свою, но чуть больше чем сборка по размерам (22х18), в 17х15 вписать не удалось. Если у кого-то есть вопросы - пишите в личку или на емэйл alexguy gaw tut.by. Спасибо Еlectr0nics за тему, привод снова в работе!
    • Формула успеха - вставай пораньше, работай допоздна, найди нефть. Если долго сидеть на берегу, то рано или поздно мимо тебя проплывёт яхта твоего, разбогатевшего за эти годы, врага. — Вот скажите, почему внутренние органы не чешутся? — Это у Вас вопрос юридический или анатомический?
    • Микрометр хоть рабочий..?

      И стрелка почему-то не на нуле.. Точность измерений тогда не волновала..?

       
    • да , все правильно. А что смущает? при 20мА нагрузке на R1 выделится всего 0,9Вт мощности , у вас реле столько же потреблять будет .