Заголовок сообщения: Автоматический выход из ждущего режима 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 данные
Добрый день! уважаемые форумчане, есть такая необходимость, как выход из ждущего режима например с = uart_receive(); по приему символа чтоб при получение некоторых данных на другие пины от датчика или от другого МК, выходил на короткое время пока не выводится некоторые символы с помощью функции uart_transmit(data[i]); в основном цикле из массива данных а потом сразу же после вывода символов данных, чтоб вернулся в режим готовности для приема символа с клавиатуры с = uart_receive();. Что только не пробовал но никак не могу заставить UNO автоматически чтоб выходил из ждущего режима при получении данных для выполнения в основном цикле по выводу на консоль, данные будут выводиться на консоль Putty, как можно эту задачу организовать?
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: Сорят на АшиПки
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Это же AVR, там у UART отдельный вектор на каждое событие
Тогда вообще париться не нужно. Берёшь книжку Естевтеева про микроконтроллеры AVR (Если не ошибаюсь в фамилии автора) и читаешь что нужно делать. Там всё расписано до мелочей. Ну или наконец прочесть даташит.
Добавлено after 1 minute 19 seconds: Кстати автор не написал каким МК пользуется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Это же AVR, там у UART отдельный вектор на каждое событие
Тогда вообще париться не нужно. Берёшь книжку Естевтеева про микроконтроллеры AVR (Если не ошибаюсь в фамилии автора) и читаешь что нужно делать. Там всё расписано до мелочей. Ну или наконец прочесть даташит.
Добавлено after 1 minute 19 seconds: Кстати автор не написал каким МК пользуется...
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; }
Это надо самому придумать, конечно если нет желания использовать прерывания. Введите еще одну переменную, в которой будет хранится информация приняли ли байт.
Не советую так делать, есть возможность прочитать не тот байт или потерять вообще всю посылку. Т. к. чтение данных будет только один раз за цикл. А если данные приходят несколько раз за цикл и неизвестно когда по времени? Очень легко пропустить посылку.
Если я правильно понял написанное, вы только что подложили себе здоровенную мину.
Согласен! Код в прерываниях должен быть минимальным. Я например в большинстве случаев там флаг сработки обычно ставлю. И НИКАКИХ ЦИКЛОВ В ПРЕРЫВАНИЯХ И ТЕМБОЛЕЕ ЗАДЕРЖЕК!!! Потом кода нужно, смотрю флаг и выполняю от этого флага всё что нужно (или не выполняю ).
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]); }
Вот короткий пример кода, вот тут задача такая, как только приходить прерывание и переменная flag равно 1, то надо отвязаться от c = uart_receive(); тогда сразу же заработает условие с циклом for.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения