реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Software UART, Как реализовать на Si8051f320
lancode
сообщение Oct 19 2008, 11:01
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806



Подскажите, как реализовать программный UART порт на Si8051f320
Я беру вот этот пример с сайта:
https://www.silabs.com/Support%20Documents/...lDocs/an115.pdf
https://www.silabs.com/Support%20Documents/...are/an115sw.zip

в комментариях этого примера написано что он будет работать с C8051F00x и C8051F01x
поправил что смог под свой МК, компилирую, получаю ошибки на этих строках:
EIE2 |= 0x20; // Enable IE7.
PRT1IF |= 0x80; // Trigger IE7.
PRT1IF &= ~(0x80); // Clear IE7 interrupt flag
PRT1IF |= 0x80; // interrupt to service.

Хорошо, иду читать документацию, в datasheet написано что у данного МК нету такого прерывания (IE7), точнее оно есть, но нигде не используется. Думаю, меняю что-то, правлю исходиник... в общем, запутался.

Итак, задача, реализовать программный UART (или адаптировать этот семпл с сайта, для Si8051f320).
Притом реализовать хотя бы только чтение (RX) скорость 9600.
Возможно потом понадобится реализовать и TX
Помогите, пожалуйста, разобраться.
Go to the top of the page
 
+Quote Post
Kolia
сообщение Oct 20 2008, 12:16
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



А не проще ли воспользоваться аппаратным UART
Go to the top of the page
 
+Quote Post
lancode
сообщение Oct 20 2008, 13:15
Сообщение #3





Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806



Нет, не проще.
Мне нужно 4 порта UART.
Sofware UART - хорошее решение.
Вообще, я на форуме cygnal.org видел несколько подобных тем, но проблема так и не была решена.
Думаю, что если кто-то поможет разобраться с программным UART - эти исходники будут полезны многим.
Go to the top of the page
 
+Quote Post
barabek
сообщение Oct 20 2008, 13:27
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(lancode @ Oct 19 2008, 22:01) *
Подскажите, как реализовать программный UART порт на Si8051f320
Я беру вот этот пример с сайта:
...


Не всегда хватает хардверных UARTов smile.gif.
Не поятно для какой конкретной цели Вы реализуете. Извините, не хочется разбираться с апнотом. Поэтому поделюсь своим. Использовал его для приема сигнала с приемника GPS. Там посылки NMEA, заканчиваются 0x0d 0x0A. Поэтому конец посылки легко выхватывается. Нужно что-то другое - адаптируете или спросите. Вариантов много - можно использовать PCA, можно разбить прием битов и обработку байтов на отдельные прерывания.
PS. Прога изначально была написана для 410, если где-то накосячил при переделке в инициализации, заранее извините.
Прикрепленные файлы
Прикрепленный файл  soft_rx.txt ( 2.68 килобайт ) Кол-во скачиваний: 92
 
Go to the top of the page
 
+Quote Post
c8051
сообщение Oct 20 2008, 14:11
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 10-06-08
Из: Украина, Черкассы-Киев
Пользователь №: 38 188



Цитата(lancode @ Oct 20 2008, 17:15) *
Мне нужно 4 порта UART.
Sofware UART - хорошее решение.

Когда-то делал 8 портов, но пример брал от Atmel

C8051Fxxx - сильно отличаются инициализацией, а также внутр. генератором:
C8051Fxxx = 24,5 МГц, кроме
C8051F32x = 12
C8051F34x = 24

М.б. лучше взять 2 hard uart ( F34x) + аппаратное переключение ?
Go to the top of the page
 
+Quote Post
barabek
сообщение Oct 20 2008, 14:50
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Пока писал первое сообщение, да еще с моим затупочным инетом, пропустил требование 4 uart. Предлагаю еще один старый вариант. Он рабочий, но писал его давно, а пришлось переделывать под другой контроллер (с 410 под Ваш 320), посему возможны ошибки. Приведен пример для одного Rx, но по аналогии легко адаптировать под 3 софтверных UART. Еще, в 410 входы компаратора на мультеплексоре можно выставить NONE, в 320 нет. Я думаю, это не должно мешать, т.к. сам компаратор не включен.
Прикрепленные файлы
Прикрепленный файл  pca_rx.txt ( 2.83 килобайт ) Кол-во скачиваний: 97
 
Go to the top of the page
 
+Quote Post
lancode
сообщение Oct 27 2008, 07:04
Сообщение #7





Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806



barabek Спасибо большое, попробовал твои примеры. Вроде работает. Конечно придется дописать и поправить под себя.

Задача немного изменилась. Скорость приема вместо 9600 стала 115200.
Взял этот же пример, поставил скорость. Запустил, не работает.
Можно ли, и если можно, то как сделать, чтоб этот же пример работал на скорости 115200 ?

