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

 
 
> Software UART, проблемы с полноценной реализацией
Kuzmi4
сообщение Jan 23 2008, 09:03
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Здравствуйте.
Есть у меня макетка с 32-й мегой - решил прикрутить туда 2-й UART, зачем - долго рассказывать..
В опсчем пересмотрел я гору исходников - и атмеловских AVR304,AVR305 - и так, что люди писали - в принципе не сильно от атмеловских отличается - проникся я значит главной мыслёй - и решил написать с нуля своё. Ну и естественно "...вдруг откуда не возьмись..." начали возникать проблемы - и что не странно именно с приёмом - потому как с передачей там всё чётко и ясно - сначала сделал приём на INT2 - по спадающему фронту и провёл такой тест - когда МК ловит 5 байт - отсылает их обратно. В опсчем отсылал я 3 байта - например 0хАА,0хАВ,0хАС - ручками на кнопочки макросов нажимал в которые были забиты байты - тобто последовательно - и после отправки 3-х сразу получал ответ - в ответе было как и положено 5 байт, токо выглядели они как то хитро 0хАА,0xFF,0хАВ,0xFF,0хАС - проверил - действительно за приёмом байта идёт сразу есчё 1-но прерывание - в принципе просимулил процесс в студии - ничего такого не заметил. Как добрался до осцилографа - тыканулся посмотреть - увидел что за байтом практически всегда идёт эдакий шум - при чём бывает очень сильный провал - ну где то 0.7 -1 вольт от 5. В студии я получал похожую ситуацию когда ручками проваливал значение на лапке.. Значит поменял я INT2 на INT0 - как в примерах даётся - и сделал прерывание по низкому уровню. Пропала эта белиберда с 0xFF - то есть отсылаю 5 байт - получаю 5 байт. Но тут возникли опять траблы - тобто они и были когда UART был на INT2 - нельзя было отправить в терминале сразу пачку - то есть
отправляю сразу 1 байт '1' - ok
отправляю сразу 2 байта '12' - ok
отправляю сразу 3 байта '123' - err
отправляю сразу 4 байта '1234' - err

Просмотрел код - ну вроде всё верно - не должно такого быть - но тогда почему не работает ??
В опсчем код не сильно маленький - прикрутил аттачем.
Там загорается красный лед у меня на макетке когда ошибка. Зелёный лед не загорался (там в коде описано: загорается красный - когда ошибка фрейма после 1-го полученного байта, зелёный - после 2,3 и так далее.. ).
Буду признателен за любые конструктивные предложения.
Спасибо.
Прикрепленные файлы
Прикрепленный файл  soft_uart.txt ( 6.73 килобайт ) Кол-во скачиваний: 309
Прикрепленный файл  defs.txt ( 1.61 килобайт ) Кол-во скачиваний: 88
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kuzmi4
сообщение Jan 25 2008, 09:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 =GM= - на счёт 1-го - спасибо - действительно, как то просчёлкал я....стыдно....
На счёт 2-го - ну на счёт настройки таймера - 192 от 195 - не сильно отличается - комп должен кушать- что он в принципе и делает, а на счёт 288/254 - я то понимаю что это выжидание в полтора байта, чтоб после старта начать проверять в середине значения - "0" или "1". Я в принципе проверяю не в середине - ближе к краю - знаю чем чревато, но скушало ж....
На счёт 3-го - действительно TCNT0 сбрасывается в прерывании по сравнению, однако код не маленький и у меня таймер успевает натикать 3 раза - вот я его с брасываю - понимаю что не очень корректно - каюсь...
На счёт 5-го - та мне и нужно было проверить 1 раз..

А вот на счёт 4-го я с вами не согласен - читал как то документацию на SIGNAL и INTERRUPT в WinAVR`е , да и где то на форуме даже дискуссия была по этому поводу - в обсчем суть в том что в SIGNAL нету кли а в INTERRUPT - есть. Хардварно ж флажок I не сбрасывается при вызове любого прерывания.... Поправть или ткните носом если не прав.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 25 2008, 10:12
Сообщение #3


Местный
***

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



Цитата(Kuzmi4 @ Jan 25 2008, 12:16) *
На счёт 3-го - действительно TCNT0 сбрасывается в прерывании по сравнению, однако код не маленький и у меня таймер успевает натикать 3 раза - вот я его с брасываю - понимаю что не очень корректно - каюсь...

Чем больще код, тем вреднее обнуление TCNT. Особенно если в обработчике много условий - получается "переменный битрейт" smile.gif

Цитата(Kuzmi4 @ Jan 25 2008, 12:16) *
А вот на счёт 4-го я с вами не согласен - читал как то документацию на SIGNAL и INTERRUPT в WinAVR`е , да и где то на форуме даже дискуссия была по этому поводу - в обсчем суть в том что в SIGNAL нету кли а в INTERRUPT - есть. Хардварно ж флажок I не сбрасывается при вызове любого прерывания.... Поправть или ткните носом если не прав.

SIGNAL и INTERRUPT устарели. Сейчас модно ISR(_vektor_name_), прерывания в нем запрещены. Хардварно флаг I регистра SREG сбрасывается при вызове ЛЮБОГО прерывания, и восстанавливается при выходе командой reti.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:46
Рейтинг@Mail.ru


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