INTERRUPÇÃO FUNCIONA SÓ UMA VEZ

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

INTERRUPÇÃO FUNCIONA SÓ UMA VEZ

Mensagempor allanbr » 05 Mai 2011 16:24

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??????
allanbr
Bit
 
Mensagens: 6
Registrado em: 19 Abr 2011 14:10

Mensagempor fabim » 05 Mai 2011 16:44

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
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 allanbr » 05 Mai 2011 17:06

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.
allanbr
Bit
 
Mensagens: 6
Registrado em: 19 Abr 2011 14:10

Mensagempor fabim » 05 Mai 2011 17:39

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;
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 allanbr » 10 Mai 2011 13:54

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?
allanbr
Bit
 
Mensagens: 6
Registrado em: 19 Abr 2011 14:10

Mensagempor allanbr » 10 Mai 2011 13:55

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?
allanbr
Bit
 
Mensagens: 6
Registrado em: 19 Abr 2011 14:10

Mensagempor luisf.rossi » 11 Mai 2011 21:37

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.
luisf.rossi
Byte
 
Mensagens: 109
Registrado em: 28 Nov 2010 12:48
Localização: São Paulo, SP


Voltar para ARM

Quem está online

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

x