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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Снова UART
Lucky:)
сообщение Feb 3 2007, 19:41
Сообщение #16


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

Группа: Свой
Сообщений: 182
Регистрация: 5-10-06
Пользователь №: 21 031



Цитата(!Roma! @ Feb 3 2007, 11:55) *
При дальнейшем углублении в перепитии UARTA, созрел еще вопрос: (надеюсь, что более интеллектуальный чем с флагом smile.gif ) можно ли как-то работать напрямую со сдвигающим приемным буфером UARTa или хотя бы настроить его по аналогии с виндоусным регистром FIFO? Просто при отправке пакета данных, скажем из 6 байт, процедура обработки прерывания вызывается только для последнего байта, который в UXRXBUFe уже успел затереть 5 своих предшественников (выставлен флаг переполнения OE). Если не трудно, подскажите... Спасибо.


Думаю можно сделать "свой UART" на основе таймера и с FIFO.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 3 2007, 20:58
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(!Roma! @ Feb 3 2007, 12:55) *
При дальнейшем углублении в перепитии UARTA, созрел еще вопрос: (надеюсь, что более интеллектуальный чем с флагом smile.gif ) можно ли как-то работать напрямую со сдвигающим приемным буфером UARTa или хотя бы настроить его по аналогии с виндоусным регистром FIFO? Просто при отправке пакета данных, скажем из 6 байт, процедура обработки прерывания вызывается только для последнего байта, который в UXRXBUFe уже успел затереть 5 своих предшественников (выставлен флаг переполнения OE). Если не трудно, подскажите... Спасибо.


Как-то не очень глубоко Вы углубились в понимании буфера. Там нет ничего для программиста! smile.gif

А для облегчения работы, когда скорость отправки не критична, а программировать лень, обычно создают циклический буфер, в который будет добавляться символ по putchar, a считываться и отправляться в системном тике таймера. Тогда этой ботвой с прерываниями по порту можно не заниматься.
Успехов ;)


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 3 2007, 23:29
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(!Roma! @ Feb 3 2007, 12:55) *
При дальнейшем углублении в перепитии UARTA, созрел еще вопрос: (надеюсь, что более интеллектуальный чем с флагом smile.gif ) можно ли как-то работать напрямую со сдвигающим приемным буфером UARTa или хотя бы настроить его по аналогии с виндоусным регистром FIFO? Просто при отправке пакета данных, скажем из 6 байт, процедура обработки прерывания вызывается только для последнего байта, который в UXRXBUFe уже успел затереть 5 своих предшественников (выставлен флаг переполнения OE). Если не трудно, подскажите... Спасибо.

Вот была похожая тема, там примеры кода приводились.

Цитата(Dog Pawlowa @ Feb 3 2007, 19:58) *
a считываться и отправляться в системном тике таймера. Тогда этой ботвой с прерываниями по порту можно не заниматься.
Хм. Но с прерываниями по порту как-то естественнее :-)


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 4 2007, 16:43
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



>>>>>>Хм. Но с прерываниями по порту как-то естественнее :-)

Конечно, но при пакетном протоколе. Пакет получил - пакет отправил.
Теперь есть устройство, работающее в терминальном режиме. Байт получил - вывел какой-то длинный перечень параметров. Когда прерывание ставить?
На каждый записываемый в буфер байт? - как-то не показалось.
На весь большой пакет - объема буфера не хватает все поместить.
Вот и делаю в системном тике. А чтобы буфер не переполнялся, вставляю задержки между записями строк в буфер.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 4 2007, 20:05
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(!Roma! @ Feb 3 2007, 13:55) *
можно ли как-то работать напрямую со сдвигающим приемным буфером UARTa или хотя бы настроить его по аналогии с виндоусным регистром FIFO? Просто при отправке пакета данных, скажем из 6 байт, процедура обработки прерывания вызывается только для последнего байта, который в UXRXBUFe уже успел затереть 5 своих предшественников (выставлен флаг переполнения OE). Если не трудно, подскажите... Спасибо.

