interrupção lpc1343

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Mensagempor Rodrigo F. » 08 Set 2010 11:39

styg escreveu: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)


styg fiquei uma semana pra descobrir isso! estava acontecendo igualzinho em meu programa! tava puto da cara refiz o codigo umas 200 X!

na configuração, configura pino a pino separado assim com um AND: no meu fiz isso e deu certo!

Código: Selecionar todos
LPC_GPIOINT->IO2IntEnF = (1<<13)|(1<<12) | (1<<11) | (1<<10);
Rodrigo F.
Nibble
 
Mensagens: 66
Registrado em: 12 Mar 2010 09:40
Localização: Macapá

Mensagempor styg » 08 Set 2010 11:47

rodrigo, mas na real o problema não é na configuração, entendeu?

as ints estão configuradas certo, o problema é que quando ativa ela não vai para o seu vetor de interrupção individual, elas vão todas para o vetor de int. PIOINT0.
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. » 08 Set 2010 13:41

o meu estava assim tbm acionava a int0, int1, int2, e int3 e caia no
Código: Selecionar todos
void PIOINT0_IRQHandler(void)


depois que configuri individualmente com um AND nas int´s ele parou de fazer isso!

tenta isso:

em vez de configurar todas as int´s como estava fazendo:
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


faz como eu te falei configura uma a uma com um AND "|"

Código: Selecionar todos
LPC_GPIO0->IS =  (1<<2)|(1<<3) | (1<<6) | (1<<7);


tenta isso, eu tive o mesmo problema que você o que acontecia é que o compilador sobrepunha uma interrupção sobre a outra e só aceitava a ultima!! fiz isso no meu e deu certo!!
Rodrigo F.
Nibble
 
Mensagens: 66
Registrado em: 12 Mar 2010 09:40
Localização: Macapá

Mensagempor fabim » 08 Set 2010 14:16

hehehe,
AND "&"
OR "|"
XOR "^"

RS
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Rodrigo F. » 08 Set 2010 14:39

fabim escreveu:hehehe,
AND "&"
OR "|"
XOR "^"

RS


disculpa minha vergonha!! hehehe!!
Rodrigo F.
Nibble
 
Mensagens: 66
Registrado em: 12 Mar 2010 09:40
Localização: Macapá

Mensagempor RobL » 08 Set 2010 15:05

Em sua tabela de vetores as int externas estariam todas para a mesma irq ?
Veja lá como estão.
Editando: Creio que não pois está com o CMSIS e este nao foi mexido.
Se as 4 ints estão habilitadas, não tenho mais sugestão.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor styg » 08 Set 2010 23:35

o que ta acontecendo agora é o seguinte, boto pra rodar o programa, e na janela do keil do NVIC, eu seto o bit 'pending' da PIO0.3 aí ocorre a interrupção e ele vai para o vetor:

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


detalhe, com o vetor WAKEUP3_IRQHandler não funciona.

P****, então será que vo ter que testar qual foi a fonte da interrupção na ISR?
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor RobL » 09 Set 2010 07:43

Pode ser algo que ocorre similar com o uso do gcc e gdb, por exemplo:
1-não se pode usar break point sobre variável volátil.
2-Com otimização, se dentro do serviço esquecer de qualificar a variável como volátil, simplismente esse trecho do código será ignorado.
3- Se nada for feito com o código dentro do serviço, devido a otimização, este trecho será ignorado...etc.

Tente colocar um contador declarado como static volatil dentro dos serviços para teste.

Coloque break points fora do serviço de interrupção e verifique a contagem desses contadores.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor styg » 09 Set 2010 10:52

robl, a otimização do código está em -0, entao nao é isso.

P**** ta muito estranho isso.

na real acho que não tem erro nenhum não, na verdade eu pensei que cada pino poderia gerar uma interrupção indo para um vetor individual, mas cheguei a conclusão que é tudo junto mesmo.

quando eles dizem que os 40 pinos servem como int, é verdade, só que voce que tem que saber qual foi o pino, na isr. essa P**** só serve mesmo pra wake-up, por isso o nome...

dou o caso como fechado, obrigado a todos
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. » 09 Set 2010 11:23

styg no caso dos pinos EINT0 À EINT3 eles vão para vetores individuais!
Rodrigo F.
Nibble
 
Mensagens: 66
Registrado em: 12 Mar 2010 09:40
Localização: Macapá

Mensagempor styg » 09 Set 2010 17:43

Rodrigo F. escreveu:styg no caso dos pinos EINT0 À EINT3 eles vão para vetores individuais!


sim, sim, na verdade funciona como nos arm7 mesmo, eu é que viajei com esses wake-up.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Anterior

Voltar para ARM

Quem está online

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

cron

x