Senhores, alguem me ajude, estou mais perdido que custo em tiroteio...
Consegui colocar o timer do 2103 para funcionar beleza, porem quando fui usar a interrupção começou a dar pau...
Procurando material encontrei um exemplo neste forum e com isto montei o seguinte condigo adiante:
#include "includes.h"
__irq __arm void IRQ_Handler (void);
void NonVectISR(void);
void InitVectors(void);
void TIMER_IRQ(void);
unsigned char ciclo=0;
int main()
{
//Configura PLL
PLLCFG= 0x00000023; //Como Clock= M * cristal, neste caso cristal= 14.7456MHZ
//O maximo M possivel é 4, que dará um clock de 58.9824MHZ
//Pois o maximo clock do 2103 é 70MHZ, desta forma
//M=4 e P= 2, no PLLCFG vai o MSEL e PSEL, sendo MSEL=M-1
//e PSEL= P-1, MSEL[4:0] e PSEL[5:6]
PLLCON= 0x00000001; //Habilita a PLL
PLLFEED= 0x000000AA; //Atualiza os registradores
PLLFEED= 0x00000055;
while(!(PLLSTAT&0x00000400)); //Testa o BitLock da PLL
PLLCON= 0x00000003; //Conecta a PLL
PLLFEED= 0x000000AA; //Atualiza os registradores
PLLFEED= 0x00000055;
APBDIV= 0x00000002; //Configura o divisor APB para 14.7456MHZ
//Clock/4
//Configura os pinos de porta
PINSEL0= 0x00000000;
PINSEL1= 0x00003000;
IODIR = 0x0000FFFF;
IOSET = 0x0000FFFF;
//Rotina do Timer...
//Reseta e mantem desabilitado do Timer
T0TCR= 0x00000002; //Bit 0= Habilitação, Bit 1= Reset
//Configura o timer para pulsos internos
T0CTCR= 0x00000000; //Bits 0 e 1 00= pulsos internos
//Configura o valor do preescaler do contador
T0PR= 0x00001000;
//Configura o valor de comparação do canal 0
T0MR0= 0x00000FFF;
//Programa o modo de comparação do contador
T0MCR= 0x00000003; //Bit 0= Habilita a interrupção do canal 0, Bit 1= Habilita o reset quando ocorre uma iguldade
//Mantem desabilitado os modos captura
T0CCR= 0x00000000;
//Configura o pino de saida do canal 0
T0EMR= 0x00000031;
//Habilita o timer para contagem..
T0TCR= 0x00000001;
//Inicia os vetores de interreupção
InitVectors();
VICIntSelect= 0;
VICVectAddr0 = (unsigned)&TIMER_IRQ;
VICVectCntl0 = 0x24;
VICIntEnable= 0x10;
while(1);
}
void InitVectors()
{
VICIntSelect = 0;
VICIntEnClear = 0xFFFFFFFF;
VICSoftIntClear = 0xFFFFFFFF;
VICProtection = 0;
VICDefVectAddr = 0;
VICVectAddr = 0;
VICVectAddr0 = 0;
VICVectAddr1 = 0;
VICVectAddr2 = 0;
VICVectAddr3 = 0;
VICVectAddr4 = 0;
VICVectAddr5 = 0;
VICVectAddr6 = 0;
VICVectAddr7 = 0;
VICVectAddr8 = 0;
VICVectAddr9 = 0;
VICVectAddr10 = 0;
VICVectAddr11 = 0;
VICVectAddr12 = 0;
VICVectAddr13 = 0;
VICVectAddr14 = 0;
VICVectAddr15 = 0;
VICVectCntl0 = 0;
VICVectCntl1 = 0;
VICVectCntl2 = 0;
VICVectCntl3 = 0;
VICVectCntl4 = 0;
VICVectCntl5 = 0;
VICVectCntl6 = 0;
VICVectCntl7 = 0;
VICVectCntl8 = 0;
VICVectCntl9 = 0;
VICVectCntl10 = 0;
VICVectCntl11 = 0;
VICVectCntl12 = 0;
VICVectCntl13 = 0;
VICVectCntl14 = 0;
VICVectCntl15 = 0;
}
void NonVectISR(void)
{
while(TRUE); // Se chegar aqui seu programa está com super paus!
}
__irq __arm void IRQ_Handler (void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector; // Call MM_TIMER0_ISR thru pointer
(*interrupt_function)(); // Call vectored interrupt function
VICVectAddr = 0; // Clear interrupt in VIC
}
void TIMER_IRQ(void)
{
T0IR|= 0x00000001;
if(ciclo)
{
IOCLR= 0x000000FF;
ciclo--;
}
else
{
IOSET= 0x000000FF;
ciclo++;
}
VICVectAddr = 0;
}
O problema é que quando mando compilar ele acusa o seguinte erro:
Error[Pa046]: function type has no prototype
Este erro esta na linha: (*interrupt_function)();
O CSTARTUP.S79 creio que esteja ok...
Alguem imagina o porque disso?
Gabriel