Напрямую со сдвиговым регистром - нет, нельзя. Да и не нужно оно. Ведь гораздо сложнее отловить момент когда весь символ попал в сдвиговый регистр, чем прочитать его уже готовый из буферного регистора RXBUF. Но я опять не понял, что за проблемы? Теперь уже с приемом данных? Что за чудеса такие? У всех работает, а у вас кристалл "заколдованный" какой-то biggrin.gif Может у вас другие лишние прерывания вызываются? Или частоту тактирования ядра слишком низкую установили? У меня был проект где при тактовой частоте 4915,2кГц пакетный обмен (прием/передача) через UART (который на RS-485 работал) на скорости 115200 по прерываниям плюс системные 10мс тики все успешно работало.
Цитата(Dog Pawlowa @ Feb 3 2007, 22:58) *
А для облегчения работы, когда скорость отправки не критична, а программировать лень, обычно создают циклический буфер, в который будет добавляться символ по putchar, a считываться и отправляться в системном тике таймера. Тогда этой ботвой с прерываниями по порту можно не заниматься.

Цитата(Dog Pawlowa @ Feb 4 2007, 18:43) *
Вот и делаю в системном тике. А чтобы буфер не переполнялся, вставляю задержки между записями строк в буфер.

Чтобы циклический буфер не переполнялся, по уму нужно два указателя и счетчик байт к нему присовокупить.
P.S. точнее не для того чтобы буфер не переполнялся, а для того чтобы он нормально функционировал. Для того чтобы не переполнялся буфер должен быть "нужного" размера ;)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 5 2007, 17:10
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(rezident @ Feb 4 2007, 21:05) *
Цитата(Dog Pawlowa @ Feb 4 2007, 18:43) *

Вот и делаю в системном тике. А чтобы буфер не переполнялся, вставляю задержки между записями строк в буфер.

Чтобы циклический буфер не переполнялся, по уму нужно два указателя и счетчик байт к нему присовокупить.
P.S. точнее не для того чтобы буфер не переполнялся, а для того чтобы он нормально функционировал. Для того чтобы не переполнялся буфер должен быть "нужного" размера wink.gif

Не-а, не согласен ! tongue.gif
1) Разве по разнице указателей нельзя сделать вывод о количестве байт в буфере?
2) "Нужного"? Если скорость записи больше скорости отправки, размера не хватит никогда, тем более в микроконтроллерах. Нужно просто не гнать коней, то бишь притормаживать запись в буфер. wink.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 5 2007, 20:39
Сообщение #22


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Dog Pawlowa @ Feb 5 2007, 16:10) *
1) Разве по разнице указателей нельзя сделать вывод о количестве байт в буфере?

Количество байт будет либо равно разнице значений указателей либо плюс размер буфера (при переполнении).
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 6 2007, 01:10
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Dog Pawlowa @ Feb 5 2007, 19:10) *
Не-а, не согласен ! tongue.gif
1) Разве по разнице указателей нельзя сделать вывод о количестве байт в буфере?

Если буфер действительно циклический, а не по типу стека, то разница между указателями сообщает количество находящихся там данных с точностью до размера самого буфера. Т.е. если буфер полностью заполнен, то указатели будут равны и разница их даст значение ноль, в то время как реальное количество данных будет равно размеру буфера. Разницу между указателями в качестве счетчика данных иногда можно использовать в буфере организованному по типу стека. Но и то при условии, что каждый из указателей изменяет свое значение предсказуемо, а не в процедуре прерывания, например.
Цитата(Dog Pawlowa @ Feb 5 2007, 19:10) *
2) "Нужного"? Если скорость записи больше скорости отправки, размера не хватит никогда, тем более в микроконтроллерах. Нужно просто не гнать коней, то бишь притормаживать запись в буфер. wink.gif

Если скорость поступления постоянного потока данных в буфер значительно больше скорости передачи, то да. Но это лишь означает, что вы неправильно спроектировали всю систему обмена данными. В реальности же чаще всего данные поступают порциями, пакетами (что-то оцифровали, посчитали, сформировали строку, опросили состояние датчиков и т.п.) и пропускная способность канала известна тоже заранее. Но на этапе передачи данных возникают какие-то задержки/коллизии, например, нужно включить драйвер RS-485 на передачу и выждать паузу до начала передачи. Или получили данные от нескольких каналов АЦП по SPI на высокой скорости, а передать далее нужно через UART. Вот для таких случаев и применяется буфер, но отнюдь не безразмерный, замечу. wink.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 7 2007, 17:39
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(rezident @ Feb 6 2007, 02:10) *
... Но это лишь означает, что вы неправильно спроектировали всю систему обмена данными...

О, правильные слова. Мы же говорим не о кодировании, а о системе.
Неоптимально, я бы только предпочел говорить. 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 Текстовая версия Сейчас: 19th June 2025 - 19:32
Рейтинг@Mail.ru


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