|
Soft UART, 115200 реально ли на С и кваце 7.3728Mhz |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 30)
|
Apr 30 2008, 06:34
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Я вот про это тоже начал подумывать, с одним ещё совладаю а вот 2 как ни прощитывал ничего не выходит. И хочу добавить ещё это как я понимаю всё на АСМЕ, а у меня тут весь проект на С, и еще 2 прерывания по таймеру висят, при отладке такие кони полезли  Насчет перехода согласен, благодарен за подсказку недумал что такие меги есть, но пока такой возможность не придвидется в ближайшее время. Может испльзовать кварц на 20Mhz ???
|
|
|
|
|
Apr 30 2008, 08:05
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Требуется кроме встроенного ещё 2 дополнительных UART, вот и выдумываю. Ну я бы делал так - во первых, перешел на Mega162, там 2 усарта. Теперь надо решить проблему с третьим. Для приема я бы делал так - заводил RXD на какой-нибудь INT по спаду, в прерывании через полбита проверял, старт это или нет и дальше запускал бы SPI, у которого MISO тоже подключен на RXD и предделитель настроен на 1/64 - по прерыванию от SPI имеем байт данных, можно задержаться на бит и проверить стоповый, если уж очень надо. Затем процесс повторяется. Надо только посмотреть, когда точно запускать SPI и какой режим выбрать, чтобы семплы попадали в середину битов. Про передачу можете додумать сами  Кстати, хорошим способом будет использование не INT, а ICP - тогда можно будет по содержимому таймера точно определить место запуска SPI, независимо от времени реакции на прерывание - это актуально для быстрого обмена и наличия других прерываний. Кстати, похоже, что без вложенных прерываний Вам не обойтись.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Apr 30 2008, 09:05
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(west329_ @ Apr 30 2008, 11:49)  С данной ситуации готов пожертвовать работой основной программы и всеми сторонними прерывания, прийдется выключить.
Нащёт увеличения частоты неподумал, наверно 20мг перебор будет. Я тут прикинул может коммутатор на выходе УАРТ порта поставить, какой-то CD4052. еслы не разберусь с софтом Если только передавать надо, тем более не во все сразу, то я вообще никаких проблем не вижу. Кстати, у АВР есть возможность привязывать выходы регистров-защёлок таймера к ногам? (как к примеру у МСП430)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 30 2008, 10:01
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(west329_ @ Apr 30 2008, 12:39)  не моглиб вы обьяснить поподробнее очень просто. берёте выход защёлки. выставляете там стартовый бит (0) засекаете на таймере битовый интервал.(именно на этой защёлке) определяете режим выхода (1/0), соответствующий следующему биту. когда таймер досчитает до конца бита, он сразу выставит на ногу нужный уровень (1/0), а у вас будет время (64 такта) чтобы в прерывании от таймера выставить следующий интервал и режим вывода, соответствующий следующему биту. И так 10 раз. (для одного байта)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 30 2008, 10:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(west329_ @ Apr 30 2008, 10:01)  Пока у меня ничего не выходит, дабы не опозориться не буду всё подробно расписывать, написал только часть TX. Проект работает стабильно только на 9600. Хочу услышать мнения тех кто уже сталкивался с подобным. Возможно ли написать такой софт на С. Работаю на меге16. Ну TX можно и 8 аппаратных сделать ( на один порт). Для 8xRX я бы делал синхронное считывание порта с частотой 250кГц и разбирал бы уже полученные данные. Лучше конечно на асме - тогда зная сколько тактов занимают команды можно обрабатывать два считывания на 125кГц или 3 на 85кГц и т.д. Таймер лучше заводить один раз иначе нахватаете джитера. На С наверно можно написать, просто придётся каждый билд тестить с нуля. На асме есть ещё одно преимущество - можно разделить регистры так, что используемые в прерывании не будут использоваться в основной программе. Работаю на меге48.
|
|
|
|
|
Apr 30 2008, 19:47
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Недавно читал статью Иосифа Каршенбойма "Квадрига Аполлона и микропроцессоры". Там как раз про такой случай написано. Идея в том, что нужно меньше извращаться, а брать либо проц с достаточным количеством УАРТов, либо просто подобрать самый дешовый проц с УАРТом и наставить их столько, сколько надо УАРТов. Соединить их в кучу скажем по SPI, и наслаждаться многоядерностью  . А с программными UART масштабиремость будет совсем плохой, особенно учитывая, что уже сейчас есть обоснованные опасения, что ресурсов может не хватить. А если потом захочется что-то добавить? Конечно если устройство предполагается производить десятками тысяч, то имеет смысл побороться за удешевление, если же нет, то нужно просто сравнить цену mega640 и, скажем, mega162+mega48, выбрать что дешевле, и забыть о прграммных интерфейсах. Это мое ИМХО.
|
|
|
|
|
Sep 22 2008, 10:26
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Вернусь опять к поднятому вопросу по поводу SOFT UARTA.
Ситуация следующая, в основном всё заработало, линию ТХ сделал первую, для начало пришлось как посоветовали на АСМ написать Program Modul, и подключить к основному проекту на С. Скорость вывода решил оставить 57600. Все заработало нормально.
До настоящего времени всё устраивало но потребовалась линия SOFT RX. Восновном решил изначально пойти по тамуже пути, но наткнулся на одну проблему.
При приёме байта информации в HARD реализции UARTA, у меня вызывается прерывание, в котором, (хоть и не желательно так делать) выполняются некоторые действия над принятым байтом, собственно перевожу их ASCII в HEX по таблице. Ничего серьезного НО, SOFT UARTA в той реализации которую я сделал не оставляет совсем свободного времени для работы программы перевода между входящими байта.
Хотелось бы для этих целей задействовать часть свободной аппаратуры контроллера, прерывание таймера или внешние прерывания, чтоб дать поработать контроллеру.
Возможно уже кто-то сталкивался с подомными ситуациями ?
|
|
|
|
|
Sep 22 2008, 12:55
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(SasaVitebsk @ Sep 22 2008, 15:33)  Честно говоря - не совсем понял проблемы. Более точно её опишите.
Если вы вызываете софтовое прерывание одно на 8 прерываний приёма (я так понял) и оно вам мешает, то разрешите в нём прерывание. Соответственно оно размажется на 2-3 прерывания от бита и всё. Только за переменными следите. Принимаем только с одного устройства. Получается так, чтоб принять пакет данных, около 150байт, между приёмами байт входящие байты обрабатываются, это для аппаратного юарта. А софтовый не позволяет так сделать так как после приёма одного байта мне сразу надо прыгать в процедуру приёма следующего байта, чтоб его не пропустить. Хотелось както уйти от неприрывного опроса ноги а перекинуть это дело на таймер или прерывание, или на оба этих средства сразу.
|
|
|
|
|
Sep 22 2008, 16:59
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(west329_ @ Sep 22 2008, 15:55)  Хотелось както уйти от неприрывного опроса ноги а перекинуть это дело на таймер или прерывание, или на оба этих средства сразу. Так тут и обсуждалось таймером!!! Что значит непрерывный??? Обычно делается так. 1) Таймер инициализируется на частоту полинга. Обычно данная частота в 3 раза превышает максим. частоту передачи. 2) Сущ. 2 варианта начала приёма. 1 - по прерыванию фронта (старт бит) запускается таймер, 2 - непрерывный поллинг старт бит определяется по первому нулевому биту. 3) бит мажоритарным методом, либо другим на ваше усмотрение. 4) формируется байт по всем условиям - ST+X...+P. 5) По формированию байта - таже процедура, что и при приёме байта по аппаратному USART. Разницы быть не должно, это позволяет обрабатывать единым образом. Я бы сделал без формирования прер по фронту с 3 выборками на бит, либо с формированием + 1 выборка на бит. Драйвер закончил стандартным кольцевым буфером. Я реализовывал на 7372800 115200. Работало очень устойчиво. Правда в этот момент все остальные прерывания были запрещены.
|
|
|
|
|
Sep 23 2008, 03:25
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 29-12-06
Из: Омск
Пользователь №: 23 999

