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

 
 
 
Reply to this topicStart new topic
Sirko
сообщение Jan 13 2012, 13:54
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



-

Сообщение отредактировал Sirko - Jan 13 2012, 14:10
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jan 16 2012, 20:52
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Использую USART в полудуплексе. Отдельно режим прием, отдельно - передача.
Столкнулся вот с такой особенностью:
Каждый раз при переключении с приема на передачу, на выходе TXD что-то возникает. Что, сказать затрудняюсь, но на терминале появляется 0x00.

Вот код "переключателя":
CODE
#define F_CPU 29491200UL
#define BAUD 115200UL
#define BSCALE 1
#define CLOCK2X 0

Init(){
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
// PORTD.OUT |= PIN3_bm; // Установить вывод TxD в "1"
// PORTD.DIRSET = PIN3_bm; // Настроить его как выход
u16 *p = (u16*) &USART.BAUDCTRLA;
*p = (u16)((((F_CPU / (BAUD * 16 /(1+CLOCK2X*2))) - 1) / (u8)(pow(2, BSCALE)))
| (BSCALE << (8 + USART_BSCALE0_bp)));

USART.CTRLC = USART_CMODE_ASYNCHRONOUS_gc // Асинхронная передача
| USART_CHSIZE_8BIT_gc // Длинаданных 8 битов
| USART_PMODE_EVEN_gc; // Включить проверку четности
USART.CTRLB |= USART_CLK2X_bm * CLOCK2X; // Бит удвоенной скорости (если необходимо)
}
}

/////////////////////////////////////////////////////////////////////////////////////////////

#define SetReceivMode() \
do{ \
USART.CTRLA = USART_TXCINTLVL_OFF_gc /* Запретить прерывания TXC */\
| USART_DREINTLVL_OFF_gc; /* Запретить прерывания DRE */\
u08 tmp = USART.DATA; /* Сбросить флаг RXC */\
USART.CTRLA = USART_RXCINTLVL_LO_gc; /* Разрешить прерывания RXC */\
USART.CTRLB |= USART_RXEN_bm; /* Разрешить работу приемника */\
}while(0)

/////////////////////////////////////////////////////////////////////////////////////////////

#define SetTransmitMode() \
do{ \
USART.CTRLB &= ~USART_RXEN_bm; /* Отключить приемник*/\
USART.CTRLA = USART_RXCINTLVL_OFF_gc; /* Запретить прерывания приема данных */\
USART.STATUS |= USART_DREIF_bm /* Сбросить флаг DRE */\
| USART_TXCIF_bm; /* Сбросить флаг TXC */\
USART.CTRLB |= USART_TXEN_bm; /* Разрешить работу передатчика */\
USART.CTRLA = USART_TXCINTLVL_LO_gc /* Разрешить прерывания TXC */\
| USART_DREINTLVL_LO_gc; /* Разрешить прерывания DRE */\
}while(0)

/////////////////////////////////////////////////////////////////////////////////////////////

Где косяк?
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jan 17 2012, 07:24
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Понял источник, - когда разрешаю прерывыания, то сразу попадаю в обработчик. Почему?
Перед разрешением, сбрасываю флаги прерываний. Пробовал сбрасывать установкой их в "1" и пробовал "0", - эффект одинаковый
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 17 2012, 07:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Sirko @ Jan 17 2012, 11:24) *
Понял источник, - когда разрешаю прерывыания, то сразу попадаю в обработчик. Почему?
Перед разрешением, сбрасываю флаги прерываний. Пробовал сбрасывать установкой их в "1" и пробовал "0", - эффект одинаковый

Какие прерывания? Какие флаги? Флаг DREIF, например, не сбрасывается записью в него ни единицы, ни нуля.
Go to the top of the page
 
+Quote Post
Sirko
сообщение Jan 17 2012, 08:16
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Понял.

Сбивает с толку вот эта фраза.

• Bit 5 - DREIF: USART Data Register Empty Flag
The DREIF indicates if the transmit buffer (DATA) is ready to receive new data. The flag is one
when the transmit buffer is empty, and zero when the transmit buffer contains data to be transmitted
that has not yet been moved into the Shift Register. DREIF is set after a reset to indicate
that the Transmitter is ready. Always write this bit to zero when writing the STATUS register.
DREIF is cleared by writing DATA. When interrupt-driven data transmission is used, the Data
Register Empty interrupt routine must either write new data to DATA in order to clear DREIF or
disable the Data Register Empty interrupt. If not, a new interrupt will occur directly after the
return from the current interrupt.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 19:31
Рейтинг@Mail.ru


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