RS232LEX38RUS писал(а):что лучше обмен по rs232 или по hid
Передача строки по UART
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Передача строки по UART
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Передача строки по UART
еще предложу обратить внимание на RS-485
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Передача строки по UART
UART гораздо проще в реализации, но соответствующие разъемы не везде есть. Впрочем, почти везде можно поставить переходник. USB (в том числе, HID и virtual-UART) в реализации сложнее, и сложнее подключить к чему-то кроме компа, например, к самодельному выносному терминалу.
Re: Передача строки по UART
Правильно ли я пробую реализовать шим
Вот скрин с осцилографа.
Спойлер
Код: Выделить всё
#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 скачиваний
Re: Передача строки по UART
Возможно ли OCR0 присваивать переменную типа float и если да то подскажите как.
-
Alkul
- Держит паяльник хвостом
- Сообщения: 933
- Зарегистрирован: Ср апр 13, 2011 11:09:20
- Откуда: Екатеринбург
Re: Передача строки по UART
LEX38RUS писал(а):Возможно ли OCR0 присваивать переменную типа float
Невозможно.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Передача строки по UART
ответ не верный. можно. но надо понимать, каков будет результат.Alkul писал(а):Невозможно
в переменную OCR0 в результате такого присваивания попадет младший байт целой части результата преобразования float в int- эти грибы есть можно?
- да. но только один раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Передача строки по UART
А я ждал когда же ARV появится с подобным постом на ответ Alkul.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Передача строки по UART
а я ждал, когда же вы среагируете. наши ожидания оправдались, не так ли?Z_h_e писал(а):А я ждал когда же ARV появится с подобным постом
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Передача строки по UART
COKPOWEHEU писал(а):UART гораздо проще в реализации, но соответствующие разъемы не везде есть.
Век живи - век учись : не подозревал, что для UART существуют специальные разъемы
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Передача строки по UART
Я думаю, что COKPOWEHEU хотел сказать RS-232, вернее даже COM-порт.
Re: Передача строки по UART
Цель передачи значения типа float чтоб сделать регулировку от 0 до 100%
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Передача строки по UART
как из этой постановки задачи вытекает необходимость float? 100 - это целое число!LEX38RUS писал(а):Цель передачи значения типа float чтоб сделать регулировку от 0 до 100%
OCR0 - это байт. в байте предельное значение - 255. т.к. за 100% всегда принимается ПОЛНЫЙ объем, то 100% - это 255. следовательно, каждая единичка в OCR0 соответствует 0,39%. получается, что у вас и так ДРОБНОЕ число процентов может находиться в OCR0, хотя оперируете вы с ЦЕЛЫМИ. такой вот нюансик.
в школе проценты изучали? удивительно, что подобные вопросы возникают...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Передача строки по UART
Спойлер
ARV писал(а): удивительно, что подобные вопросы возникают...
Удивительно, что они еще пока возникают, тогда не все потеряно. А у большинства нонешнего уже вообще нет вопросов.
-
Alkul
- Держит паяльник хвостом
- Сообщения: 933
- Зарегистрирован: Ср апр 13, 2011 11:09:20
- Откуда: Екатеринбург
Re: Передача строки по UART
ARV писал(а):ответ не верный. можно. но надо понимать, каков будет результат.Alkul писал(а):Невозможно
в переменную OCR0 в результате такого присваивания попадет младший байт целой части результата преобразования float в int
А теперь внимание, вопрос - (младший байт целой части преобразования float в int == float) ? Если да, то я многого не знаю про float. А если нет, то мой ответ на вопрос правильный. Именно float в OCR0 занести невозможно. Если Вы с этим не согласны, то докажите мне, что один байт - это float и есть.
Если я заношу переменную куда-то, это означает, что она, по-крайней мере, может быть оттуда без искажения считана. В противном случае эта переменная не занеслась туда, куда я хотел её занести.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Передача строки по UART
ага. я ни слова не говорил про значение float, я говорил о результате преобразования "по умолчанию" типов данных, т.е. float в intAlkul писал(а):А теперь внимание, вопрос
Число 3.14 после приведения к int превратится в 3, а младший байт этого int-а попадет в байтовую переменную.
Число 3.14e-2 после преобразования в int превратится в 0.
Число 314.123 после преобраования превратится в 314, и младший байт 0x3A попадет в байт.
что не так?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Передача строки по UART
А вот вопрос в тему пропуска полупериодов и проч.: какая частота ШИМ предпочтительней, для бытовых целей, с точки зрения ресурса компонентов, нагрузки на проводку итд? 50Гц, единицы Гц, десятые доли Гц? 1,5 кВт тэн управляется симистором ВТ139-600 через драйвер МОС3063 (с контролем "0"). Сейчас длительность периода 5 секунд с заполнением 0, 20, 40, 60, 80, 100%
Хорошо ли это?
Хорошо ли это?
Последний раз редактировалось maxitch Ср янв 25, 2017 01:41:08, всего редактировалось 1 раз.
Re: Передача строки по UART
С процентами у меня все нормально. Просто в программе на ПК думал делать так, нажимаю кнопку + это в программе будет отоброжаться как 1 из 100 % следовательно программа отсылает команду увеличить мощность на 1% в мк получается переменную же нужно увеличить на 2.55? Или я не верный путь выбрал?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Передача строки по UART
может без флоатов обойтись типа
2.55=255/100=51/20
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
да делайте с float-ами, компилятор сам все "округлит" - я выше вам написал, что будет в разных случаях. просто float сожрет память, но если вы на "просторном" МК делаете свои поделки - какая разница?!LEX38RUS писал(а):переменную же нужно увеличить на 2.55
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!

