Прерывания в К1874ВЕ7Т

Модераторы: ea, Alis, pip, gurzzza, _sva_

Ответить
anton
Сообщения: 23
Зарегистрирован: 26 янв 2016, 16:19

Прерывания в К1874ВЕ7Т

Сообщение anton »

Здравствуйте уважаемые разработчики.
Проблема вот в чём. Ваш пример с перываниями "Последоательный порт UART0" не работает. Выглядит это так: при попытке записи в COM порт с компьютера, переменная ByteReceived сбрасывается после выхода из прерывания, светодиоды IOPORT1 на мгновение все загораются затем гаснут, в SBUF_TX0 ничего не записывается. Эта же программа переделанная для работы без прерываний просто по опросу UART0 работает правильно, т.е. светодиоды загораются в соответствии с записанным байтом, а в терминале на компьютере я считываю тот же байт что и записал. Инициализацию в обеих программах я переделал как UART0_Init(SP_MODE_0) т.е. для синхронной передачи по 8 бит.
dav
Сообщения: 209
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

Re: Прерывания в К1874ВЕ7Т

Сообщение dav »

Действительно, в примере присутствовали пару ошибок.
Ниже приведен скорректированный код:

Код: Выделить всё

//---------------------------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_();
}
P.S.: какой программой пользуетесь для передачи через COM порт в синхронном режиме?
anton
Сообщения: 23
Зарегистрирован: 26 янв 2016, 16:19

Re: Прерывания в К1874ВЕ7Т

Сообщение anton »

Исправленная программа работает точно так же как и первая версия. В качестве терминала COM порта использую minicom.
anton
Сообщения: 23
Зарегистрирован: 26 янв 2016, 16:19

Re: Прерывания в К1874ВЕ7Т

Сообщение anton »

Похоже на ошибку в кристалле.
Ответить

Вернуться в «Микроконтроллер 1874ВЕ7Т»