Например TDA7294

Форум РадиоКот • Просмотр темы - Автоматический выход из ждущего режима uart_receive();
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 18, 2024 17:55:06

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 31 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Вт авг 09, 2022 15:52:47 
Родился

Зарегистрирован: Чт мар 18, 2021 16:47:20
Сообщений: 11
Рейтинг сообщения: 0
Код:
 #define F_CPU 16000000UL          // Тактовая частота микроконтроллера
#define BAUD 9600UL                                 // Скоорость приемо-передачи для консоли
#define MYUBRR (F_CPU/(BAUD*16)-1)        // Согласно заданной скорости подсчитываем значение для регистра UBRR

 

void uart_init(void)                         // Объявление функции UART для скорости приемо передачи
 {
    UBRR0H=(MYUBRR>>8);               // Старшие 8 бит
    UBRR0L=MYUBRR;                                      // Младшие 8 бит)
    UCSR0B|=(1<<TXEN0)|(1<<RXEN0);                   // Бити разрешения приемо-передачи
    UCSR0C|=(1<<UCSZ00)|(1<<UCSZ01);                   // Устанавливем формат 8 бит данных
 }
 
 void uart_transmit(unsigned char data)                 // Объявление функции трансляции (вывода на экран)
 {
    while (!(UCSR0A & (1<<UDRE0)));                // Ожидаем когда очистится буфер передачи
   
   UDR0 = data;                                        // Помещаем данные в буфер, начинаем передачу
 }


 unsigned char uart_receive(void)
 {
   
   while(!(UCSR0A & (1<<RXC0)));                      // Ожидаем пока данные будут получены
   return UDR0;                               // Возврат 8-bit данные
                                         
 }

void USART_Flush(void){
   unsigned char dummy;
   while (UCSR0A & (1<<RXC0)) dummy = UDR0;
}


Добрый день! уважаемые форумчане, есть такая необходимость, как выход из ждущего режима например с = uart_receive(); по приему символа чтоб при получение некоторых данных на другие пины от датчика или от другого МК, выходил на короткое время пока не выводится некоторые символы с помощью функции uart_transmit(data[i]); в основном цикле из массива данных а потом сразу же после вывода символов данных, чтоб вернулся в режим готовности для приема символа с клавиатуры с = uart_receive();.
Что только не пробовал но никак не могу заставить UNO автоматически чтоб выходил из ждущего режима при получении данных для выполнения в основном цикле по выводу на консоль, данные будут выводиться на консоль Putty, как можно эту задачу организовать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 08:40:34 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
Изучайте прерывания и организовывайте обмен по-человечески, без "тупых" задержек.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 09:51:56 
Открыл глаза

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Чт ноя 26, 2020 13:19:49
Сообщений: 50
Рейтинг сообщения: 0
Цитата:
unsigned char uart_receive(void)
{

while(!(UCSR0A & (1<<RXC0))); // Ожидаем пока данные будут получены
return UDR0; // Возврат 8-bit данные

}


Не проще ли организовать прерывание по приёму, чтоб не ждать флаг получения данных?

Добавлено after 20 minutes 49 seconds:
Код:
void USART1_IRQHandler(void)
{
  switch (регистр флагов прерывний(или событий))
  case (флаг принятых данных):
    принимаем данные;
    break; (или retutn данные)
  case (флаг передачи данных):
    делае чего нить после передачи данных (или не делаем);
    break;
  case (флаг пустого ругистра Rx/Tx):
    делае чего нить после (или не делаем);
    break;
  ...
  break;
}

Что-то вроде этого должно быть, нужно только правильно настроить прерывания по UART

Добавлено after 1 minute 20 seconds:
Сорят на АшиПки :)))


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 09:57:07 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
void USART1_IRQHandler(void)

Что-то вроде этого должно быть, нужно только правильно настроить прерывания по UART

Это же AVR, там у UART отдельный вектор на каждое событие


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 11:15:53 
Открыл глаза

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Чт ноя 26, 2020 13:19:49
Сообщений: 50
Рейтинг сообщения: 0
Цитата:
Это же AVR, там у UART отдельный вектор на каждое событие


Тогда вообще париться не нужно. Берёшь книжку Естевтеева про микроконтроллеры AVR (Если не ошибаюсь в фамилии автора) и читаешь что нужно делать. Там всё расписано до мелочей. Ну или наконец прочесть даташит. :))

