Свежие обсуждения
Микроконтроллеры

MSSP(IIC) и USART

1 3 13

AHTOXA:
Наш с chav1961
А это Ваш коллективный проект?

тоже правильный
В теории-то, насколько я понял, подход - одинаковый. А вот с реализацией...
К сожалению, мне трудно судить, поскольку Си, тем более для АВРов, не люблю с детства.
Не знаю, какой смысл Вы вкладываете в понятие "дуплексный", но мой UART также может одновременно с приёмом вести и передачу. А ещё, при скорости 31250, он успевал пересылать данные в аппаратный UART, используя буффер (так как скорости - разные). Ну, и конечно, моргать светодиодами.

Так выложите её
Так, вроде, выше ссылку давал.
Дополнительная информация - у меня на сайте, в "Электронике" (Вы уж там, вроде, всё должны наизусть знать ).

 

Gregory: К сожалению, мне трудно судить, поскольку Си, тем более для АВРов

Вовсе и не для АВРов

Gregory: Так, вроде, выше ссылку давал.

Какую ссылку? Нет выше никакой ссылки.

Gregory: Дополнительная информация - у меня на сайте, в "Электронике"

Ну это уже неуважение какое-то. Дайте прямой линк на исходник, неужели трудно?

 

AHTOXA:
Какую ссылку?
Gregory
В 9-м номере журнала, за этот год, есть статья "Com to MIDI, или преобразователь скорости UART"

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

 

Это не ссылка, это название статьи в каком-то журнале... Вы слишком высокого мнения о моих телепатических способностях
...
Посмотрел исходник. Честно говоря, у меня такое чувство, что если выкинуть зачем-то напичканные там NOP-ы, то можно обойтись и без кварца на 24МГц

Не увидел там ни многократного семплирования, ни ещё каких-либо отличий Вашего "ПРАВИЛЬНОГО построения UART" от моего обычного

 

AHTOXA, NOP'ы как-раз служат для "правильного" построения. Они выравнивают все ветви программы, и передача/приём битов происходит строго через АБСОЛЮТНО РАВНЫЕ промежутки времени. Именно это ставилось главной задачей, а не оптимизация кода.
Без 24МГц, увы, не обойтись (для данных скоростей, разумеется).
По этой же причине повторная выборка присутствует только для стартового бита. Этот момент я уже оговаривал, и сказал, что мы им пренебрегаем (линии связи - идеальные ). Если же скорости гораздо меньше, и позволяют делать аж 8 выборок (как в Вашем случае), то почему бы этим не воспользоваться?
Кстати, в в/у статье всё это расписанно.

P.S.: А автор темы так куда-то и исчез, толком не сказав, что ему надо?

 

Апсолютно равные промежутки времени обеспечивает таймер. Безо всяких nop-ов. Всё же гляньте мой пример, там, имхо, всё достаточно прозрачно.
Просто приём/передача отрабатываются в таймерном прерывании поочерёдно.
А выборок, кстати, там не 8, а всего 4
ЗЫ. Если у Вас одна выборка на бит, то приём - не работает.

 

AHTOXA:
гляньте мой пример
Говорю же: "Не понимаю я СИ". Поэтому ориентируюсь на рисунок chav1961. А там 8 тиков (а не выборок, которых там по одной).
Абсолютно равные промежутки времени между НАЧАЛАМИ ОБРАБОТКИ ПРЕРЫВАНИЯ от таймера не могут быть по определению, и происходят с разницей до 2-х машинных циклов. Не верите, проверьте сами. Могу даже, если хотите, поискать тему, где это обсуждалось.
Допустим, что этого нет, и вход в обработку происходит строго через равные промежутки времени. Но я-то добивался (и добился) не равных промежутков между ВХОДОМ В ОБРАБОТКУ, а между ФОРМИРОВАНИЕМ ПЕРЕДАВАЕМЫХ и СЧИТЫВАНИЕМ ПРИНИМАЕМЫХ битов. Надеюсь, разница ясна? Сомневаюсь, что это возможно реализовать на СИ.

приём - не работает
Не знаю, что Вы имели ввиду, но у меня всё собрано, проверено и работает (есть фотографии). Статье-то, уже скоро год будет (с момента написАния, разумеется )

 

Gregory: Но я-то добивался (и добился) не равных промежутков между ВХОДОМ В ОБРАБОТКУ, а между ФОРМИРОВАНИЕМ ПЕРЕДАВАЕМЫХ и СЧИТЫВАНИЕМ ПРИНИМАЕМЫХ битов

Гы, а какая связь между ними? Это совершенно независимые процессы. Видимо, у Вас там просто эхо ловится, поэтому приём и работает. Но это ненадёжно, случись небольшая задержка в МИДИ-устройстве - и Вы всё прозеваете.

Gregory: Сомневаюсь, что это возможно реализовать на СИ.

На Си можно реализовать всё, просто надо приложить голову Объясняю словами:
1. Делаем прерывание в 8 раз чаще чем скорость порта (погодите говорить, что не хватит скорости, её хватит);
2. В прерывании счётчик от 0 до 7.
3. При значении счётчика = 0 - занимаемся передачей. (задержка от входа в прерывание до изменения состояния ноги постоянная, джиттера нет (практически), скорость соблюдена)
4. При чётных значениях счётчика - занимаемся приёмом. У нас выходит 4 раза на бит, вполне достаточно для достоверного отсчёта сначала полубита (чтобы попасть после спада на середину бита), а затем и битов (на следующие середины).

5. Ещё 3 значения счётчика свободны, можно сделать ещё 3 передатчика, или ещё что-нибудь полезное

Почему мы успеем? Потому что каждый раз мы занимаемся чем-нибудь одним, и максимальное время в прерывании значительно меньше. И не надо никаких nop-ов и прочих танцев с бубнами

Почему это решение лучше? Потому что:
а) Это решение универсально;
б) Приём и передача независимы.

 

Я тут посчитал на калькуляторе...
Для PIC при кварце 24МГц и скорости порта 31 250 при моём алгоритме выходит 24 команды на прерывание... Негусто, но можно
АВР рулит

 

AHTOXA:
у Вас там просто эхо ловится
Давайте без оскорблений. Если я не понимаю СИ, мне не зазорно сказать про это. А МИДИ, за 15 лет общения, маленько освоил. Никаких эхов. Что надо, то, и ловится, и передаётся. И допустимая точность рассчитана и указана. И пользуюсь данным девайсом уже год.

Это совершенно независимые процессы.
Гы! Вы всё-таки никак меня понять не хотите. Даже не знаю, как ещё объяснить. Глядим на в/у рисунок. Я добивался равных промежутков МЕЖДУ СТРЕЛОЧКАМИ, как при приёме, так и при передаче. Так понятно?

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

не надо никаких nop-ов
Да что Вы привязались к этим нопам? Они там, в основном, как-раз для сокращения ВЫПОЛНЯЕМЫХ команд, при вычисляемых переходах. Что бы не производить дополнительные вычисления с аккумулятором, а сразу суммировать с PCL. Ну занимают они чуть больше програмной памяти. Ну и что? У нас её в избытке.

Приём и передача независимы
Как же они независимы, если используют одно и то же прерывание?

Это решение универсально
И тут оно не универсальнее моего. Вобще-то уже выше говорил, что подход одинаковый.
Короче. Давайте исходник на АСМе (ну, или хотя бы хекс), будем смотреть. А то, что-то, какой-то разговор глухово со слепым.