Página 1 de 1
INTERRUPÇÃO FUNCIONA SÓ UMA VEZ

Enviado:
05 Mai 2011 16:24
por allanbr
Galera,
Estou fazendo interrupção no LPC2138 de timer0 no Keil, porém ela só entra na rotina de interrupção vez, mesmo sabendo que a flag de interrupção do timer é setado quando chega-se ao valor de comparação na segunda vez, porém ela nao é resetada por nao entrar na rotina.
Segue o código abaixo.
- Código: Selecionar todos
#include <LPC21xx.h>
int flag = 0;
__irq void Int1seg(void)
{
flag++;
T0IR |= 0x1;
T0TC = 0;
}
int main()
{
inicializauart();
VPBDIV = 0x00000001;
PINSEL0 = 0x00000080;
VICVectCntl0 = 0x20|4;
VICVectAddr0 = (unsigned) Int1seg;
VICIntEnable = 0x1<<4;
T0PR = 0x013D7840; // valor = 25000000
T0MCR = 0x00000003;
T0MR0 = 0x00000003;
T0TCR = 0x00000001;
while(1){
if(flag==1)
escreveuart("lpc");
}
}
O QUE TO FAZENDO DE ERRADO??????

Enviado:
05 Mai 2011 16:44
por fabim
VICVectAddr = 0;
Te dou 10 conto se descobrir onde colocar isso pra zerar o vetor de endereço!!!
T0TC = 0; esse cara eu não sei pra que serve.. melhor não usar ele...rs

Enviado:
05 Mai 2011 17:06
por allanbr
Já coloquei isso na rotina de interrupção, tirei, reiniciei os vetores de interrupção na rotina, ja fiz tudo, e não da certo.

Enviado:
05 Mai 2011 17:39
por fabim
void start_tmr0(void){
//configura paramentros de interrupção para o timer 0.
//ele tem como prioridade, o irq0.
VICVectPriority4 = (int )0;
// Habilita o Slot de prioridade 0 para o timer0
VICVectAddr4 = (unsigned )&touch_handler;
// Endereço para execução dos serviços da interrupção do timer0
VICIntEnable |= 1<<4;
// Habilita a interrupção do timer 0
T0IR = 1; /* clear interrupt flag timer 0, match 0*/
T0TCR = 0; //desliga timer para executar as configurações
T0MR0 = (PCLCK/(1000/TMP_INT))-1;//(Valor aqui = PCLK/frequencia)-1
T0MCR = 3;// habilita interrupção no math0, e zera timer na interrupção!!!
T0PR = 0x00; //preescaler = 0;
T0TCR = 1; //liga timer para executar as configurações
}
T0TMR0 =
(PCLCK/(1000/TMP_INT))-1
(periferal clock / (1000 / tempo em ms) )-1;

Enviado:
10 Mai 2011 13:54
por allanbr
Cara, mudei aqui, coloquei o VICVectAddr = 0 e ele continua nao voltando a interrupção!!
- Código: Selecionar todos
#include <LPC213x.h>
int flag = 0;
__irq void Int1seg(void)
{
flag=1;
T0IR = 0x00000001;
VICVectAddr = 0;
}
int main()
{
int i=0;
VPBDIV = 0x00000001;
PINSEL0 |= 0x00000080;
IODIR0 = 0x03 << 12 | 0x01 << 20 | 0x01 << 23;
VICVectCntl0 = 0x20|4;
VICVectAddr0 = (unsigned)Int1seg;
VICIntEnable = 0x1<<4;
T0IR = 0x00000001;
T0TCR = 0x00000000;
T0MR0 = 0x00000003;
T0MCR = 0x00000003;
T0CTCR = 0x00000000;
T0PR = 0x013D7840;
T0TCR = 0x00000001;
while(1){
if(flag!=0)
{
IOSET0 = 0x03<<12 | 0x01 << 20 | 0x01 << 23;
while(i<500000)i++;
IOCLR0 = 0x03 << 12 | 0x01 << 20 | 0x01 << 23;
flag=0;
}
}
}
Dessa vez pedi pra que ele somente acenda os leds, para evitar possiveis problemas por causa da UART! E mesmo assim nada!
O que pode ser? Esqueci de resetar alguma flag?

Enviado:
10 Mai 2011 13:55
por allanbr
Cara, mudei aqui, coloquei o VICVectAddr = 0 e ele continua nao voltando a interrupção!!
- Código: Selecionar todos
#include <LPC213x.h>
int flag = 0;
__irq void Int1seg(void)
{
flag=1;
T0IR = 0x00000001;
VICVectAddr = 0;
}
int main()
{
int i=0;
VPBDIV = 0x00000001;
PINSEL0 |= 0x00000080;
IODIR0 = 0x03 << 12 | 0x01 << 20 | 0x01 << 23;
VICVectCntl0 = 0x20|4;
VICVectAddr0 = (unsigned)Int1seg;
VICIntEnable = 0x1<<4;
T0IR = 0x00000001;
T0TCR = 0x00000000;
T0MR0 = 0x00000003;
T0MCR = 0x00000003;
T0CTCR = 0x00000000;
T0PR = 0x013D7840;
T0TCR = 0x00000001;
while(1){
if(flag!=0)
{
IOSET0 = 0x03<<12 | 0x01 << 20 | 0x01 << 23;
while(i<500000)i++;
IOCLR0 = 0x03 << 12 | 0x01 << 20 | 0x01 << 23;
flag=0;
}
}
}
Dessa vez pedi pra que ele somente acenda os leds, para evitar possiveis problemas por causa da UART! E mesmo assim nada!
O que pode ser? Esqueci de resetar alguma flag?

Enviado:
11 Mai 2011 21:37
por luisf.rossi
Vamos la 2 pontos.
Primeiro, você teria como descrever melhor o que está acontecendo? Como você sabe que a interrupção não está acontecendo mais vezes? Você sabe que ela aconteceu pelo menos uma vez devido aos leds correto?
Segundo, a variavel flag está sendo modificada dentro da interrupção e dentro da rotina principal. Sempre declare esse tipo de variavel como "volatile", para você ter certeza que todo mundo está usando a variavel corretamente.
Eu olhei seu codigo rapidamente mas não encontrei nada, depois eu vejo melhor.