Проблема с инициализацией UART #17

Open
opened 2024-02-27 17:08:05 +00:00 by stud126165 · 13 comments
Owner
#include "client.h"
#include "protocol.h"
#include "uart.h"
#include "MyLCD.h"

struct Client hdlc;

void setup() {
  init_lcd();
  init_hdlc_client(&hdlc, 200);
  char str[] = "wait for connect... ";
  strncpy(wait.topLine, str, sizeof(str));
  wait.value1 = 1.0f;
  wait.value2 = 20.0f;
  wait.value3 = 300.0f;
  UART_init();
}

void loop() {
    print_lcd(&wait);
}

Загружая этот код в arduino, экран ничего не выводит. Когда комментируем UART_init(), arduino выводит на экран значения.
Код UART_init():

void UART_init(void) {
  UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1<<TXCIE0) | (1 << UDRIE0); // прерывание по приему и передаче
  UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
  UBRR0H = 0;
  UBRR0L = 103;
}

Также файл uart имеет расширение .cpp для сборки на arduino ide. При билде через Atmel была та же самая проблема. В чем может быть проблема?

``` #include "client.h" #include "protocol.h" #include "uart.h" #include "MyLCD.h" struct Client hdlc; void setup() { init_lcd(); init_hdlc_client(&hdlc, 200); char str[] = "wait for connect... "; strncpy(wait.topLine, str, sizeof(str)); wait.value1 = 1.0f; wait.value2 = 20.0f; wait.value3 = 300.0f; UART_init(); } void loop() { print_lcd(&wait); } ``` Загружая этот код в arduino, экран ничего не выводит. Когда комментируем UART_init(), arduino выводит на экран значения. Код UART_init(): ``` void UART_init(void) { UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1<<TXCIE0) | (1 << UDRIE0); // прерывание по приему и передаче UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); UBRR0H = 0; UBRR0L = 103; } ``` Также файл uart имеет расширение .cpp для сборки на arduino ide. При билде через Atmel была та же самая проблема. В чем может быть проблема?
Owner

В Atmel-проекте нет никаких void setup() и void loop()

Про ардуину не скажу наверняка.

В Atmel-проекте нет никаких `void setup()` и `void loop()` Про ардуину не скажу наверняка.
Author
Owner

Проблему с инициализацией решили. Почему не выводятся данные в serial monitor для проверки UART_send? Модуль UART:
https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/branch/uart/UART/uart.c

Проблему с инициализацией решили. Почему не выводятся данные в serial monitor для проверки UART_send? Модуль UART: https://git.vyatsu.ru/ICS-Microprocessor-2020/Display_Avr_3/src/branch/uart/UART/uart.c
Owner

не понял про clear_buffer. Кстати. У вас в ПЗ у каждого будут представлены алгоритмы, по которым вы пишите код.

не понял про `clear_buffer`. Кстати. У вас в ПЗ у каждого будут представлены алгоритмы, по которым вы пишите код.
Author
Owner

Но буфер же сам не очистится после приема или передачи

Но буфер же сам не очистится после приема или передачи
Owner

https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8C%D1%86%D0%B5%D0%B2%D0%BE%D0%B9_%D0%B1%D1%83%D1%84%D0%B5%D1%80 с анимацией

Читаем теорию.

Кто очищает буфер при отправке? Как именно?

Кто очищает буфер при приёме? Как именно?

Вот на эти вопросы ответить.

https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8C%D1%86%D0%B5%D0%B2%D0%BE%D0%B9_%D0%B1%D1%83%D1%84%D0%B5%D1%80 с [анимацией](https://en.wikipedia.org/wiki/Circular_buffer) Читаем теорию. Кто очищает буфер при отправке? Как именно? Кто очищает буфер при приёме? Как именно? Вот на эти вопросы ответить.
Author
Owner

Получается, что при заполненном буфере, просто перезаписываются старые данные и нет необходимости в нашем случае очищать вручную?

Получается, что при заполненном буфере, просто перезаписываются старые данные и нет необходимости в нашем случае очищать вручную?
Owner

Тот, кто делал UART и ЦБ, должен ответить на вопросы здесь.

Кто очищает буфер при отправке? Как именно?

Кто очищает буфер при приёме? Как именно?

Тот, кто делал UART и ЦБ, должен ответить на вопросы здесь. > Кто очищает буфер при отправке? Как именно? > > Кто очищает буфер при приёме? Как именно?
Author
Owner

Функция clear_buffer() очищает буфер, устанавливая значения buf_head и buf_tail в 0. Она вызывается в функции UART_send после того, как все данные из массива data были добавлены в буфер передачи, и в функции UART_receive после успешного чтения данных из буфера приема.

Функция clear_buffer() очищает буфер, устанавливая значения buf_head и buf_tail в 0. Она вызывается в функции UART_send после того, как все данные из массива data были добавлены в буфер передачи, и в функции UART_receive после успешного чтения данных из буфера приема.
Author
Owner

Я и есть тот человек, кто разрабатывал UART

Я и есть тот человек, кто разрабатывал UART
Owner

Нарисуйте временную диаграмму изменения значений головы и хвоста каждого из двух циклических буферов

Нарисуйте временную диаграмму изменения значений головы и хвоста каждого из двух циклических буферов
Author
Owner

отрисовка этих диаграмм сейчас как то поможет решить ошибку?

отрисовка этих диаграмм сейчас как то поможет решить ошибку?
Author
Owner

Нарисовал диаграмму изменения значений

Нарисовал диаграмму изменения значений
28 KiB
Owner

отрисовка этих диаграмм сейчас как то поможет решить ошибку?

Да. Потому что явно не хватает понимания того, что в какой момент происходит.

Нарисовал диаграмму изменения значений

Совсем не про то. У вас проблема отправить данные. Опустошение буфера должно происходить только в прерывании. Один байт достали из буфера и закинули его на отправку.

Вопрос! В случае, если в буфере есть 2 байта, сколько времени пройдёт между извлечением первого байта в буфере и второго? Модуль UART настроен так, как вы его настроили.

> отрисовка этих диаграмм сейчас как то поможет решить ошибку? Да. Потому что явно не хватает понимания того, что в какой момент происходит. > Нарисовал диаграмму изменения значений Совсем не про то. У вас проблема отправить данные. Опустошение буфера должно происходить только в прерывании. Один байт достали из буфера и закинули его на отправку. Вопрос! В случае, если в буфере есть 2 байта, сколько времени пройдёт между извлечением первого байта в буфере и второго? Модуль UART настроен так, как вы его настроили.
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: ICS-Microprocessor-2020/Display_Avr_3#17
No description provided.