Каков буфер аппаратного UART?

Тема в разделе "Микроконтроллеры AVR", создана пользователем ostrov, 23 мар 2016.

  1. ostrov

    ostrov Гуру

    В частности на Atmega328 и Atmega8. В разных источниках цифры разные.
     
  2. AlexU

    AlexU Гуру

    В обоих мк по два байта.
     
  3. Alex19

    Alex19 Гуру

    Лучше сразу читать даташит на процессор Atmega328 - http://www.atmel.com/images/atmel-8...pa-168a-168pa-328-328p_datasheet_complete.pdf. Atmega8 - http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_summary.pdf.

    Для Atmega328.
    UART0 со страницы 170.

    Подробнее о регистре данных стр. 191.

    Регистр данных UDRn, по сути там 2 регистра (RXB, TXB). Когда мы читаем данные из регистра UDRn данные берутся из RXB, когда записываем в UDRn данные попадают в TXB. Получается 1 байт на прием и 1 байт на получение. В сумме 2 байта.

    Для Atmega8.
    UART со страницы 127.

    Подробнее о регистре данных стр. 148, там аналогично.

    Надеюсь ни чего не напутал, удачи!
     
    Последнее редактирование: 23 мар 2016
  4. AlexU

    AlexU Гуру

    Некоторое уточнение: один байт на передачу, два байта на приём.

    PS: в посте выше имел ввиду приёмные буферы.
     
  5. Alex19

    Alex19 Гуру

    Видимо, что-то пропустил, не подскажите, где можно глянуть в pdf об этом?
    Заранее благодарен.
     
  6. ostrov

    ostrov Гуру

    То есть без прерывания на прием при выполнении других заданий поймать весь пакет практически нереально.
     
  7. AlexU

    AlexU Гуру

    В контексте доки с оф.сайта atmel.com на мк ATmega328.
    Чёткой фразы о размере буферов нет, но есть несколько фраз в разделе 19.2 (общие сведения о USART):
    про передающий буфер
    и про приёмный буффер
    .
    Так же на диаграмме "Figure 19-1.USART Block Diagram" передающий буфер обозначен одним прямоугольником, а приёмный двумя. И наконец фраза из раздела 19.7.4 (ошибки USART)
    -- два символа == два байта. Правда символы могут быть 9ти битовыми, но про то как хранится старший бит у второго байта информации не нашёл. Но это не суть важно -- главное, что как то храниться.

    Смотря что подразумевать под пакетом...
     
    Alex19 нравится это.
  8. Alex19

    Alex19 Гуру

    Большое спасибо за разъяснение.

    Ни когда не знал о существовании 2 байта в буфере не прием, хотя работаю не первый день с UART когда-то разобрался и забыл.

    Меня это тоже смутило.

    Возможно без прерываний не получится, нужно понимать, что за пакет и какая загрузка. Если бы мне требовалась сделать что-то аналогичное, просто сделал на прерываниях.

    Можете оттолкнуться от этого примера - http://forum.amperka.ru/threads/Реализация-uart-rs-485.6791/, http://forum.amperka.ru/threads/Проблемы-с-кодировкой-uart-на-СИ-в-arduino-ide-1-6-7.7513/#post-66460

    Если, что-то будет не понятно, постараюсь пояснить. Или посмотреть в сети, примеров и описаний в том числе на русском - тьма.
     
    Последнее редактирование: 23 мар 2016
  9. Limoney

    Limoney Гик

    Ошибка
    1 байт на передачу
    1 байт на прием
    При этом если буфер приемника не пуст и пришел новый байт,
    пришедший байт теряется, но устанавливается флаг в регистре, сообщающий о потере байта.
    Так же флаг устанавливается при приеме 9 бит.
     
    Последнее редактирование: 24 мар 2016
  10. Onkel

    Onkel Гуру

    буфер на 1, просто пока идет прием последнего байта принятый хранится в UDR, и пока прием не закончился вынуть принимый байт, ясное дело, нельзя, но буфер для принимаемого есть. Так что в реале - 1.
     
  11. AlexU

    AlexU Гуру

    Если верить оф.доке, Вы оба ошибаетесь. Приёмный буфер содержит два байта, а так же ещё есть сдвиговый регистр, который принимает следующий символ. Приёмный буфер организован по типу FIFO -- первый пришёл, первый вышел. При чтении регистра UDR считывается первый принятый байт. После чего данные в буфере сдвигаются и регистр UDR указывает уже на второй принятый байт. При приёме 9ти битных данных нужно сначала прочитать старший бит, а потом уже оставшиеся биты из UDR. Потому что после чтения регистра UDR данные в приёмном буфере сдвинуться, и старший бит уже будет для второго символа.

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

    Limoney Гик

    Теперь прочел. Согласен ошибся.
    Разъяснение написано о флаге переполнения DOR
    Флаг устанавливается в 1, если в момент обнаружения нового страт-бита в сдвиговом регистре приемника находится последнее принятое слово, а буфер приемника полон (содержит два байта).
    Флаг сбрасывается при пересылке принятых данных из сдвигового регистра приемника в буфер UDR.