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

 
 
> at91sam7s64 & uart & прерывания (interrupt)
dmvy
сообщение Jan 10 2008, 09:46
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 10-12-07
Пользователь №: 33 165



собрал на микроконтроллере at91sam7s64 индикатор с ЖК. uart настроил - принимает данные в цикле нормально. но в цикле очень неудобно - начал возиться с прерываниями.

Код
#define AIC_SMR(n) (*(&AIC_SMR0 + n))
#define AIC_SVR(n) (*(&AIC_SVR0 + n))
#define AIC_SRCTYPE_INT_LEVEL_SENSITIVE 0x00    /* Level Sensitive */
#define AIC_SRCTYPE_INT_EDGE_TRIGGERED  0x20    /* Edge Triggered */
#define AIC_SRCTYPE_EXT_LOW_LEVEL       0x00    /* Low Level */
#define AIC_SRCTYPE_EXT_NEGATIVE_EDGE   0x20    /* Negative Edge */
#define AIC_SRCTYPE_EXT_HIGH_LEVEL      0x40    /* High Level */
#define AIC_SRCTYPE_EXT_POSITIVE_EDGE   0x60    /* Positive Edge */
#define US0_ID 6

void uart0_irq(void) __attribute__ ((interrupt("IRQ")));
void uart0_irq(void)
{
  
//  PIOA_CODR = 0x01;
//  delaym(100000);
//  PIOA_SODR = 0x01;
  int act=uart_get_sc(), i;
  for (i=0;i<6;i++)
  {
    prev_active[i]=active[i];
    active[i]=(act>>i) & 0x1;
  }
  AIC_EOICR = 0;
}

в мэйне:
AIC_IDCR = 1 << 6;
  AIC_SVR(6) = (unsigned)uart0_irq;
  AIC_SMR(6) = 0x00;//AIC_SRCTYPE_INT_EDGE_TRIGGERED;
  AIC_ICCR = 1 << 6;
  AIC_IECR = 1 << 6;
__ARMLIB_enableIRQ();


на uart каждую секунду идет информация со скоростью 9600 бод, но прерывание не происходит...

в чем причина? что забыли?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
KRS
сообщение Jan 10 2008, 10:29
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



а в самом UART разрешили нужные прерывания? (AT91C_US0_IER)
Go to the top of the page
 
+Quote Post
dmvy
сообщение Jan 10 2008, 13:52
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 10-12-07
Пользователь №: 33 165



да. но после написания поста. тоже нолик... =(
Код
  AIC_IDCR = 1 << 6;
  AIC_SVR(6) = (unsigned)uart0_irq;
  AIC_SMR(6) = 0;//AIC_SRCTYPE_INT_EDGE_TRIGGERED;
  AIC_ICCR = 1 << 6;
  AIC_IECR = 1 << 6;
  US0_IER = 0x1;
__ARMLIB_enableIRQ();


мне только на прием нужно прерывание. по доку оно в первом бите регистра
Go to the top of the page
 
+Quote Post

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

 


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


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