interrupção lpc1343

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

interrupção lpc1343

Mensagempor styg » 01 Set 2010 11:19

putz já tá chato esse cortex, tudo diferente..

to tentando ativar as interrupções externas pra usar com teclas.

1) na pagina 56 do user manual, item 5.6, mostra os regs relacionados, só que no header lpc13xx.h (keil) não tem nenhum deles.

2) e quanto aos vetores de int, eu tenho os wakeup0..39 para os pinos, blz, mas tambem tem o eint0..3 que nao sei pra que serve.

3) e como fica a rotina de tratamento da int?
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Rodrigo F. » 01 Set 2010 16:56

os pinos eint0..3 são os pinos pre definidos da interrupção externa,

no meu eu fiz o seguinte! rachei a cabeça tbm uma semana pra conseguir fazer funcionar:

Código: Selecionar todos
//*****************************************************************************
// Function name:   INTERRUPÇÃO EXTERNA   
//***************************************************************************/
 
 
void EINT3_IRQHandler (void)
{
LPC_GPIOINT->IO2IntClr |= (1 << 13);
 LPC_SC->EXTINT = EINT3;      /* clear interrupt */
   
}

void EINT2_IRQHandler (void)
{
LPC_GPIOINT->IO2IntClr |= (1 << 12);
 LPC_SC->EXTINT = EINT2;      /* clear interrupt */
   
}

void EINT1_IRQHandler (void)
{
LPC_GPIOINT->IO2IntClr |= (1 << 11);
 LPC_SC->EXTINT = EINT1;      /* clear interrupt */
   
      
}

void EINT0_IRQHandler (void)
{
LPC_GPIOINT->IO2IntClr |= (1 << 11);
 LPC_SC->EXTINT = EINT0;      /* clear interrupt */
   
   
}

uint32_t EINTInit( void )
{
  LPC_PINCON->PINSEL4 = 0x05500000;   /* set P2.10 as EINT0 and P2.0~7 GPIO output */
  LPC_GPIOINT->IO2IntEnF = (1<<13)|(1<<12) | (1<<11) | (1<<10);   /* Port2.10 is falling edge. */
  LPC_SC->EXTMODE = (EINT3_EDGE | EINT2_EDGE | EINT1_EDGE | EINT0_EDGE );/* INT0 edge trigger */
  //LPC_SC->EXTPOLAR =( 3 | 2 | 1 | 0);            /* INT0 is falling edge by default */         
}



asim tá configurado as interrupções EINT0 à EINT3 no caso estou usando um 1768, os pinos no meu são P2.10 (1<<10) ,11 (1<<11) ,12(1<<12) ,13(1<<13), da uma olhada nos pinos do seu e altere estes trechos do código!
Rodrigo F.
Nibble
 
Mensagens: 66
Registrado em: 12 Mar 2010 09:40
Localização: Macapá

Mensagempor proex » 01 Set 2010 19:12

Se vc fez isso ai para o 17xx, nao vai servir no 13xx.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor styg » 01 Set 2010 21:19

proex escreveu:Se vc fez isso ai para o 17xx, nao vai servir no 13xx.


e tu proex, usa int no cm3?
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor styg » 01 Set 2010 21:30

Rodrigo F. escreveu:asim tá configurado as interrupções EINT0 à EINT3 no caso estou usando um 1768, os pinos no meu são P2.10 (1<<10) ,11 (1<<11) ,12(1<<12) ,13(1<<13), da uma olhada nos pinos do seu e altere estes trechos do código!


Rodrigo, esse código tas rodando no Keil? Se sim, então deve mesmo ter diferença entre os defines da linha 17xx e 13xx, porque no meu header nem tem esses defines.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor proex » 02 Set 2010 06:48

styg escreveu:
proex escreveu:Se vc fez isso ai para o 17xx, nao vai servir no 13xx.


e tu proex, usa int no cm3?


Até o momento não fiz nada que precisasse de interrupção.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor rcakto » 02 Set 2010 11:04

ja pensou no caso do seu keil ser uma versao antiga por isso esse "bug"??
rcakto
Word
 
Mensagens: 787
Registrado em: 09 Jun 2010 00:57
Localização: vitoria ES

Mensagempor RobL » 02 Set 2010 11:57

styg .
Dentro dos programas exemplo que vieram com sua LPCXpresso tem exemplos com interrupção externa. Daí creio que seja somente ajustar para o Keil.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Rodrigo F. » 02 Set 2010 13:48

styg escreveu:
Rodrigo F. escreveu:asim tá configurado as interrupções EINT0 à EINT3 no caso estou usando um 1768, os pinos no meu são P2.10 (1<<10) ,11 (1<<11) ,12(1<<12) ,13(1<<13), da uma olhada nos pinos do seu e altere estes trechos do código!


Rodrigo, esse código tas rodando no Keil? Se sim, então deve mesmo ter diferença entre os defines da linha 17xx e 13xx, porque no meu header nem tem esses defines.


