Página 1 de 1

fiq com o timer0 no lpc2148.

MensagemEnviado: 31 Dez 2006 15:08
por Red Neck Guy
Eu aproveitei a minha folga agora no final do ano pra tirar o meu kit de lpc2148 da gaveta. Como fazia tempo que não trabalhava com ele o pouco que eu cheguei a fazer esqueci completamente. Ontem por exemplo fiquei a tarde toda tentando descobrir pq o programa não ficava armazenado na flash - dái até lembrar que tem que configurar os endereços e habilitar o flash downloader foi bastante tempo....
Bom a minha duvida agora é a seguinte:
Para fazer com que o mat0.0 gere uma interrupção fiq não basta apenas configurar o VICIntSelect e o VICIntEnable e configurar o timer o como aí abaixo:
.....
T0TCR = 0x00000001; //Habilita a contagem do Timer0
T0PR = 0x000000C8; //Fator de divisão do prescaler
T0CTCR = 0x00000000; //Configura para modo de incremento a cada ciclo de PCLK
T0MCR = 0x00000003; //Configura para Interrupção por comparação e tambem para reinicar a contagem quando chegar ao valor de MR0

T0MR0+= 0x000000C8;
LPCAPI_setaFIQ(DF_VIC_TIMER_0);
......
Aquele livrinho de arm que rola por aí - escrito pelo pessoal da mosaico - é muito fraquinho.
Em primeiro lugar tem escrito claramente lá que não é necessário configurar o MAM quando se escreve código em linguagem C... - Ou o cara não soube expressar a idéia ou é tosco mesmo...

MensagemEnviado: 31 Dez 2006 16:24
por tcpipchip
Se nao me engano tens que habilitar via CPRS tambem
TCPIPCHIP

MensagemEnviado: 02 Jan 2007 20:59
por Red Neck Guy
Olha, nenhum dos códigos que achei na net habilita flag nenhum no CPSR ( usei até um intrinsic do IAR - interrup_enable - e nada)
Aparentemente está tudo certo, mas não há meio de funcionar, será que essa fiq só vai rodar aqui depois que eu comprar o livro do Fábio?
(até lá mais um monte de cabelos brancos...)

MensagemEnviado: 03 Jan 2007 08:29
por microeletronica
Aquino, o MR0 ja funcionou na IRQ e NV-IRQ?
Se nao, faz a experiencia e mande noticias.

Sobre a FIQ, continuo pesquisando...

MensagemEnviado: 03 Jan 2007 08:45
por microeletronica

MensagemEnviado: 03 Jan 2007 09:56
por Viktor
Para mudar esses bits você deve estar em modo privilegiado. Minha sugestão é você declarar SWI para manipular esses bits. Os SWI são interrupções por software e chaveiam para o modo privilegiado.
;---------------------------------------------------------------------------------------|
; void swi_disable_irq(void) |
;---------------------------------------------------------------------------------------|
__SWI_11
mrs r0,spsr
orr r0,r0,#0x80
msr spsr_c,r0
bx lr

;---------------------------------------------------------------------------------------|
; void swi_enable_irq(void) |
;---------------------------------------------------------------------------------------|
__SWI_12
mrs r0,spsr
and r0,r0,#:NOT: 0x80
msr spsr_c,r0
bx lr

;---------------------------------------------------------------------------------------|
; void swi_disable_fiq(void) |
;---------------------------------------------------------------------------------------|
__SWI_13
mrs r0,spsr
orr r0,r0,#0x40
msr spsr_c,r0
bx lr

MensagemEnviado: 26 Jan 2007 07:23
por barboza
Vou tentar dar minha primeira ajuda no mundo ARM!

Você configurou a porta como Match?
// Pino 0.22 com Match
PINSEL1 |= 0x15403000;
PINSEL2 |= 0x00000030;

Definiu a função que atende ao FIQ?

PRESERVE8
IMPORT ISR_Timer0

Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B ISR_Timer0



Veja meu exemplo abaixo!

#include <LPC214X.H>

#define XTAL 12E6L
#define M 5L
#define P 2L
#define CPUCLK (XTAL*M)
#define XCLKDIV (CPUCLK/2)

#define LAT_TIMER (XCLKDIV/10) // 100ms

__irq void ISR_Timer0 ( void )
{
// Int do MR0?
if ( T0IR & 0x00000001 )
{
// Limpe a Int
T0IR = 0x00000001;
}

}

int main ( void )
{
// Pino 0.22 com Match
PINSEL1 |= 0x15403000;
PINSEL2 |= 0x00000030;

// 100ms @ 30MHz com Toggle no 0.22 e interrupção
T0EMR = 0x00000030;
T0MCR = 0x00000003;
T0MR0 = LAT_TIMER;

// Enable timer 0
T0TCR = 0x00000001;

// Habilita FIQ no Timer0
VICIntSelect = (1<<4);
VICIntEnable = (1<<4);

while (1);
}