Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.04.2010, 15:04
|
#21
|
Временная регистрация
Регистрация: 30.07.2007
Сообщений: 51
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
if (tx_head!=tx_tale) - как я уже говорил, значит буффер не пуст и не полон.
|
|
|
|
08.04.2010, 15:05
|
#22
|
Временная регистрация
Регистрация: 30.07.2007
Сообщений: 51
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
В void send(char* s) нет проверки на переполнение - будет перезаписывать данные циклически - что не успело передаться - теряется.
|
|
|
|
08.04.2010, 15:27
|
#23
|
Частый гость
Регистрация: 15.01.2007
Сообщений: 20
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
Сообщение от neiver
|
В void send(char* s) нет проверки на переполнение - будет перезаписывать данные циклически - что не успело передаться - теряется.
|
три-четыре посылки уже иногда формируют ошибку передачи.
длина каждой телеграммы - 19 символов, включая zero term 0x00
итого - не более 100 символов в буфере, это менее половины.
Я конечно верну на родину предохранители, и перепроверю с ними, не жалко, путь будут.
Но они были, просто убрал потом за ненадобностью.
НЕ В UART дело блин, повторяю. Я сюда написал впервые за пару лет, а эмбещик я со стажем и по тривиальным вопросам кривости кода не стал бы народ напрягать.
|
|
|
|
08.04.2010, 15:30
|
#24
|
Прописка
Регистрация: 09.08.2006
Сообщений: 198
Сказал спасибо: 14
Сказали Спасибо 27 раз(а) в 20 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
Можно узнать для чего используется TMR2? Судя по комменту -
Сообщение от umgah
|
TIMER2 10uSec
#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF
|
код должен работать каждые 10 микросекунд, но время работы других обработчиков может быть больше этого интервала. Так, что либо увеличивайте тактовую частоту, либо в "длинных" обработчиках предусматривайте разрешение прерываний.
|
|
|
|
08.04.2010, 15:40
|
#25
|
Частый гость
Регистрация: 15.01.2007
Сообщений: 20
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
Не длиннее. Проверял. Немного впритык, но не длиннее. UART - 80 байт, 0,1мкС, второй таймер вообще крошечный, INT0=266байт 0,3325мкС.
в общем либо я очень неверно утилизацию считаю, или все-таки резерв есть (
Но спасибо за мысли, это стоящая идея, к сожалению "рвать" длинноватый int0 я не могу. там ровно столько, сколько надо (
Работа таимера 0 - частота CLK для отправки сигналов "клавиатуры". В принципе я могу его увеличить немного, просто не думал, что в этом может оказаться мое спасение.
Может ?
Последний раз редактировалось umgah; 08.04.2010 в 15:43.
|
|
|
|
08.04.2010, 15:50
|
#26
|
Временная регистрация
Регистрация: 03.02.2005
Сообщений: 52
Сказал спасибо: 8
Сказали Спасибо 8 раз(а) в 6 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
А проверить взводится ли FE-бит на приеме?
Т.к. не совпадение скорости 0.2%, то на символ идет 2%. Как там с детектированием стоп бита?
|
|
|
|
08.04.2010, 15:56
|
#27
|
Временная регистрация
Регистрация: 30.07.2007
Сообщений: 51
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
Что я всё-таки рекомендую сделать:
Раз - добавить-таки корректные проверки и обработку для опустошения/передолнения обеих буфферов. Для переполнения и для чтения из пустых буфферов очень хорошие условия созданы.
Два - этот перенести код в прерывение USART_UDRE_vect:
Код:
|
// UART section
// UART transmission if something is in queue
if (tx_head!=tx_tale)
{
if ((UCSRA & DATA_REGISTER_EMPTY)!=0)
{
UDR=tx_buffer[tx_head];
tx_head++;
}
} |
|
|
|
|
08.04.2010, 15:57
|
#28
|
Частый гость
Регистрация: 15.01.2007
Сообщений: 20
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
Ммм.. кстати, я было столкнулся на одном проекте с любопытной особнностью порта, на котором фунциклирует UART. Если я соединяю ноги входа с pull-up c ногой выхода того же порта и приземляю ей pullup, то перестает работать UART на том же порту. На всякий поясню, зачем так вообще делать: чтобы постоянно видеть, что на ноге, но при этом иметь возможность приземлить ее со своей стороны и знать, я ее приземлил или устройство на другом конце. Может что-то тут такое есть ?
|
|
|
|
08.04.2010, 15:58
|
#29
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
Расскажите про:
Код:
|
TIMER2 10uSec
#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF
void timer2_ovf_isr(void)
{
TCNT2 = 0xFF; //reload counter value
if (timer›0) timer--;
if (key_timeout›0) key_timeout--;
} |
Что означает "TIMER2 10uSec"?
Это период вызова прерывания? Тогда как Вы его получили из 8МГц-ового такта?
Или - что?
Вообще по Вашему исходнику трудно чего понять - это про первый, который в 6-м собщении. Какие то непонятные переменные - iscmd,timer,key_timeout... Что в них хранится и где они изменяются непонятно. Также как и то - зачем они вообще нужны.
Вообще мне подход не нравится. При жестком реалтайме, а при периодичности прерываний 10uS на INT0 - всего 80 тактов процессора при 8МГЦ тактировании и обработчики явно перегружены. ВСЕ! Требуется оптимизировать как алгоритм, так и код.
И буфер UART тут не при чем - вся программа сплошной тормоз.
|
|
|
|
08.04.2010, 15:59
|
#30
|
Частый гость
Регистрация: 15.01.2007
Сообщений: 20
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: AVR USART+прерывания=потеря данных
Сообщение от neiver
|
// UART section
// UART transmission if something is in queue
if (tx_head!=tx_tale)
{
if ((UCSRA & DATA_REGISTER_EMPTY)!=0)
{
UDR=tx_buffer[tx_head];
tx_head++;
}
}
|
Было.. в процессе охоты на ведьм изменил, так же как и tmps[] появилась. Изначально разумеется такого расточительства не было, конечно же. Но спасибо за советы, попробую..
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:19.
|
|