Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Реализация обмена информацией по USART #10

Closed
3 tasks done
kalaider opened this issue Mar 15, 2017 · 3 comments
Closed
3 tasks done
Assignees

Comments

@kalaider
Copy link
Member

kalaider commented Mar 15, 2017

Данные

Программно-управляемый обмен информацией необходим в целях:

  1. Отладки (ATmega8A не имеет встроенных механизмов отладки)
  2. Передачи команд на микроконтроллер, в частности команд установки коэффициентов ПИД-регулятора

Следует помнить, что USART -- низкоуровневый небуферизированный протокол, основанный на прерываниях. Поэтому необходима реализация входного и выходного буферов. Предлагается использовать циклические буферы.

Задача

  • Инициализировать USART
    • Установить стандартные параметры: Baud Rate - 9600; Frame Format - S+8+1+St
  • Реализовать циклические буферы ввода-вывода
    • Размер буфера должен задаваться
    • Необходима проверка на переполнение буфера
    • Размеры буферов на вход и на выход могут существенно разниться и зависят от объема и скорости передачи данных
    • Работа с буфером в прерываниях должна задействовать возможный минимум процессорного времени
  • Определить бинарный протокол приема-передачи данных (команд)
    • Обеспечить ввод параметров регулятора
    • Обеспечить вывод входных и выходных параметров регулятора, сигнальный вывод
@kalaider
Copy link
Member Author

Программная реализация

См. #14.

Рекомендуемый протокол приема-передачи

Прием

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

K K A1 A2 ... An ~K ~K

Здесь K -- слово начала команды (1 байт), A1 - An -- аргументы (по 1 байту каждый), ~K -- слово завершения команды (1 байт).

Слова K и ~K повторяются дважды. И процессору, и компьютеру известно количество аргументов, необходимое для выполнения команды. Потому данные о количестве аргументов не передаются.

При получении процессором двух одинаковых командных слов он ждет получения всех аргументов и двух слов завершения команды. В случае успеха команда выполняется. В случае неудачи все прочитанные данные игнорируются. Следующий полученный байт интерпретируется как команда. Процесс повторяется.

Поскольку на практике не требуется наличие более чем двух-восьми команд, разумно отвести младшие один-три бита командного слова под тип команды, а первые семь-пять бит под маркер команды (префикс). Тогда вероятность интерпретировать случайное слово как команду падает. Пусть команда имеет префикс из шести бит (например, 101111) и последние два бита отводятся для идентификации команды. Тогда вероятность принять произвольное слово за команду равна 1 / 2^6 = 1.5%. Вероятность принять два последовательных одинаковых слова составляет (1 / 2^8) = 0.4%. А, как следствие, вероятность принять два последовательных слова за командные составляет лишь (1 / 2^6) * (1 / 2^8) = 0.006%.

Завершающее слово может как повторять командное слово, так и быть произвольной функцией он него. Например, все или некоторые биты префикса или целого слова могут быть инвертированы. К реализации предлагается использовать инверсию целого слова.

Возможена реализация более сложных схем передачи информации, в т.ч. с изменением настроек USART Frame Format для передачи не восьми, а девяти бит. В последнем случае девятый бит мог бы однозначно указать на то, что передаваемое слово -- команда, а не аргументы (данные). В первом случае можно передавать не 8 значащих бит, а, например, 4. Остальные отвести под метаданные. Однако это сильно усложняет алгоритм обработки команд и работы с USART.

Поскольку размер пакета примерно равен 8 (четыре управляющих слова и четыре аргумента), целесообразно выбрать формат входного буфера равным примерно 16.

Передача

Для передачи данных (отсчетов АЦП и подтверждения исполнения команд) рекомендуется использовать тот же формат, что и для приема, однако отправлять данные не каждый программный цикл, а каждые a/b * M циклов, где M -- длина памяти, a, b -- некоторые коэффициенты (вообще говоря, задаваемые).

В общем случае размер выходного буфера должен быть порядка 32, поскольку кроме данных с АЦП будут передаваться еще и подтверждения исполнения команд.

Команды и данные

Целесообразно предусмотреть следующие команды:

  1. Приостановка работы и ее возобновление
  2. Включение / отключение остановки при переполнении выходного буфера (ожидание вывода)
  3. Передача коэффициентов ПИД-регулятора и частоты передачи отсчетов

Ответными данными можно отправлять:

  1. Входные значения с каналов АЦП и значение регулирующего сигнала
  2. Подтверждение исполнения команды

@kalaider
Copy link
Member Author

Для реализации указанного требуется также и проверка переполнения выходного буфера.

Вердикт: к реализации.

@kalaider
Copy link
Member Author

Реализована проверка статуса записи в выходной буфер. Можно закрывать до поры до времени.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant