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

 
 
> 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
 
Start new topic
Ответов
lancode
сообщение Nov 2 2008, 20:15
Сообщение #2





Группа: Новичок
Сообщений: 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
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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   Software UART   Oct 19 2008, 11:01
- - Kolia   А не проще ли воспользоваться аппаратным UART   Oct 20 2008, 12:16
- - lancode   Нет, не проще. Мне нужно 4 порта UART. Sofware UA...   Oct 20 2008, 13:15
|- - c8051   Цитата(lancode @ Oct 20 2008, 17:15) Мне ...   Oct 20 2008, 14:11
|- - barabek   Пока писал первое сообщение, да еще с моим затупоч...   Oct 20 2008, 14:50
- - barabek   Цитата(lancode @ Oct 19 2008, 22:01) Подс...   Oct 20 2008, 13:27
- - lancode   barabek Спасибо большое, попробовал твои примеры. ...   Oct 27 2008, 07:04
|- - c8051   Цитата(lancode @ Oct 27 2008, 10:04) Что ...   Oct 28 2008, 09:57
|- - barabek   насчет 115200 не проверял. Сейчас к сожалению нет ...   Oct 29 2008, 14:20
|- - barabek   не могу старое сообщение отредактировать. Вот что ...   Oct 29 2008, 23:46
- - lancode   Поднял частоту таймера с SYSCLOCK/48 до SYSCLOCK П...   Nov 4 2008, 17:53
|- - barabek   Вот, как и обещал, сделал, только предыдущий вариа...   Nov 5 2008, 06:24
- - lancode   barabek Огромное спасибо за пример. Вот как тольк...   Nov 12 2008, 15:24
|- - barabek   Цитата(lancode @ Nov 13 2008, 01:24) Попр...   Nov 13 2008, 02:15
- - lancode   Ага. Инициализация была пропущена. Я не заметил ...   Nov 20 2008, 14:23
|- - barabek   Цитата(lancode @ Nov 21 2008, 00:23) Ага....   Nov 21 2008, 03:24
- - lancode   Ошибку поправил. Теперь работают все 3 порта. Цит...   Nov 21 2008, 19:36


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

 


RSS Текстовая версия Сейчас: 26th August 2025 - 04:08
Рейтинг@Mail.ru


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