Подключаю в Протеусе терминалку(RXD и TXD терминалки на TXD и RXD контроллера). В терминалке ничего. Однако, если тупо в бесконечном цикле слать байт, то в терминалке просто ставится пробел. В чем проблема?Разбирался-разбирался, что-то не догнал пока Это может быть из-за того,что бита URSEL в Тини2313 нет вообще? Я думал, что вместо него UMSEL.
_________________ Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Хм, тогда может кто-нибудь объяснит, зачем 2 прерывания? Просто смысл не очень понятен, точнее: зачем 2? Ведь можно было просто сообщать, что байт ушел, либо что регистр пуст и можно слать дальше. Но сразу 2...Зачем?
_________________ Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Во многих своих поделках я при передаче массива следующий байт закидывал в UDR по UDRE, а только послав последний байт, дожидался TXC - сигнал ПЕРЕДАЧА ОКОНЧЕНА. До окончания передачи у меня фоновой задачи не было, поэтому UDRE и TXC ловил не по прерываниям, а по опросу флагов. Как вариант...
Да да именно так. А зачем сделано 2 на передачу? Ну например если используется дуплексная связь, то нам все равно, передался ли последний байт или нет, мы просто выдаем в UDR данные как только он освободится, а если используется например RS-485, там еще и направлением передачи нужно управлять - а это только по TXC можно сделать иначе байт потеряется.
А там все делается точно так же как и с обычным UARTом, только перед передачей нужно на ногу которая соединена с линиями $RE/DE MAX487 подать единицу, а после окончания передачи подать ноль. Пока передаем строку пользуемся флагом UDRE для того чтобы передать данные в UDR, после того как последний байт ушел в UDR, смотрим флаг TXC. Можно например по его прерыванию проверять передались ли все байты и если передались - переводить MAX478 на прием. Пример передачи:
Код:
UART_WRITE: ;передача строки из флеша по RS485 CBR REG0,(1<<SEND_REQUEST) ;сброс флага необходимости передачи SBI PORTD,TX_EN ;переключение MAX487 на передачу LDI ZH,High(CMD0*2) ;указатель на начало строки LDI ZL,Low(CMD0*2) ;во флеше LDI R17,5 ;длина строки TX_LOOP:LPM R16,Z+ ;загружаем байт OUT UDR,R16 ;отправляем в UDR SBIS UCSRA,UDRE ;ждем пока UDR освободится RJMP PC-1 DEC R17 ;длина=длина-1 BRNE TX_LOOP ;длина>0 передаем следующий CLR R16 ;сброс R16 SBRS R16,0 ;ждем пока R16=0 RJMP PC-1 ;а он будет=0 пока не сработает прерывание TXC CBI PORTD,TX_EN ;MAX487 - на прием RET ;выход TXC_VECT: ;прерывание TXC LDI R16,0xFF ;меняем R16 RETI ;выход
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения