Mexendo com EINTs LPC2148

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Mexendo com EINTs LPC2148

Mensagempor styg » 09 Fev 2007 15:50

Dai pessoal, agora que comecei a mexer com ARM fui testar as int externas.
Tentei fazer algo que fazia com os AVR mas nao funcionou, dai fiz uma gambiarra e funfou, v oq vcs acham.

É uma int pra uma tecla, quando aperta ele vai pra int e faz o teste se a chave realmente foi apertada, depois de um delay.

#define KEY1 (IOPIN0 & (1<<P0_16))

void key_1(void) __irq
{
// da um delay para debounce
arm_delay_ms(DEBOUNCE_TIME);
PINSEL1 &= 0xFFFFFFFC; // gambiarra para testar pino
if(!KEY1)
{
arm_lcd4_esc_l(LANG*21,L1,0);
while(!KEY1){}
}
PINSEL1 |= 0x00000001; // saindo da gambiarra...
VICVectAddr = 0xFFFFFFFF;
}

tava testando isso sem alterar o reg PINSEL, mas quando o pino ta selecionado para int ele trava e nao consigo fazer a leitura dele..
pensei em fazer assim e resolveu.
alguem ja fez isso, ou tem outra maneira de resolver o problema???

aguardo sugestoess..
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor tcpipchip » 09 Fev 2007 16:27

Lucas,
Consegues colocar o programa completo...
Tá confuso o queres fazer
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor styg » 09 Fev 2007 16:32

mas a parte que tem o problema esta toda ai..
nao tem nada a mais
deixei um while(1) na main() e fica aguardando a interrupção externa causada por uma chave na EINT0.
essa é a rotina de int da chave

comentei pra ficar mais claro:

void key_1(void) __irq
{
// da um delay para debounce
arm_delay_ms(DEBOUNCE_TIME);
// altera função da P0.16 para GPIO
PINSEL1 &= 0xFFFFFFFC;
// testa se tecla realmente esta apertada
if(!KEY1)
{
arm_lcd4_esc_l(LANG*21,L1,0);
while(!KEY1){}
}
// retorna função da P0.16 para EINT0
PINSEL1 |= 0x00000001;
// limpa flag da EINT0
EXTINT = 0x01;
VICVectAddr = 0xFFFFFFFF;
}
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor jeanfernandes » 09 Fev 2007 18:13

Bonecona

Antes de habilitar a bixa como entrada num seria interessante escrever 1 na porta nao ?

Fuiz.
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor jeanfernandes » 09 Fev 2007 18:14

Eu fiz uma rotina pra ler uma chave sem interrupcao ficou buenas
podemos discutir isso num momento propicio.

Agora meu jovem
Poe ae as declaracoes dos REG's que voce usou pra configurar a INT Externa valew ?

Jean
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor jeanfernandes » 09 Fev 2007 18:28

Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor styg » 10 Fev 2007 11:05

ok, jean, tai ocompleta entao:
nao escrevo '1' enquanto saida pq na placa já tem resistor de pullup.

PS. soh lembrando, minha intenção é saber o que voces acham da alteração do reg PINSELx para poder ler o estado da entrada!! agradeço ;p

#define KEY1 (IOPIN0 & (1<<P0_16))

void main(void)
{
VICIntEnable = 0x0003C000; // habilita eint0..3
VICVectCntl1 = 0x0000002E; // ativa slot irq para EINT0
VICVectAddr1 = (unsigned long) key_1;
INTWAKE = 0xC02F; // todas as ints externas tiram do powerdown
EXTMODE = 0x0F; // todas as eints por borda
EXTPOLAR = 0x00; // todas as eints por borda de 'descida'
EXTINT = 0x0F; // zera flags de todas eints

while(1)
{

}
}

void key_1(void) __irq
{
// da um delay para debounce
arm_delay_ms(DEBOUNCE_TIME);
PINSEL1 &= 0xFFFFFFFC; // gambiarra para testar pino
if(!KEY1)
{
arm_lcd4_esc_l("jean boneca");
while(!KEY1){}
}
PINSEL1 |= 0x00000001; // saindo da gambiarra...
// limpa flag da EINT0
EXTINT = 0x01; // adicionado (só stava entrando uma vez na int)
VICVectAddr = 0xFFFFFFFF;
}
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor styg » 10 Fev 2007 11:15

é de acordo com o link que o jean deixou tah certo isso sim..

>
> Anyway, our work around was to temporarily reconfigure the pin as
> GPIO, read its value, and reconfigure back as EINT3 whenever we
> wanted to read it. This works just fine.
>

mas pode causar um probleminha..

>
> However, it introduced problem number two: depending on the mode of
> the interrupt and the state of the pin, the action of changing it
> to GPIO and back again can itself generate a (spurious) interrupt.
> That is, you can get an interrupt even though there's been no
> transition on the actual pin. We then changed the function to do
> the read, so that it disabled interrupts, switched the pin to GPIO,
> read the value, switched to EINT3, reset the pending interrupt
> generated and re-enabled interrupts. Again, this works, if a bit
> long-winded.
>

teh mais
valeu jean
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.


Voltar para ARM

Quem está online

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

cron

x