|
Software UART, Как реализовать на Si8051f320 |
|
|
|
Oct 19 2008, 11:01
|
Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806

|
Подскажите, как реализовать программный UART порт на Si8051f320 Я беру вот этот пример с сайта: https://www.silabs.com/Support%20Documents/...lDocs/an115.pdfhttps://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 Помогите, пожалуйста, разобраться.
|
|
|
|
|
Oct 20 2008, 13:15
|
Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806

|
Нет, не проще. Мне нужно 4 порта UART. Sofware UART - хорошее решение. Вообще, я на форуме cygnal.org видел несколько подобных тем, но проблема так и не была решена. Думаю, что если кто-то поможет разобраться с программным UART - эти исходники будут полезны многим.
|
|
|
|
|
Oct 20 2008, 13:27
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(lancode @ Oct 19 2008, 22:01)  Подскажите, как реализовать программный UART порт на Si8051f320 Я беру вот этот пример с сайта: ... Не всегда хватает хардверных UARTов  . Не поятно для какой конкретной цели Вы реализуете. Извините, не хочется разбираться с апнотом. Поэтому поделюсь своим. Использовал его для приема сигнала с приемника GPS. Там посылки NMEA, заканчиваются 0x0d 0x0A. Поэтому конец посылки легко выхватывается. Нужно что-то другое - адаптируете или спросите. Вариантов много - можно использовать PCA, можно разбить прием битов и обработку байтов на отдельные прерывания. PS. Прога изначально была написана для 410, если где-то накосячил при переделке в инициализации, заранее извините.
|
|
|
|
|
Oct 20 2008, 14:11
|
Участник

Группа: Участник
Сообщений: 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) + аппаратное переключение ?
|
|
|
|
|
Oct 20 2008, 14:50
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Пока писал первое сообщение, да еще с моим затупочным инетом, пропустил требование 4 uart. Предлагаю еще один старый вариант. Он рабочий, но писал его давно, а пришлось переделывать под другой контроллер (с 410 под Ваш 320), посему возможны ошибки. Приведен пример для одного Rx, но по аналогии легко адаптировать под 3 софтверных UART. Еще, в 410 входы компаратора на мультеплексоре можно выставить NONE, в 320 нет. Я думаю, это не должно мешать, т.к. сам компаратор не включен.
Прикрепленные файлы
pca_rx.txt ( 2.83 килобайт )
Кол-во скачиваний: 97
|
|
|
|
|
Oct 27 2008, 07:04
|
Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806

|
barabek Спасибо большое, попробовал твои примеры. Вроде работает. Конечно придется дописать и поправить под себя. Задача немного изменилась. Скорость приема вместо 9600 стала 115200. Взял этот же пример, поставил скорость. Запустил, не работает. Можно ли, и если можно, то как сделать, чтоб этот же пример работал на скорости 115200 ? Цитата М.б. лучше взять 2 hard uart ( F34x) + аппаратное переключение ? Это как? Что такое аппаратное переключение? Что будет если данные передаются одновременно по обоим портам?
|
|
|
|
|
Oct 28 2008, 09:57
|
Участник

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

|
Цитата(lancode @ Oct 27 2008, 10:04)  Что такое аппаратное переключение? Что будет если данные передаются одновременно по обоим портам? Активными двунаправленными будут 2 hard uart (большая скорость) для выбранных клиентов. Остальные могут только передавать запросы (они идут на прерывания) или работать на низкой скорости(soft uart) Когда ф340 решит сделать активными(быстрыми) новую пару, то соответственно "старые" клиенты должны перейти перейти на медленный(soft) или ожидание очереди
|
|
|
|
|
Nov 2 2008, 20:15
|
Группа: Новичок
Сообщений: 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" стал получать букву "и". Подскажите как можно обойти эту ошибку округления.
|
|
|
|
|
Nov 3 2008, 15:20
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(lancode @ Nov 3 2008, 06:15)  ... Здесь возникает ошибка округления BITTIME = 154 вместо 253,8 Я попробовал увеличить частоту таймера с SYSCLOCK/48 до SYSCLOCK/4. но видимо что-то сделал неправильно, сдвиг стал только больше. например вместо буквы "a" стал получать букву "и". Подскажите как можно обойти эту ошибку округления.  Странная ошибка округления! Надеюсь Вы правильно все настройки для таймера и осцилятора сделали. Лучше, конечно, взять не 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. Правда, если появится "окно" на работе на этой или следущей неделе  . Если это нужно, уточните, может все же на PCA сделать? Все-таки сразу 3 Rx получаем.
|
|
|
|
|
Nov 4 2008, 17:53
|
Группа: Новичок
Сообщений: 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.
|
|
|
|
|
Nov 5 2008, 06:24
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Вот, как и обещал, сделал, только предыдущий вариант полностью переделал. Правда не знаю, как у Вас отличаются посылки друг от друга, поэтому сделал, что посылка заканчивается переводом строки '\n', как у модемов. Но это не главное, под себя переделаете. В коде добавлены два пина служебных. Один, как я и советовал, перещелкивается при заходе в прерывание, второй пин устанавливается при заходе в прерывание и сбрасывается при выходе. Можно было и только вторым пином обойтись, но так понаглядней. Их нужно будет удалить, что бы не отнимали время. Сигналы на софтверном пине RX0 (P0.0), а также на обоих вспомогательных представлены на прилагаемой осцилограмме (они подписаны). Как видно из рисунка на прерывание всреднем уходит порядка 2,5 мкс. Посему, в принципе, 3 одновременных приема должно получиться, в натяжечку. А если еще пооптимизировать, да на ASMе... Сам проверил только один одновременный прием, не захотел на ките с лишними допайками возиться. А штатно установлен только 1 преобразователь 232 в TTL. Поэтому проверку оставляю Вам  . О результате сообщите, пожалуйста, вдруг самому придется на таких скоростях работать. P.S. В папке имеются лишние файлы, а отредактировать не получается. На самом деле в проекте используются только 4 файла: "init.c","interrupts.c","main.c","values.c". Коменты от старых файлов остались на русском, новые по настоятельной рекомендации здешних гуру попытался на импортном писать  . Такая вот каша.
Сообщение отредактировал barabek - Nov 5 2008, 06:37
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 12 2008, 15:24
|
Группа: Новичок
Сообщений: 10
Регистрация: 25-05-08
Пользователь №: 37 806

|
barabek Огромное спасибо за пример. Вот как только появилось немного времени - сел разобраться с ним. Скачал, запустил, работает. Прием для 1 канала работает отлично. Все данные без ошибок. Попробовал перекинуть провод по которому передаются данные с P1.0 на P1.1 или P1.2 - чтоб проверить прием по другим каналам PCA. Сразу не пошло. Просто не вызывается прерывание PCA_inter. Решил что глюк где-то в инициализации PCA. С ходу, в общем, не разобрался. Сейчас буду отлаживать, тестировать. Если что новенькое появится - напишу сюда. Еще раз говорю огромное спасибо за помощь, хочу также научиться программировать микропоцессоры, как Вы Комментарии что на Русском, что на Английском читаются у меня отлично. Проблем с кодировкой нет. p.s. Классный у Вас осциллограф
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|