Sim styg utilio keil 4! não sei te dizer ao certo a questão dos defines, pensei que poderia ser igual por serem cortex!
Rodrigo F.
Nibble
 
Mensagens: 66
Registrado em: 12 Mar 2010 09:40
Localização: Macapá

Mensagempor styg » 02 Set 2010 17:03

rcakto, eu to com a ultima versao do mdkarm a 4.12, por que achas que pode ser bug? ja conseguisse fazer funcionar isso?

robl, vou dar uma olhada, mas pelo que lembro pro lpcxpresso já tem tudo ums funçõezinhas prontas acho q não dá pra adaptar.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor RobL » 04 Set 2010 17:53

Essas "funcõeszinhas" prontas serão comum a todo CM3 se usar o drive CMSIS. Essa parte de interrupção é comum a todo core.
Sugiro dar uma lida sobre CMSIS e ganhar tempo e passar a ver com clareza e simplicidade tudo que você quer.
Por exemplo você vai encontrar funcão para setar prioridade, habilitar, informar qual porta, etc, de sua interrupção, algo como: NVIC_SetPriority(nnn,nnn) ; NVIC_EnableIRQ(n,n,n) etc.
Não encare essas funções como funções particulares de um determinado compilador (ou produtor de software). O CMSIS tem "diretivas" que o torna utilizável para vários compiladores.
O grande lance no CM3 com CMSIS é que você só tem que fazer o seu programa. Toda setagem está pronta esperando que você informe apenas detalhes (qual interrpção, porta, prioridade, etc). Identifique as funções (se familiarize) com elas. É aí que estas encontrando dificuldade.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor styg » 06 Set 2010 16:17

Robl, ja dei uma pesquisada sobre o CMSIS e estou usando ele mesmo, visto que parece o caminho mais simples.

Estou configurando dessa forma (interrupção externa):

Código: Selecionar todos
LPC_GPIO0->IS = 0xCC;   // interrupção por nivel baixo para P0.2,0.3,0.6,0.7
LPC_GPIO0->IE = 0xCC;   // ativa int para P0.2,0.3,0.6,0.7

NVIC_EnableIRQ(EINT0_IRQn);
NVIC_EnableIRQ(WAKEUP3_IRQn);


a rotina de tratamento da interrupção é declarada assim:

Código: Selecionar todos
void PIOINT0_IRQHandler(void)
{
   LPC_GPIO1->IS &= ~(0x1<<1);
}



ai eu mando simular no Keil, e na janela NVIC aparece que a 'PIO0 Interupt' e a 'Wake-up PIO0_3' estão 'enabled', entao OK.

eu vou na janela do 'GPIO0' e no campo 'I/O Port' eu seleciono o pino 0.3 para causar a interrupção, só que ela não acontece.

agora rodando passo-a-passo notei uma coisa, quando ele chama a função NVIC_EnableIRQ(EINT0_IRQn), assim que ele executa essa função ele cai na minha rotina de interrupção, mas depois alterando o pino pra forçar a int, nada acontece.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor RobL » 06 Set 2010 16:47

Código: Selecionar todos
void PIOINT0_IRQHandler(void)
{
   LPC_GPIO1->IS &= ~(0x1<<1);
}


Por que estas modificando a forma de sensoriar a interrupção?
Creio que esta linha seja quando setar o tipo de int externa. Não no serviço, a não ser que você queira modificar a forma de gerar a int ext após uma int.
Para teste, troque essa linha por algo que não faça nada, por exemplo, ou coloque um contador. Um contador é melhor para ver se aconteceu e quantas vezes.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor styg » 06 Set 2010 18:17

a nao, essa é so uma linha qualquer que botei pra nao ficar vazio, mas já tava usando um delay.

testando aqui, eu vi que se eu setar (na janela da NVIC (simulando)) o bit 'pending' dessa minha int ele vai pra rotina de tratamento, mas quando altero na janela da porta ele não vai....

vou testar agora em debug e alterando diretamente no pino do mcu.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor styg » 08 Set 2010 11:29

agora debugando ta contecendo o seguinte, quando aciono a chave em p0.3 ele vai pra interrupção EINT0:

Código: Selecionar todos
void PIOINT0_IRQHandler(void)
{
lpc1xxx_delay_ms(500);   
}


mas vou usar int ext. também em p0.2, p0.6 e p0.7. acontece que todas essas portas quando gerada uma int ela vai para o mesmo vetor de int (o EINT0).

no caso da p0.3, o vetor dela ta ali certinho só esperando:

Código: Selecionar todos
void WAKEUP3_IRQHandler(void)
{
lpc1xxx_delay_ms(500);   
}


nao to entendo, ou to fazendo alguma coisa errada, ou vou ter que ficar testando qual foi a fonte da interrupção EINT0 (não acredito que seja isso)
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Próximo

Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x