Добавлено after 1 minute 19 seconds:
Кстати автор не написал каким МК пользуется...


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 11:49:46 
Друг Кота
Аватар пользователя

Карма: 13
Рейтинг сообщений: 355
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Сообщений: 4279
Откуда: Воронеж
Рейтинг сообщения: 0
AlexandrRa, ардуиной. Думаю, мега328.

_________________
"Привет!" - соврал он.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 15:02:54 
Родился

Зарегистрирован: Чт мар 18, 2021 16:47:20
Сообщений: 11
Рейтинг сообщения: 0
Цитата:
Это же AVR, там у UART отдельный вектор на каждое событие


Тогда вообще париться не нужно. Берёшь книжку Естевтеева про микроконтроллеры AVR (Если не ошибаюсь в фамилии автора) и читаешь что нужно делать. Там всё расписано до мелочей. Ну или наконец прочесть даташит. :))

Добавлено after 1 minute 19 seconds:
Кстати автор не написал каким МК пользуется...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 15:19:36 
Мучитель микросхем

Карма: 1
Рейтинг сообщений: 22
Зарегистрирован: Вт фев 09, 2010 17:52:26
Сообщений: 417
Рейтинг сообщения: 0
Код:


 unsigned char uart_receive(void)
 {
   
   while(!(UCSR0A & (1<<RXC0)));                      // Ожидаем пока данные будут получены
   return UDR0;                               // Возврат 8-bit данные
                                         
 }


Добрый день! уважаемые форумчане, есть такая необходимость, как выход из ждущего режима например с = uart_receive();


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


Код:
 unsigned char uart_receive(void)
 {
   
   if ((UCSR0A & (1<<RXC0)))
       {             
          // Проверяем без ожидания, если данные получены, выставляем флаг ==1, если не получены сбрасываем флаг.
          bait_prochitan = 1;
        }else
        {
           bait_prichitan = 0; //нового байта нет
         }
         return bait_prochitan;
}

там где было с = uart_receive();
меняете на
if ( uart_receive() )
{
 c =  UDR0;
}

                                         
 }


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 15:33:18 
Открыл глаза

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Чт ноя 26, 2020 13:19:49
Сообщений: 50
Рейтинг сообщения: 0
Цитата:
Это надо самому придумать, конечно если нет желания использовать прерывания.
Введите еще одну переменную, в которой будет хранится информация приняли ли байт.


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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 16:04:25 
Родился

Зарегистрирован: Чт мар 18, 2021 16:47:20
Сообщений: 11
Рейтинг сообщения: 0
Как на этом сайте вообще цитировать выделенный кусок текста и на этот косок текста ответить?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 16:29:20 
Друг Кота
Аватар пользователя

Карма: 13
Рейтинг сообщений: 355
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Сообщений: 4279
Откуда: Воронеж
Рейтинг сообщения: 0
Sulik, надо нажать "редактор", а уже дальше выделять нужный текст и нажимать на цитирование.

_________________
"Привет!" - соврал он.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Ср авг 10, 2022 16:36:19 
Родился

Зарегистрирован: Чт мар 18, 2021 16:47:20
Сообщений: 11
Рейтинг сообщения: 0
>TEHb< писал(а):
надо нажать "редактор", а уже дальше выделять нужный текст и нажимать на цитирование.

Спасибо! на этом сайте чуть по другому эта система работает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 03:07:37 
Родился

Зарегистрирован: Чт мар 18, 2021 16:47:20
Сообщений: 11
Рейтинг сообщения: 0
В общем пришлось запихнуть циклы for по выводу данных в прерывания, по другому никак не получилось.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 10:07:21 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2803
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18075
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
AlexandrRa писал(а):
Берёшь книжку Естевтеева про микроконтроллеры AVR (Если не ошибаюсь в фамилии автора)
если не помнишь фамилию, то прежде, чем её писать, нужно сначала её найти, а не писать хаотический набор букв.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 11:32:37 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
В общем пришлось запихнуть циклы for по выводу данных в прерывания, по другому никак не получилось.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 13:24:00 
Открыл глаза

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Чт ноя 26, 2020 13:19:49
Сообщений: 50
Рейтинг сообщения: 0
Цитата:
Если я правильно понял написанное, вы только что подложили себе здоровенную мину.
:shock: :kill:
Согласен! Код в прерываниях должен быть минимальным. Я например в большинстве случаев там флаг сработки обычно ставлю. И НИКАКИХ ЦИКЛОВ В ПРЕРЫВАНИЯХ И ТЕМБОЛЕЕ ЗАДЕРЖЕК!!! Потом кода нужно, смотрю флаг и выполняю от этого флага всё что нужно (или не выполняю :)) ).

