UART. Вопросы и ответы 01. #9
Labels
No Label
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: ICS-Microprocessor-2020/Display_Avr_3#9
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что значат эти includes, зачем каждая нужна?
на сколько можно увеличить и уменьшить размер буфера? Могу ли увеличить размер на 1, на 2, уменьшить на 1, 2, 10? Почему?
Warning
Какие параметры функции? Что вообще ждать от функции? Нужна ли она вообще?
Что значат эти includes, зачем каждая нужна?
#include <stdio.h> подключаем заголовочный файл, который содержит функции ввода-вывода.
#include <stdlib.h> заголовок (заголовочный файл) стандартной библиотеки общего назначения языка Си,
который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие.
#include "circular_buf.h" подключаем заголовочный файл кольцевого буфера.
На сколько можно увеличить и уменьшить размер буфера? Могу ли увеличить размер на 1, на 2, уменьшить на 1, 2, 10? Почему?
В зависимости от передаваемого пакета чуть больше
максимума приема, размер должен быть степенью двойки.
2, 4, 8, 16, 32, 64, 128, 256.
По функции UART_receive, я добавил более подробные комментарии к коду. Она будет использоваться в главной программе для получения данных из буфера приема. Пока мы еще решаем вопрос с объединением вместе всех модулей.
Зачем в заголовочнике объявлять экземпляры структуры? Каждый раз, когда вы напишите #include "uart.h" у вас будет объявлены переменные (экземпляры).
Вижу
usartTxBuffer
встречается по коду только 3 раза. Оно вообще зачем?Вы вообще собрали проект? Для проверки достаточно собрать и запустить проект только со своим модулем UART. Например сделать main, который будет отправлять все полученные байты обратно. Это очень простая и эффективная проверка работы любого интерфейса.
Вам тут таймаут на приём вообще зачем? Чего вы ждёте? Вам нужно получить все байты из UART и отдать их по первому требованию быстро без тормозов.
Учел ваши замечания, убрал таймаут и поправил метод приема. Собрал проект с тестированием методов приема и отправки в Atmel с debug, ошибок не увидел.
Прошу указывать коммит, где вы учли замечания. Так понимаю это
5c4e2be040
В итоге теперь отправка стала синхронная: пока отправляются байты мы ничем другим заниматься не можем. У нас только входящие байты в UART поступают во входящий кольцевой буфер.
Нужно было доделать отправку данных из исходящего кольцевого буфера. То есть укладываем данные в кольцевой буфер на отправку, включаем прерывание блока UART на прерывание и уже в прерывании достаём следующий байт из кольцевого буфера. Так реализован Serial в Arduino. Вам осталось написать обработчик прерывания и немного
UART_send
.Хорошо, сейчас займусь этим
458b145297
поправил UART_send и настроил обработчик69e8412315
Забыл вчера бит TXCIE0 разрешения прерывания при передаче установить в 1, поправилВерное направление. Одно но. При таком подходе вы как только выйдите из
USART_TX_vect
при пустом буфере тут же попадёте вUSART_TX_vect
.TXCIE0
именно разрешает прерывание по завершению передачи. При пустом буфере надо запретить. А разрешить когда - вам на подумать.https://onlinedocs.microchip.com/pr/GUID-85E9B23E-BE9C-47EA-AED9-E8719EA2F7AF-en-US-2/GUID-73CB1E14-0C43-4A15-AA94-3D8AF6E17C6A.html
e999651e09
исправил этот момент