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

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

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

Сообщение Z_h_e »

Да, эхо.

Частота кварца практически не важна, при правильном настроенном делителе UART.

Раз в протеусе работает, то мешается какая-нибудь досадная мелочь. Большинство затыков из-за каких-то тупых мелочей.

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

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

Сообщение LEX38RUS »

В обвязке только уарт и диод. В протеусе у меня тоже все работает.
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

Z_h_e писал(а):Пример может быть таким и я не имею ввиду, что у Вас так. Включился светодиод, просадил питание которое было на грани, и после этого МК не может принять данные корректно.

Совершенно верно Ватсон :) Именно из за просадки по питанию данные корректно не отправлялись :) Благодарю.
Просто устройство было подключено через хаб.
Сделал эхо для проверки отправленных данных

Спойлер

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

#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];
char string_data[] = "";
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++);
}

int main(void) {
   DDRC = 0b00000001;
   sei();
   UARTInit();
   while(1) {
      received = UARTGet();
      if (strcmp("1ON2", rx_data) == 0)
      {
         
         PORTC = 0b00000001;
      }
      if (strcmp("1OF2", rx_data) == 0)
      {
         PORTC = 0b00000000;
      }

   }
}

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'))
   {
      rx_flag = 1;
      Send_Uart_Str(rx_data);
      return;
   }
   if(++indexchar >= RX_BUFFER_SIZE)
   {
      
      indexchar = 0;
   }
}
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

Приветствую всех. Есть ещё пару вопросов, думаю тему создавать не нужно.
Вообщем с передачей байтов по уарт я разобрался. Теперь встал вопрос организовать два шим для регулирования нагревателями. То есть с программы на ПК я хочу управлять нагревательными элементами от 0 до 100%, прочитал все что касается шим но так и не понял какие можно использовать? На атмеге 16 их вроде как четыре. Возможно ли задействовать 4 и 18 контакт в качестве шим регулятора и использовать их в предыдущем коде? Или предыдущий код тоже переписывать нужно будет. И ни совсем понятно про прерывания.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Для нагревателей можно и программный ШИМ создать. Это не световые приборы, где частота играет важную роль. Тут частота может быть любой и от неё не будет ничего зависеть.
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

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

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

Сообщение oleg110592 »

какая мощность нагревателей и какое напряжение необходимо нагревателям?
Есть пару способов управления мощностью нагревателей с помощью симистора:
http://www.microchip.com.ru/Support/dimm.html
Еще можно управлять мощностью нагревателей с помощью полевого транзистора - тут как раз шим, имхо пригодится
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

Мощность 3 киловатта, управление хотел делать через симистор и оптопару.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

LEX38RUS писал(а):Программный шим я так понимаю с использованием таймеров?
Без разницы с помощью чего. Нужно в программе иметь периодически-повторяемое место с постоянным временем повторения. А таймер это будет, или просто delay - по барабану.
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

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

Добавлено after 4 minutes 25 seconds:
Почитал про реализацию программного шим, это не подойдёт. Ведь он по достижению какого либо числа будет сразу подовать единичку на порт, а нужно чтоб скажем от нуля и до 1. Думаю программный шим тут не подойдёт. Или ошибаюсь?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

LEX38RUS писал(а):а нужно чтоб скажем от нуля и до 1
Это как ?

Почитайте что такое вообще ШИМ. Тогда поймёте, что аппаратный ничем не отличается от программного. Разве что последний не сделаешь высокочастотным, который аппаратными средствами реализуется без проблем.
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

Ещё раз почитал. Признаю, не прав. Идём курить справку по реализации программного шим. Спасибо. Почитал еще что на простой атмеге даже реализовывают программным методом управление яркостью 760 светодиодов :-D
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Управление нагревателем на переменке, лучше всего реализовывать с помощью пропуска периодов. Это тоже своего рода ШИМ, с шагом скважности в 20 мс.
Для этого необходимо будет задействовать внешнее прерывание - для синхронизации с сетью и детектирования перехода через ноль.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Не вижу особого смысла в синхронизации при регулировании с пропуском периодов. А вот тиристор лучше взять с детектором нуля. На мощной нагрузке, при таком методе, будут заметно моргать лампы накаливания, возможно у соседей тоже (от кобеляции будет зависеть :) ).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

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

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

Сообщение ARV »

Аlex писал(а):Управление нагревателем на переменке, лучше всего реализовывать с помощью пропуска периодов
мне кажется, это уже следует считать устаревшей догмой. данная рекомендация сформировалась во времена всеобщего аналогового телевидения и радиовещания, тем более когда радиовещание было в СВ и ДВ диапазонах и практически всегда с АМ. именно по этой причине все эти теле-радиоприборы были предельно чувствительны к помехам переключения тиристоров.

сейчас же принципы связи и вещания поменялись, источники питания сейчас импульсные и не реагируют на такие помехи, и в целом только какие-то особо нежные (наверное, медицинские или научные) приборы могут сохранить чувствительность к этим помехам. просто же в быту никто никогда и не заметит этих помех.

а вот метод пропуска полупериодов как раз наоборот, может давать весьма заметные пульсации питающей сети, которые крайне неприятны, а для ламп накаливания еще и вредны. теле-радиоприемникам же будет все равно, если они современные, конечно.

Z_h_e писал(а):На мощной нагрузке, при таком методе, будут заметно моргать лампы накаливания
вот-вот. а еще этот метод может вносить низкочастотные составляющие тока сети, близкие к постоянке, что может намагничивать трансформаторы со всеми вытекающими... в моей практике подобное было: сделали несколько терморегуляторов промышленных печей и вдруг стали перегреваться трансформаторы питания блоков... схалявили - не сделали запаса по железу, они и насыщались... сейчас эта проблема скорее виртуальная, но все-таки...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

Как много нюансов. Спасибо, что просветили в этом. :)
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
LEX38RUS
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн янв 11, 2016 20:35:49

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

Сообщение LEX38RUS »

На счёт этого все понятно. Программа и так будет отдельная. Просто интересно что лучше обмен по rs232 или по hid (как там его правильно) v-usb вроде.
Ответить

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