Цитата
М.б. лучше взять 2 hard uart ( F34x) + аппаратное переключение ?

Это как? Что такое аппаратное переключение? Что будет если данные передаются одновременно по обоим портам?
Go to the top of the page
 
+Quote Post
c8051
сообщение Oct 28 2008, 09:57
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 10-06-08
Из: Украина, Черкассы-Киев
Пользователь №: 38 188



Цитата(lancode @ Oct 27 2008, 10:04) *
Что такое аппаратное переключение? Что будет если данные передаются одновременно по обоим портам?

Активными двунаправленными будут 2 hard uart (большая скорость) для выбранных клиентов.
Остальные могут только передавать запросы (они идут на прерывания)
или работать на низкой скорости(soft uart)
Когда ф340 решит сделать активными(быстрыми) новую пару, то соответственно "старые" клиенты должны перейти перейти на медленный(soft) или ожидание очереди
Go to the top of the page
 
+Quote Post
barabek
сообщение Oct 29 2008, 14:20
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



насчет 115200 не проверял. Сейчас к сожалению нет времени этим заняться. Но 24е+6/115200=208, т.е. всего 208 тактов между прерываниями на биты, если работает только один порт на прием. А так как 4 порта - как-то интуитивно маловато времени smile.gif . На передачу конечно проще, можно разные порты синхронизировать.
Go to the top of the page
 
+Quote Post
barabek
сообщение Oct 29 2008, 23:46
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



не могу старое сообщение отредактировать. Вот что я подумал. Прикинул грубо: функция "PCA_inter" из второго примера по листингу полностью занимает 91 байт. С учетом того что не все команды однотактовые, но не все выполняются из-за ветвлений, то впринципе можно постараться выжать требуемую скорость. Только, конечно же, перенастроить частоту PCA на частоту SYSCLK, а не на перегрузку таймера T0 как было. В обработку байтов (по фиктивному прерыванию компаратора) сделать как можно короче, только запись в массив памяти. Обработку оставить на main. Может вообще обработку байтов (запись в массив) перенести в прерывание по PCA.
Но биться стоит, если транзакции происходят относительно редко. Иначе только в прерываниях засядите и на обработку времени не останется.
Go to the top of the page
 
+Quote Post
lancode
сообщение Nov 2 2008, 20:15
Сообщение #11





Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806



barabek
Беру твой пример soft_rx.
На скорости 9600 - все работает нормально.
Повышаю скорость до 115200.
На этой скорости появляются такие ошибки:
Код
передаю алфавит:
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
принимаю:
"bcddfghijklmnopqrstuvwxy{abcdefghijklmnopqrstuvwxyz"
Обратите внимание на 4 символ и на символ "{"


Эта ошибка "плавает", каждый раз получается разный результат.
Логично предположить что происходит небольшой сдвиг, из-за рассинхронизации скорости приема и передачи.
Смотрим в код и видим:
Код
#define SYSCLOCK 12000000
#define BOUDRATE 115200
#define HALFBITTIME  256-SYSCLOCK/48/BOUDRATE/2
#define BITTIME      256-SYSCLOCK/48/BOUDRATE

Здесь возникает ошибка округления
BITTIME = 154 вместо 253,8

Я попробовал увеличить частоту таймера с SYSCLOCK/48 до SYSCLOCK/4.
но видимо что-то сделал неправильно, сдвиг стал только больше. например вместо буквы "a" стал получать букву "и". Подскажите как можно обойти эту ошибку округления. maniac.gif
Go to the top of the page
 
+Quote Post
barabek
сообщение Nov 3 2008, 15:20
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(lancode @ Nov 3 2008, 06:15) *
...
Здесь возникает ошибка округления
BITTIME = 154 вместо 253,8

Я попробовал увеличить частоту таймера с SYSCLOCK/48 до SYSCLOCK/4.
но видимо что-то сделал неправильно, сдвиг стал только больше. например вместо буквы "a" стал получать букву "и". Подскажите как можно обойти эту ошибку округления. maniac.gif