|
Можете кидаться тапками, но контроллер ИМХО мог бы заниматься чем-нибудь более полезным... Берется какая-нибудь ПЛИС с минимумом внешней обвязки и встроенной флеш-памятью. Клепается на ней хоть 30 УАРТов с буферизацией. Связь с контроллером - желательно по параллельной 8бит шине. Тут и дуплексный throughput порядка 8 МБит@20 MHz будет обеспечен легко, и скалабельность достигается дикая... Есть вариант еще проще! AT94K10AL-25AJC Давно мечтал заюзать такую штюкку... AVR+FPGA в одном флаконе! Ценник ок. 300 рублей. Ноль обвязки. На 10к вентилей можно затолкать столько УАРТов, что и не снилось. А AVR ядро доделает все остальное.
|
|
|
|
|
Sep 23 2008, 06:44
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата считываю подряд 8 байт. 8 бит Цитата Как только считано 8 байт, обновляю время срабатывания TIMERint на (бит + (бит/2)) Нет, все еще на (бит), по девятому прерыванию от таймера проверяете, получили ли 1, если да - значит обрабатываете байт (если видите 0 - значит, ошибка фрейма). В любом случае запрещаете прерывания от таймера и разрешаете EXTInt. А в остальном - совершенно правильно. PS Перед разрешением EXTInt не забудьте его сбросить флаг.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Sep 23 2008, 07:00
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Rst7 @ Sep 23 2008, 09:44)  8 бит Нет, все еще на (бит), по девятому прерыванию от таймера проверяете, получили ли 1, если да - значит обрабатываете байт (если видите 0 - значит, ошибка фрейма). В любом случае запрещаете прерывания от таймера и разрешаете EXTInt. А в остальном - совершенно правильно. PS Перед разрешением EXTInt не забудьте его сбросить флаг. Да, там биты, это я поспешил  . С проверкой стоп бита тоже согласен. А время для обработки принятого байта будет когда будет приниматся следующий байт на прерываниях, не подумал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|