Здравствуйте уважаемые разработчики.
Проблема вот в чём. Ваш пример с перываниями "Последоательный порт UART0" не работает. Выглядит это так: при попытке записи в COM порт с компьютера, переменная ByteReceived сбрасывается после выхода из прерывания, светодиоды IOPORT1 на мгновение все загораются затем гаснут, в SBUF_TX0 ничего не записывается. Эта же программа переделанная для работы без прерываний просто по опросу UART0 работает правильно, т.е. светодиоды загораются в соответствии с записанным байтом, а в терминале на компьютере я считываю тот же байт что и записал. Инициализацию в обеих программах я переделал как UART0_Init(SP_MODE_0) т.е. для синхронной передачи по 8 бит.
Прерывания в К1874ВЕ7Т
Модераторы: ea, Alis, pip, gurzzza, _sva_
-
- Сообщения: 209
- Зарегистрирован: 14 дек 2015, 09:21
- Предприятие: АО НИИЭТ
- Откуда: АО НИИЭТ, Воронеж
Re: Прерывания в К1874ВЕ7Т
Действительно, в примере присутствовали пару ошибок.
Ниже приведен скорректированный код:
P.S.: какой программой пользуетесь для передачи через COM порт в синхронном режиме?
Ниже приведен скорректированный код:
Код: Выделить всё
//---------------------------Defines-------------------------
#define TI_RI_MASK 0x3 //Transmit/Receive interrupt enable
#define SP_MODE_0 0x8 //Mode0
#define SP_MODE_1 0x9 //Mode1
#define SP_MODE_2 0xA //Mode2
#define SP_MODE_3 0xB //Mode3
//--------------------------Defines Baud_Rate----------------
#define dXTAL 20000000UL //частота внешнего генератора Гц
#define BitRate 56000UL // скорость приема/передачи
#define BAUD_LO_VAL ((unsigned char) (dXTAL/(BitRate*16)-1))
#define BAUD_HI_VAL 0x80 //Clock UART from External clock of XTAL1
//----------------------------Variables-----------------------------------
unsigned char ByteReceived = 0;
unsigned char status_uart = 0;
//--------------------------Function Interfaces---------------------------
void USART0_Init(unsigned char spcon);
void USART1_Init(unsigned char spcon);
void IRQ_uart_rx_tx();
#pragma interrupt 8 IRQ_uart_rx_tx
void main()
{
USART0_Init(SP_MODE_0);
USART1_Init(SP_MODE_0);
_ei_();
while(1);
}
void USART0_Init(unsigned char spcon) {
unsigned char tmp;
tmp = WSR; //store WSR
WSR = (tmp & 0x80) | 0xF; //swap to HWindow15
INT_MASK1 |= TI_RI_MASK; //allow transmit interrupt
WSR = (tmp & 0x80); //swap to HWindow0
IOC1 |= 0x20; //Enable TX0 in P2.0
__NOP();
__NOP();
SP_CON0 = spcon; //Clear SP_CON
BAUD_RATE0 = BAUD_LO_VAL; //write Baud rate value
BAUD_RATE0 = BAUD_HI_VAL;
__NOP();
__NOP();
WSR = tmp; //Restore HWindow
}
void USART1_Init(unsigned char spcon) {
unsigned char tmp;
tmp = WSR; //store WSR
WSR = (tmp & 0x80) | 0xF; //swap to HWindow15
INT_MASK1 |= TI_RI_MASK; //allow transmit interrupt
WSR = (tmp & 0x80); //swap to HWindow0
IOC1 |= 0x20;
__NOP();
__NOP();
SP_CON1 = spcon; //Clear SP_CON
BAUD_RATE1 = BAUD_LO_VAL; //write Baud rate value
BAUD_RATE1 = BAUD_HI_VAL;
__NOP();
__NOP();
WSR = tmp; //Restore HWindow
}
void IRQ_uart_rx_tx()
{
_di_();
status_uart = SP_STAT0; //читаем регистр статуса
if (status_uart&0x40) //Прерывание по приему
{
ByteReceived = SBUF_RX0;
IOPORT1 = ByteReceived;
SBUF_TX0 = ByteReceived;
}
else //прерывание по передаче
{
}
_ei_();
}
Re: Прерывания в К1874ВЕ7Т
Исправленная программа работает точно так же как и первая версия. В качестве терминала COM порта использую minicom.
Re: Прерывания в К1874ВЕ7Т
Похоже на ошибку в кристалле.