Странная ошибка округления! Надеюсь Вы правильно все настройки для таймера и осцилятора сделали.
Лучше, конечно, взять не 256-SYSCLOCK/48/BOUDRATE, а 256-SYSCLOCK/BOUDRATE, т.к. дискретность на один бит получается больше. При 12 МГц клоке на бит получаем SYSCLOCK/BOUDRATE=104 клока. Рекомендую и частоту взять не 12, а 24 МГц с умножителя. Вообще частоту и предделитель лучше выбирать такими, чтобы количество клоков на бит было максимальным, не превышающим 256. Приоритеты желательно для обоих прерываний выставить высшими, и, сответственно, using 2.
Еще рекомендация. Если у есть нормальный осцил добавь глобальную переменную типа sbit centertoggle=Px^y; на любой свободный пин и в функции T0_RX_SoftWare сразу после объявления переменных добавить перещелкивание этой переменной centertoggle=!centertoggle;. Тогда на двухлучевом осциле можно по фронтам этого сигнала посмотреть, где же происходит обработка битов на самом деле.
Если все же не будет получаться, я попробую проверить. У меня, кажется, на работе есть кит 320. Правда, если появится "окно" на работе на этой или следущей неделе smile.gif. Если это нужно, уточните, может все же на PCA сделать? Все-таки сразу 3 Rx получаем.
Go to the top of the page
 
+Quote Post
lancode
сообщение Nov 4 2008, 17:53
Сообщение #13





Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806



Поднял частоту таймера с SYSCLOCK/48 до SYSCLOCK
Поставил оба прерывания с высшем приоритетом.
Включил - не работает. Экспериментальным путем добился того, что наибольшее сходство данных которые передаются на МК, с теми, которые фактически приняты, получается при
HALFBITTIME 256-(SYSCLOCK/BOUDRATE/2-X)
при значениях X = 6, 7. При изменении количества команд в функции T0_RX_SoftWare - также приходится подстраивать число X.
Однако полного отсутствия ошибок добиться так и не получилось. Наверное это связано с разным количеством команд при обработке стартового бита и/или бита данных.
(данные передаю не посимвольно, а сразу строкой символов по 300.)

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

Цитата
Если все же не будет получаться, я попробую проверить. У меня, кажется, на работе есть кит 320. Правда, если появится "окно" на работе на этой или следущей неделе . Если это нужно, уточните, может все же на PCA сделать? Все-таки сразу 3 Rx получаем.

Сделать наверное действительно лучше на PCA. Но я делал на таймере, потому что с PCA пока не разобрался. Подумал, что на таймере будет легче заставить пример работать, а потом уже перейти на PCA.
Go to the top of the page
 
+Quote Post
barabek
сообщение Nov 5 2008, 06:24
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Вот, как и обещал, сделал, только предыдущий вариант полностью переделал. Правда не знаю, как у Вас отличаются посылки друг от друга, поэтому сделал, что посылка заканчивается переводом строки '\n', как у модемов. Но это не главное, под себя переделаете. В коде добавлены два пина служебных. Один, как я и советовал, перещелкивается при заходе в прерывание, второй пин устанавливается при заходе в прерывание и сбрасывается при выходе. Можно было и только вторым пином обойтись, но так понаглядней. Их нужно будет удалить, что бы не отнимали время. Сигналы на софтверном пине RX0 (P0.0), а также на обоих вспомогательных представлены на прилагаемой осцилограмме (они подписаны). Как видно из рисунка на прерывание всреднем уходит порядка 2,5 мкс. Посему, в принципе, 3 одновременных приема должно получиться, в натяжечку. А если еще пооптимизировать, да на ASMе... Сам проверил только один одновременный прием, не захотел на ките с лишними допайками возиться. А штатно установлен только 1 преобразователь 232 в TTL. Поэтому проверку оставляю Вам smile.gif. О результате сообщите, пожалуйста, вдруг самому придется на таких скоростях работать.

P.S. В папке имеются лишние файлы, а отредактировать не получается. На самом деле в проекте используются только 4 файла: "init.c","interrupts.c","main.c","values.c". Коменты от старых файлов остались на русском, новые по настоятельной рекомендации здешних гуру попытался на импортном писать smile.gif. Такая вот каша.

Сообщение отредактировал barabek - Nov 5 2008, 06:37
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  TestSoftUART.rar ( 56.06 килобайт ) Кол-во скачиваний: 43
 
Go to the top of the page
 
+Quote Post
lancode
сообщение Nov 12 2008, 15:24
Сообщение #15





Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806



barabek Огромное спасибо за пример. Вот как только появилось немного времени - сел разобраться с ним. Скачал, запустил, работает.
Прием для 1 канала работает отлично. Все данные без ошибок.
Попробовал перекинуть провод по которому передаются данные с P1.0 на P1.1 или P1.2 - чтоб проверить прием по другим каналам PCA. Сразу не пошло. Просто не вызывается прерывание PCA_inter. Решил что глюк где-то в инициализации PCA. С ходу, в общем, не разобрался.
Сейчас буду отлаживать, тестировать. Если что новенькое появится - напишу сюда. smile.gif

Еще раз говорю огромное спасибо за помощь, хочу также научиться программировать микропоцессоры, как Вы smile.gif
Комментарии что на Русском, что на Английском читаются у меня отлично. Проблем с кодировкой нет.
p.s. Классный у Вас осциллограф smile.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016