Добавлено after 6 minutes 16 seconds:
Код:
union Flags
{
    uint8_t TIM2_Flag: 1;       // сработка прерывания Timer2
    uint8_t TIM1_Flag: 1;       // сработка прерывания Timer1
    unit8_t  EXTI3_Flag: 1;    // сработка прерывания EXTI3
    uint8_t : 5;                // Резерв
} Status;

......

if (Status.EXTI3_Flag)
{
  ......
  Status.EXTI3_Flag= 0;
}

void EXTI3_IRQHandler(void)
{
  Status.EXTI3_Flag= 1;
/* Сброс флагов прерывания */
  EXTI_ClearITPendingBit(EXTI_Line3);
}



Что-то вроде этого...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 13:49:01 
Родился

Зарегистрирован: Чт мар 18, 2021 16:47:20
Сообщений: 11
Рейтинг сообщения: 0
Starichok51 писал(а):
Какие еще циклы в прерываниях?!

например таких несколько штук
Код:
for(y = 0; data[y] != '\0'; y++){
            uart_transmit(data[y]);
        }

без каких либо задержек в delay, пока что работает без проблем.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 14:41:32 
Открыл глаза

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Чт ноя 26, 2020 13:19:49
Сообщений: 50
Рейтинг сообщения: 0
Лучше сделать
Код:
  if (!Flag_data)  // Проверка на начало приёма пакета
  {
   uart_transmit(data[0]);  // в первом байте размер пакета
   Flag_data=1;
  }
  else  if (data[0] != y)  // если весь пакет не принят
  {
    y++;  // счётчик байт
    uart_transmit(data[y]);  // запись следующего байта data[y]
    return;
  }
  Flag_data=0;


Добавлено after 4 minutes 34 seconds:
СТОП!!! uart_transmit(data[y]) это же передача. Тогда годится. У меня uart_transmit нужно заменить на uart_receive :)) :)) :))

Добавлено after 2 minutes 48 seconds:
Но лучше "0" пакет не закрывать. Лучше так.
Код:
for(y = 0; y <= SizePack; y++){
            uart_transmit(data[y]);
        }


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 15:04:51 
Родился

Зарегистрирован: Чт мар 18, 2021 16:47:20
Сообщений: 11
Рейтинг сообщения: 0
Sulik писал(а):
У меня uart_transmit нужно заменить на uart_receive

Вот проверь например в протеусе, уверен не заработает как надо если там будет присутствовать например char c = uart_receive();

Добавлено after 15 minutes 39 seconds:
Код:
char c;
uint8_t flag = 0;

ISR(PCINT0_vect){
   if(PINB & (1 << PB0)){
      flag = 1;
   }else{
      flag = 0;
   }
}

int main(){
   interrupt_init();
   sei();
   
   while(1){
      if(flag == 1){
         for(y = 0; data[y] != '\0'; y++){
            uart_transmit(data[y]);
         }
      }
      c = uart_receive();
   }
   
}


Вот короткий пример кода, вот тут задача такая, как только приходить прерывание и переменная flag равно 1, то надо отвязаться от c = uart_receive(); тогда сразу же заработает условие с циклом for.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Автоматический выход из ждущего режима uart_receive();
СообщениеДобавлено: Чт авг 11, 2022 16:10:08 
Открыл глаза

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Чт ноя 26, 2020 13:19:49
Сообщений: 50
Рейтинг сообщения: 0
Код:
char c;
uint8_t flag = 0;
uint8_t Size_data = 12; // например передаём 12 байт

ISR(PCINT0_vect){
   if(PINB & (1 << PB0)) flag = 1; // Разрешение передачи данных
}

int main(){
   interrupt_init();
   sei();
   
   while(1){
      if (flag){
         for (y = 0; y < Size_data ; y++){
            uart_transmit(data[y]);
         }
       flag = 0; // Данные переданы
      }
      c = uart_receive();
   }
   
}


так правильней. И не закрывай посылку значением данных в передаче. Отучайся от этого.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y