|
Работа TXC в USART, Не могу разобраться с флагом "окончание передачи", помогите |
|
|
|
 |
Ответов
|
Aug 20 2007, 15:46
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата Работает только если после передачи первого байта проверять флаг вручную и передавать второй байт после его установки. Соответственно так же переключаю на приём. Не надо ничего проверять. Сделайте очередь. В прерывании TXC посылайте следующий байт - если нечего слать - то переключайте линию на прием. PS: вы на чем пишете программу? asm/c? Цитата Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст честно говоря никогда не использовал UDRE. Т.к. по TXC все что связано с 485-м реализуется гораздо удобнее, как бонус даже межсимвольный интервал непроизвольно получается.
|
|
|
|
|
Aug 20 2007, 20:11
|

Местный
  
Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606

|
Цитата(defunct @ Aug 20 2007, 19:46)  Не надо ничего проверять. Сделайте очередь. В прерывании TXC посылайте следующий байт - если нечего слать - то переключайте линию на прием.
PS: вы на чем пишете программу? asm/c? честно говоря никогда не использовал UDRE. Т.к. по TXC все что связано с 485-м реализуется гораздо удобнее, как бонус даже межсимвольный интервал непроизвольно получается. Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт. Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг!
Сообщение отредактировал Т.Достоевский - Aug 20 2007, 20:13
|
|
|
|
|
Aug 21 2007, 00:41
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Т.Достоевский @ Aug 20 2007, 23:11)  Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт. Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг! Я где-то приводил пример работы с UART на asm'e.. Искать долго, поэтому просто прикляю его еще раз. смотрите в атаче. Пример написан под AT90S2313, чтобы переделать под Tiny2313 надо будет поменять таблицу векторов и возможно пару штрихов с настройкой UART'a. Так же надо будет выставить константы Fosc и BaudRate согласно вашим потребностям. константа .equ PD7 = 7 ; // объявим константу которая не прописана в .inc файле используется как флажек (прием/передачи) поменяйте ее на Pin которым у вас меняется направление (прием/передача) 485-го. Цитата у меня фраза "камень глючит" или "винда не так села" вызывает .... Согласен. Камень тут не причем. 2 TXC на 2 переданных байта - абсолютно нормальное поведение чипа.
|
|
|
|
|
Aug 22 2007, 12:55
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Aug 22 2007, 13:09)  Одно место меня озадачило, в теле подпрограммы PutChar вы снова вызываете PutChar. Это что, такая рекурсия заложена, или как? Спасибо что проявили интерес ;> Да - там рекурсия. посылаем строку "hello\n" putchar автоматически добавит возврат каретки и терминал примет "hello\r\n". Цитата Вроде не должно работать. Попробуйте код. ;> Какой резон мне выкладывать что-то нерабочее?
|
|
|
|
|
Aug 23 2007, 09:19
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Aug 22 2007, 11:55)  Да - там рекурсия Посмотрел попристальнее - нет там никакой рекурсии. И вообще, проще было бы вызывать не rcall PutChar, a rcall __skip_add_cr (ну и названьице(:-)). И выполнение было бы быстрее, ведь рутина у вас и в прерывании вызывается... Цитата(defunct @ Aug 22 2007, 11:55)  Попробуйте код А чего его пробовать, и так видно, что тяжеловесно и неоптимально. Например, фрагмент с кольцевым буфером можно написать в два раза короче. А что там за пляски с бубнами в PutChar: in AH,SREG cli + out SREG,AH? Не проще ли обойтись связкой cli/sei. Или вот: зачем стоит tst AL перед rcall PutChar в рутине Print?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 23 2007, 12:49
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Aug 23 2007, 12:19)  Посмотрел попристальнее - нет там никакой рекурсии. Смотрите пристальнее сразу. Ок? Есть там рекурсия, коль скоро функция вызывает сама себя. Цитата проще было бы вызывать не rcall PutChar, a rcall __skip_add_cr (ну и названьице(:-)). Не сомневаюсь что вы именно так и поступаете, у меня же все метки начинающиеся с "__" внутренние и я стараюсь их не вызывать, чтобы было меньше путаницы. Цитата А что там за пляски с бубнами в PutChar: in AH,SREG cli + out SREG,AH? Не проще ли обойтись связкой cli/sei. Или вот: зачем стоит tst AL перед rcall PutChar в рутине Print? Не проще. Потому что вызывается эта функция еще и в прерывании. И вообще прежде чем хаить хамоватым тоном - разберитесь с кодом. Цитата Или вот: зачем стоит tst AL перед rcall PutChar в рутине Print? опечатка.
|
|
|
|
|
Aug 23 2007, 16:14
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Aug 23 2007, 11:49)  Есть там рекурсия, коль скоро функция вызывает сама себя. Ну-ну, tell it your sailors(:-). Рекурсии там нет. Рекурсия – это сведение вычисления задачи некоторой размерности N к вычислению аналогичных задач меньшей размерности. Вот пример классической рекурсии. Код Задача заключается в том, чтобы найти по заданному n число последовательности Фибоначчи Fn. #include <stdio.h> #include <time.h> long F(unsigned int n) { return n <= 1 ? n : F(n-1) + F(n-2); } int main() { time_t begin, end; long res; for(int n = 0; n < 40; n++) { time(&begin); res = F(n); time(&end); printf("%-3i\t%-9li\t%-20.3f\n",n,res,difftime(end,begin)); } return 0; } Кстати, цикл является частным видом рекурсии. У вас ни того, ни другого. Цитата(defunct @ Aug 23 2007, 11:49)  Не сомневаюсь что вы именно так и поступаете, у меня же все метки начинающиеся с "__" внутренние и я стараюсь их не вызывать, чтобы было меньше путаницы. Дорогой мой, зачем метки тогда вообще писать. Я пишу программы так, чтобы они были эффективные и красивые, а не какие-то там крокозябры (это не вам). Цитата(defunct @ Aug 23 2007, 11:49)  Не проще. Потому что вызывается эта функция еще и в прерывании. Ну хорошо, не проще, так не проще. Сейчас я вам покажу как ваш код работает. Выполняется программа Print, перед brne возникает прерывание по приему с rx. Программа прерывания запишет принятый байт внутрь строки, которую программа Print собирается поместить в кольцевой буфер. В результате вы получите не ту строку, которую копировали из флеши, а несколько другую. Я бы назвал сиё скрытым (неявным) багом. Цитата(defunct @ Aug 23 2007, 11:49)  И вообще прежде чем хаить хамоватым тоном - разберитесь с кодом Прошу прощения, если кого-то обидел, но я никому не хамил и никого не хаял. Была выложена программа, идёт её обсуждение, ничего личного.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 23 2007, 17:54
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Aug 23 2007, 19:14)  Ну-ну, tell it your sailors(:-). Рекурсии там нет. Рекурсия – это сведение вычисления задачи некоторой размерности N к вычислению аналогичных задач меньшей размерности. Вот пример классической рекурсии. Ваше определение рекурсии и пример - неверны. либо взяты не из той предметной области. рекурсия — частичное определение объекта через себя, определение объекта с использованием ранее определённых. Рекурсия используется, когда можно выделить самоподобие задачи. В программировании рекурсия — вызов функции или процедуры из неё же самой источник: http://ru.wikipedia.org/wiki/РекурсияЦитата Ну хорошо, не проще, так не проще. Сейчас я вам покажу как ваш код работает.  Цитата Выполняется программа Print, перед brne возникает прерывание по приему с rx. Программа прерывания запишет принятый байт внутрь строки, которую программа Print собирается поместить в кольцевой буфер. В результате вы получите не ту строку, которую копировали из флеши, а несколько другую. Я бы назвал сиё скрытым (неявным) багом. Теоретически возможно. Атомарность Print я не организовывал. Но конструкция реализованная в PutChar не препятствует организации атомарности Print. тем же самым in Rr, SREG - cli - out SREG, Rr Цитата Дорогой мой, зачем метки тогда вообще писать. Во-первых выбирайте выражения. Своему бойфренду можете говорить "дорогой мой". Во-вторых, я не виноват что русский язык порождает неоднозначность ("не вызывать" - имелось в виду "call" не делать. ) в третьих - это такой стиль - для обозначения внутренних меток (локальных для функций) на которые осуществяется условный переход я применю "тэг" - "__".
|
|
|
|
|
Aug 23 2007, 21:29
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Aug 23 2007, 17:54)  Ваше определение рекурсии и пример - неверны. либо взяты не из той предметной области. рекурсия — частичное определение объекта через себя, определение объекта с использованием ранее определённых. Рекурсия используется, когда можно выделить самоподобие задачи. Мой пример классический, не я его выдумал, взгляните на него непредвзято (заменил там рекурсивную функцию F на более заметную RECURRENCE). Код long RECURRENCE(unsigned int n) { return n <= 1 ? n : RECURRENCE(n-1) + RECURRENCE(n-2); } Напишите ваш код PutChar на си в таком же виде, тогда и будем говорить, что верно, а что неверно. Интересно, что у вас будет параметром рекурсии? Цитата(defunct @ Aug 23 2007, 17:54)  Теоретически возможно. Атомарность Print я не организовывал. Но конструкция, реализованная в PutChar не препятствует организации атомарности Print. тем же самым in Rr, SREG - cli - out SREG, Rr Так я и сказал. что все эти примочки внутри PutChar не нужны, не решают они задачу до конца, а снаружи атомарность передачи строки вы не обеспечили. И не теоретически, а сугубо практически, поверьте. Цитата(defunct @ Aug 23 2007, 17:54)  Во-первых, выбирайте выражения. Своему бойфренду можете говорить "дорогой мой" Да что ж такое! Такое впечатление, что или у всех мозги такие извращенные, или все свихнулись на этой секссвободе, что ни скажешь, всё переводят в плоскость гениталий. Вы уж, уважаемый, тоже слова выбирайте. Цитата(SasaVitebsk @ Aug 23 2007, 18:16)  =GM=, при всём уважении к Вашим знаниям давайте будем добрее друг к другу. Так вы отобъёте всякое желание выложить свою прогу, чтобы кому-то помочь.  Знаний как раз маловато, спасибо форуму, много даёт в плане самообразования. Да я...белый и пушистый, defunct'а почти люблю (как брата, а то опять поймет не в той плоскости(:-)). Что касается проги, не собирался я её критиковать, с первого взгляда она мне понравилась, посмотрел по диагонали - в подпрограмме вывода символа вроде используется рекурсия, вот думаю, люди рекурсию применяют, а я от неё как чёрт от ладана, ну я и спросил спроста, а потом уж стал смотреть, а он мне отвечает, да, там рекурсия, да какая рекурсия, курам на смехЦитата(SasaVitebsk @ Aug 23 2007, 18:16)  Любая мало-мальски приличная прога содержит ошибки. Иногда их вылавливаешь годами. Плюс различные предпочтения у каждого программиста. Это как аккорды на гитаре. Один пользуется чаще такими, а другой другими. Но если оба музыканта, то музыка всё равно звучит.  Согласен. Ошибок в любой программе полно, у самого так. Смотришь на программу годичной давности, и думаешь, неужели это я написал такое гуано? Ну посмотрел я его программу, ну высказал замечания, будь благодарен, что кто-то потратил своё время, разобрался, принял участие, ответил, что плохого? Почему сразу надо воспринимать как наезд, которого и в помине не было. Дефункту не надо было говорить, чтоб код испытал(:-). Да если б все мои программы так критиковали, это было бы здорово, и программы были бы в стократ лучше...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 23 2007, 21:57
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Aug 24 2007, 00:29)  Мой пример классический, не я его выдумал, взгляните на него непредвзято (заменил там рекурсивную функцию F на более заметную RECURRENCE). Взглянул непредвзято.. будем считать, что вы взяли определение рекурсии не из той предметной области. Цитата Напишите ваш код PutChar на си в таком же виде, тогда и будем говорить, что верно, а что неверно. Интересно, что у вас будет параметром рекурсии? отправляемый char, а что еще может быть параметром? функциональный аналог ассемблерной функции: Код void put(U8 ch) { if (ch == 0x0A) // add CR char ahead of LF put(0x0D); { U8 IStatus = ILock() pRing->storage[ pRing->tail ] = ch; pRing->tail = RingNextTail( pRing ); IUnlock( IStatus ); } } Цитата Так я и сказал. что все эти примочки внутри PutChar не нужны, не решают они задачу до конца, Это вам так кажется. Примочки внутри putchar решают свои задачи: - атомарность выгрузки символа в очередь - добавление символа CR Цитата а снаружи атомарность передачи строки вы не обеспечили. И не теоретически, а сугубо практически, поверьте. Господи, да что вы цепляетесь к фантикам от конфет. Чес слово. Уж не пойму или у меня там полный бред в коде или у вас проблемы с прочтением алгоритма из асм программы. поменять Print так: Код /* * Print() * Выводит строки размещенные во флеш памяти через PutChar * ---> Z - указатель на строку оканчиваемую \0 во флеш * <--- ничего не возвращает */ Print: in AH, SREG push AH cli __do_output: lpm; // читаем данные флеш adiw Z, 1 // увеличим указатель на 1 (z++) mov AL, R0 rcall PutChar tst AL brne __do_output pop AH out SREG, AH ret и будет обеспечиваться атомарность. push/pop конечно же можно сократить если использовать какой-либо другой регистр для хранения SREG вместо AH, но поставил специально для наглядности. Цитата да какая рекурсия, курам на смех Маленькая простенькая - но рекурсия, т.к. функция вызывает сама себя. Прочитайте определение рекурсии на wiki. Цитата Ну посмотрел я его программу, ну высказал замечания, будь благодарен, что кто-то потратил своё время, разобрался, принял участие, ответил, что плохого? Я выразил вам благодарность и попытался нормально ответить на ваши вопросы вначале. PS: я и сейчас пытаюсь отвечать на ваши вопросы по-сущесту, с приведением ссылок и примеров. Может вы просто не замечаете?
|
|
|
|
|
Aug 23 2007, 22:22
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Aug 23 2007, 21:57)  Уж не пойму или у меня там полный бред в коде или у вас проблемы с прочтением алгоритма из асм программы. поменять Print так: Код /* * Print() * Выводит строки размещенный во флеш памяти через UART * ---> Z - указатель на строку оканчиваемую \0 во флеш * <--- ничего не возвращает */ Print: in AH, SREG push AH cli __do_output: lpm; // читаем данные флеш adiw Z, 1 // увеличим указатель на 1 (z++) mov AL, R0 rcall PutChar tst AL brne __do_output pop AH out SREG, AH ret и будет обеспечиваться атомарность Ну, это другое дело. Но тогда сохранение/восстановление статус-регистра в PutChar не нужно, о чём я и толкую последние две страницы. Кстати, неплохо бы добавить проверку на переполнение буфера в подпрограмме обработки прерываний по приему. UART_RX_ISR так и будет писать по кругу, никаких ограничений у вас нет, возможен скрытый баг.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
Т.Достоевский Работа TXC в USART Aug 19 2007, 23:46 haker_fox Цитата(Т.Достоевский @ Aug 20 2007, 08:46... Aug 20 2007, 03:06 arttab Заслали Вы в буфер байт или 2 байта.
начинается пе... Aug 20 2007, 04:04 haker_fox Цитата(arttab @ Aug 20 2007, 13:04) Но пе... Aug 20 2007, 04:48 Т.Достоевский Цитата(arttab @ Aug 20 2007, 08:04) Засла... Aug 20 2007, 10:44  IEC Цитата(Т.Достоевский @ Aug 20 2007, 13:44... Aug 20 2007, 10:49   Т.Достоевский Цитата(IEC @ Aug 20 2007, 14:49) ВСЕГО ба... Aug 20 2007, 11:02    SasaVitebsk Цитата(Т.Достоевский @ Aug 20 2007, 14:02... Aug 20 2007, 14:56 vesago Для 485 я пользую следующие конструкции:
Код//POPT... Aug 20 2007, 07:06 Т.Достоевский Цитата(vesago @ Aug 20 2007, 11:06) Код#p... Aug 20 2007, 10:47  vesago Цитата(Т.Достоевский @ Aug 20 2007, 13:47... Aug 21 2007, 09:47 IEC Цитата(Т.Достоевский @ Aug 20 2007, 02:46... Aug 20 2007, 10:46  SasaVitebsk Цитата(Т.Достоевский @ Aug 20 2007, 23:11... Aug 20 2007, 22:56   Т.Достоевский Цитата(defunct @ Aug 21 2007, 04:41) 2 TX... Aug 21 2007, 02:06            defunct Цитата(=GM= @ Aug 24 2007, 01:22) Ну, это... Aug 23 2007, 22:41             =GM= Открыл новую тему на предмет написания и использов... Aug 24 2007, 20:19 arttab Почему получается 2 прерывания по TXC при передачи... Aug 21 2007, 04:53 Rst7 Цитата(arttab @ Aug 21 2007, 07:53) Почем... Aug 21 2007, 10:59  defunct Цитата(Rst7 @ Aug 21 2007, 13:59) Вообщем... Aug 21 2007, 11:47   Rst7 Цитата(defunct @ Aug 21 2007, 14:47) Они ... Aug 21 2007, 11:59    defunct Цитата(Rst7 @ Aug 21 2007, 14:59) Обоснуй... Aug 21 2007, 15:48     Rst7 Цитата(defunct @ Aug 21 2007, 18:48) Ну н... Aug 22 2007, 05:20  IEC Цитата(Rst7 @ Aug 21 2007, 13:59) Работат... Aug 21 2007, 13:42  ReAl Цитата(Rst7 @ Aug 21 2007, 12:59) Ну в пр... Aug 22 2007, 06:40 Igor26 ЦитатаЧто вы понимаете под словом "отладчик... Aug 21 2007, 05:19 WHALE А AVRSTUDIO че не пользуете?Такие вещи там нормаль... Aug 21 2007, 06:10 Т.Достоевский Цитата(WHALE @ Aug 21 2007, 10:10) А AVRS... Aug 21 2007, 09:44  Maik-vs Цитата(Т.Достоевский @ Aug 21 2007, 13:44... Aug 21 2007, 13:59   WHALE Цитата(Maik-vs @ Aug 21 2007, 17:59)... Aug 21 2007, 17:45    Maik-vs Цитата(WHALE @ Aug 21 2007, 21:45) Дык у ... Aug 22 2007, 06:13 SasaVitebsk А я был очень рад увидеть два флага. Наверное посл... Aug 21 2007, 20:29 SasaVitebsk =GM=, при всём уважении к Вашим знаниям давайте бу... Aug 23 2007, 18:16 WHALE ЦитатаРекурсия – это сведение вычисления задачи не... Aug 23 2007, 18:42 Т.Достоевский С новым камнем всё заработало. Проблема была не с ... Aug 27 2007, 21:29 Rst7 Цитата(Т.Достоевский @ Aug 28 2007, 00:29... Aug 28 2007, 05:16  Maik-vs Цитата(Rst7 @ Aug 28 2007, 09:16) 2 раза ... Aug 28 2007, 09:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|