C

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

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

Всем привет. 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 

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

0

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


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

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

 

0

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


Ссылка на сообщение
Поделиться на других сайтах
В ‎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

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


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

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

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

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

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

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

0

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


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

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

0

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


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

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

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

 

#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
0

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


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

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

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

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


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

ISR (USART_RXC_vect)

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

0

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


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

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

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

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

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

CVAvr версия 2.05.0

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

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


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

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

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

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

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


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

Войти

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


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

  • Сообщения

    • Что все на коп пошли? ))  r3 поставил переменник тх регулирует от 8мА до 22 мА ...чуйка на монету 15 см хотя баланс сводил по разному (3ч просидел) сводил от 30мВ и више толку 0 ... Также  RX подключал по разному но всегда 8228Hz 0 mv хотя мд работает.... Также надеюсь ктонибуть ответит ..
    • Токовое зеркало меньше влияет на характеристики унч чем повторитель в кун, собирал 2 варианта и отслушивал разница не в пользу тз. Если ми говорим от чего больше профита.
    • А при чём здесь тема, которая где-то у вас? Здесь, на Паяльнике, эта тема о конкретном усилителе - о "торчибасе" - с 1-го поста надо было читать, а не с куска, выдернутого откуда-то из середины.  Вообще-то я не для того выкладывал эту схему(хотя это всего -лишь картинка из симулятора), чтобы кто-то её уродовал в силу своего недопонимания её нюансов. Если не понимаешь того, что даёт токовое зеркало, и нет под рукой "букваря", карандаша и клочка бумаги, чтобы посчитать - спроси  
    • кренки просадку под нагрузкой будут давать, и унч в голодании будет, кно нибуть видел чтоби в оконечник стаб ставили, всегда идет прямо с диодов вся мощ питания ни виходние транзюки или микри
    • Хотел бы получить квалифицированный совет по поводу процесса и результатов моих измерений формы цифрового сигнала. Имееются значительные базовые знания цифровой электроники но практически нулевой опыт. Есть некое цифровое(?) устройство, для которого мне хотелось бы задокументировать форму сигнала. Есть дешевый китайский тестер.
      Вначале все довольно ясно, 


      но когда начинаю менять масштаб оси времени, то выглядит так, как будто, во-первых, импульсы идут пачками

      , а потом, что эти "пачки" чередуются полярностью. 

      потом бОльшими пачками:



      И напоследок пачки как бы чередуются с одиночными сигналами не совсем прямоугольной формы (последние 4 фото имеют один и тот же масштаб времени)




      Да и начальные импульсы строго говоря не совсем прямоугольные - верхняя часть имеет спад -- вначале было подозрение что это просто проблема с осциллографом, но потом вспомнил, что у него есть калибровочный сигнал, который не имел такой проблемы. Так как я никогда не использовал осциллограф, то полагаю, что может, что не учитываю. По идее, этот прибор должен выдавать "модифицированный прямоугольный сигнал 100Гц и длительностью сигнала 2мсек". Но мне видятся некие несоответствия для разных масштабов времени:
      почему для <= 10мсек все сигналы двуполярные а дла 20мсек чередуются полярностью?
      почему для 20мсек пачки просто чередуются, а для 50мсек группируются в бОльшие пачки одной полярности?
      почему ширина пачек для 0.2сек и для 0.5сек практически одинаковая?
      похоже ли что для некоторых 0.5сек фото пачки действительно чередуются с одиночными импульсами более растянутыми? Фактически на основании того что я вижу это не совсем цифровой сигнал, кроме того, видны множественные огрехи на разных фото. Либо
      проблема с очень простым осциллографом, либо с процессом измерения, либо (ощущение, что) сам прибор очень простой и не обеспечивает 
      качественного сигнала. А может, дело просто в том, что сигналы, организованные в пачки разной полярности, нельзя увидеть при большем разрешении времени из-за синхронизации осциллографа, установленной по уровню, но этот уровень одной полярности, так что осциллограф просто "пропускает" отрицательные пачки?
  • Похожие публикации

    • Автор: tagir000
      Имею проводной сканер штрих кодов Argox AS-8000 rs232, хочу переделать его в беспроводной с помощью модулей HC-05 и HC-06. Если я не ошибаюсь, то достаточно разрезать провод сканера пополам, найти линии Rx и Tx и к ним подпаять модули, которые будут работать в сквозном режиме, передавая по блутуз дальше, то что приходит к ним по линии Tx. Помогите мне пожалуйста, в этом деле новичок я. Сами модули я уже настроил: master-модуль сам соединяется со slave-модулем.
    • Автор: VisualNT
      Доброго времени суток!
      Может кто-нибудь объяснить, в чём смысл и преимущества использования специализированных программаторов для STM32 типа ST-Link и клонов, работающих по интерфейсам SWD/JTAG, если записать флеш можно прямо по UART/ISP или быстрее по USB (при его наличии)?
      Я так понимаю, что программаторы, кроме записи в память, ещё умеют выполнять отладку - и это их единственное отличие.
      А если отладка не нужна? Вернее, часто ли она используется при написании каких-нибудь маленьких прикладных программ типа реле времени? Я собираюсь развести свою печатную плату для STM32F107, а потом хочется поэкспериментировать с STM32F407ZGT - в них в обоих есть USB интерфейс, они оба есть в списке поддерживаемых USB DFU (согласно AN 3156). Но на форуме я прочитал, что пока все сидят на дискавери, в основном из-за того, что в ней есть встроенный программатор ST-LINK прямо на плате, но почему его наличие так важно и не заменяется возможностью программирования по UART/ISP или по USB? Есть ли какое-либо отличие кроме возможности отладки? Может быть, как и в случае со фьюзами у AVR, у STM32 есть какие-то функции/настройки, которые можно использовать/изменять только программатором ST-LINK?
      И да, разве скорость программирования по USB будет существенно ниже, чем по тому же JTAG или SWD?
      Заранее спасибо за ответы! Заранее предупрежу, чот с микроконтроллерами я раньше работал, но вот от ST что-то более-менее делал только на STM32F030...
    • 3
      Автор: Гость Maxim
      Доброго времени суток.
      Я скачал проэкт (http://alex-exe.ru/radio/avr/avr-uart/), который работает на Proteus, но не работает в реальности. Использую Terminal, atmega16, PL-2303HX. Подсоединяю RXD (переходник) с TXD (микроконтроллер) и наоборот.
      Подскажите, что я не так делаю и как правильно надо подсоединять микроконтроллер с компьютером?
    • 1
      Автор: Гость Твой друг
      Вопрос. Почему не выполняется на atmega328 команды? Тестировал в протеусе на частоте 8 мгц (в настройках проекта 20 мгц, но думаю на это не так сильно должно влиять).
      На микроконтроллере запущен аппаратный таймер - работает нормально. Через юарт (настроен только TXD) всё время шлёт: 011111111101111111110... Но сам код не хочет выполняться:
      while (1) { delay_ms(0.4); // выполнилось при первом цикле PORTD.6=1; // выполнилось при первом цикле delay_ms(0.4); // выполнилось при первом цикле putchar(PORTC.0+PORTC.1*2); // заморозилось и далее не выполняется, но аппаратный таймер работает, юарт флудит (011111111101111111110...) // функцию putchar нашёл в интернете PORTD.6=0; } PORTD.6 - настроен на выход
      PORTC.0 и PORTC.1 настроены на вход. Включены подтягивающие резисторы.
      P.S. Проект сделан в CodeVisionAVR с использованием генератора кода.
    • E
      Автор: Гость Kolianich
      Всем добра! Подскажите, если на плате оставить для пошивки 4 провода: 5В, GND, RX, TX можно ли будет отлаживать Atmega48 и прошивать его не как обычно с помощью (SPI)? Опыта прошивки пока нет, но планирую прошивать с помощью avrdude.