Передача строки по UART

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передача строки по UART

Сообщение ARV »

LEX38RUS писал(а):что лучше обмен по rs232 или по hid
RS232
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Передача строки по UART

Сообщение oleg110592 »

еще предложу обратить внимание на RS-485
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Передача строки по UART

Сообщение COKPOWEHEU »

UART гораздо проще в реализации, но соответствующие разъемы не везде есть. Впрочем, почти везде можно поставить переходник. USB (в том числе, HID и virtual-UART) в реализации сложнее, и сложнее подключить к чему-то кроме компа, например, к самодельному выносному терминалу.
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

Re: Передача строки по UART

Сообщение LEX38RUS »

Правильно ли я пробую реализовать шим
Спойлер

Код: Выделить всё

#include <avr/io.h>
#define F_CPU 8000000UL //8MHz
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>

#define RX_BUFFER_SIZE 5
uint8_t received;
char rx_data [5];
volatile uint8_t rx_flag = 0;
volatile uint8_t indexchar = 0;

void UARTInit(void) {
   UBRRH = 0;
   UBRRL = 51; //baud rate 9600
   UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8 bit, 1 stop bit
}

void UARTSend(uint8_t data) {
   while(!(UCSRA & (1<<UDRE)));
   UDR = data;
}

unsigned char UARTGet() {
   while(!rx_flag);
   rx_flag = 0;
   indexchar = 0;
   rx_data[4] = '\0';
   return 1;
}

void Send_Uart_Str(char *s)
{
   while (*s != 0) UARTSend(*s++);
}
void send_Uart(unsigned char c)//   Отправка байта
{
   while(!(UCSRA&(1<<UDRE)))   //   Устанавливается, когда регистр свободен
   {}
   UDR = c;
}
void send_int_Uart(unsigned int c)//    Отправка числа от 0000 до 9999
{
   unsigned char temp;
   c=c%10000;
   temp=c/100;
   send_Uart(temp/10+'0');
   send_Uart(temp%10+'0');
   temp=c%100;;
   send_Uart(temp/10+'0');
   send_Uart(temp%10+'0');
}

void InitPWM()
{
   TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
   DDRB|=(1<<PB3);
}

void SetPWMOutput(uint8_t duty)
{
   OCR0=duty;
}

void Wait()
{
 _delay_loop_2(3200);
}

uint8_t brightness = 0;
int main(void) {

InitPWM();
   DDRC = 0b00000001;
   sei();
   UARTInit();
   while(1) {
      received = UARTGet();
      if (strcmp("1ON2", rx_data) == 0)
      {
                  SetPWMOutput(100);          
      }
      if (strcmp("1OF2", rx_data) == 0)
      {
                  SetPWMOutput(0);
      }

   }
}

ISR(USART_RXC_vect) {
   rx_data[indexchar] = UDR;
   if (rx_data[0] !='1')
   {
      indexchar = 0;
      return;
   }
   if ((rx_data[0]=='1') && (rx_data[indexchar]=='2'))
   {
      Send_Uart_Str(rx_data);
      rx_flag = 1;
      return;
   }
   if(++indexchar >= RX_BUFFER_SIZE)
   {
      
      indexchar = 0;
   }
}

Вот скрин с осцилографа.
Вложения
PWM.jpg
(59.01 КБ) 385 скачиваний
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

Re: Передача строки по UART

Сообщение LEX38RUS »

Возможно ли OCR0 присваивать переменную типа float и если да то подскажите как.
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: Передача строки по UART

Сообщение Alkul »

LEX38RUS писал(а):Возможно ли OCR0 присваивать переменную типа float

Невозможно.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передача строки по UART

Сообщение ARV »

Alkul писал(а):Невозможно
ответ не верный. можно. но надо понимать, каков будет результат.
- эти грибы есть можно?
- да. но только один раз.
в переменную OCR0 в результате такого присваивания попадет младший байт целой части результата преобразования float в int
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Передача строки по UART

Сообщение Z_h_e »

А я ждал когда же ARV появится с подобным постом на ответ Alkul.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передача строки по UART

Сообщение ARV »

Z_h_e писал(а):А я ждал когда же ARV появится с подобным постом
а я ждал, когда же вы среагируете. наши ожидания оправдались, не так ли?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Передача строки по UART

Сообщение Jack_A »

COKPOWEHEU писал(а):UART гораздо проще в реализации, но соответствующие разъемы не везде есть.

