|
Работа 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)  И вообще прежде чем хаить хамоватым тоном - разберитесь с кодом Прошу прощения, если кого-то обидел, но я никому не хамил и никого не хаял. Была выложена программа, идёт её обсуждение, ничего личного.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
Т.Достоевский Работа 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 23 2007, 19:14) Ну-ну, ... Aug 23 2007, 17:54         =GM= Цитата(defunct @ Aug 23 2007, 17:54) Ваше... Aug 23 2007, 21:29          defunct Цитата(=GM= @ Aug 24 2007, 00:29) Мой при... Aug 23 2007, 21:57           =GM= Цитата(defunct @ Aug 23 2007, 21:57) Уж н... Aug 23 2007, 22:22            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
|
|
|