Век живи - век учись : не подозревал, что для UART существуют специальные разъемы :( Я всегда был уверен, что UART заканчивается на пинах Rx - Tx микроконтроллера, а дальше делай с ним что хошь - сопрягай через разъемы, развязывай токовой петлей, модулируй радиоканал. Проблема UART не в разъемах, а в том, что он заточен для внутри- и меж-блочных связей, и без соответствующей дополнительной обвязки для связи дальше 1..2 метров не годен.
Изображение
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Передача строки по UART

Сообщение Z_h_e »

Я думаю, что COKPOWEHEU хотел сказать RS-232, вернее даже COM-порт.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

Re: Передача строки по UART

Сообщение LEX38RUS »

Цель передачи значения типа float чтоб сделать регулировку от 0 до 100%
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передача строки по UART

Сообщение ARV »

LEX38RUS писал(а):Цель передачи значения типа float чтоб сделать регулировку от 0 до 100%
как из этой постановки задачи вытекает необходимость float? 100 - это целое число!

OCR0 - это байт. в байте предельное значение - 255. т.к. за 100% всегда принимается ПОЛНЫЙ объем, то 100% - это 255. следовательно, каждая единичка в OCR0 соответствует 0,39%. получается, что у вас и так ДРОБНОЕ число процентов может находиться в OCR0, хотя оперируете вы с ЦЕЛЫМИ. такой вот нюансик.

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

Мой уютный бложик... заходите!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Передача строки по UART

Сообщение Jack_A »

Спойлер
ARV писал(а): удивительно, что подобные вопросы возникают...

Удивительно, что они еще пока возникают, тогда не все потеряно. А у большинства нонешнего уже вообще нет вопросов. :(
Изображение
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: Передача строки по UART

Сообщение Alkul »

ARV писал(а):
Alkul писал(а):Невозможно
ответ не верный. можно. но надо понимать, каков будет результат.
в переменную OCR0 в результате такого присваивания попадет младший байт целой части результата преобразования float в int

А теперь внимание, вопрос - (младший байт целой части преобразования float в int == float) ? Если да, то я многого не знаю про float. А если нет, то мой ответ на вопрос правильный. Именно float в OCR0 занести невозможно. Если Вы с этим не согласны, то докажите мне, что один байт - это float и есть.
Если я заношу переменную куда-то, это означает, что она, по-крайней мере, может быть оттуда без искажения считана. В противном случае эта переменная не занеслась туда, куда я хотел её занести.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передача строки по UART

Сообщение ARV »

Alkul писал(а):А теперь внимание, вопрос
ага. я ни слова не говорил про значение float, я говорил о результате преобразования "по умолчанию" типов данных, т.е. float в int

Число 3.14 после приведения к int превратится в 3, а младший байт этого int-а попадет в байтовую переменную.
Число 3.14e-2 после преобразования в int превратится в 0.
Число 314.123 после преобраования превратится в 314, и младший байт 0x3A попадет в байт.

что не так?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
maxitch
Открыл глаза
Сообщения: 47
Зарегистрирован: Пн авг 10, 2015 12:53:00

Re: Передача строки по UART

Сообщение maxitch »

А вот вопрос в тему пропуска полупериодов и проч.: какая частота ШИМ предпочтительней, для бытовых целей, с точки зрения ресурса компонентов, нагрузки на проводку итд? 50Гц, единицы Гц, десятые доли Гц? 1,5 кВт тэн управляется симистором ВТ139-600 через драйвер МОС3063 (с контролем "0"). Сейчас длительность периода 5 секунд с заполнением 0, 20, 40, 60, 80, 100%
Хорошо ли это?
Последний раз редактировалось maxitch Ср янв 25, 2017 01:41:08, всего редактировалось 1 раз.
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

Re: Передача строки по UART

Сообщение LEX38RUS »

С процентами у меня все нормально. Просто в программе на ПК думал делать так, нажимаю кнопку + это в программе будет отоброжаться как 1 из 100 % следовательно программа отсылает команду увеличить мощность на 1% в мк получается переменную же нужно увеличить на 2.55? Или я не верный путь выбрал?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Передача строки по UART

Сообщение oleg110592 »

может без флоатов обойтись типа
2.55=255/100=51/20

Код: Выделить всё

uint8_t power;
uint16_t pwm;

pwm = ((uint16_t)power*51)/20;
OCR0 = (uint8_t)pwm;
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Передача строки по UART

Сообщение ARV »

LEX38RUS писал(а):переменную же нужно увеличить на 2.55
да делайте с float-ами, компилятор сам все "округлит" - я выше вам написал, что будет в разных случаях. просто float сожрет память, но если вы на "просторном" МК делаете свои поделки - какая разница?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»