Interrupção e Timer no IAR

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Interrupção e Timer no IAR

Mensagempor andreumberto » 16 Fev 2010 22:47

Olá pessoal, eu estou tendo problemas em utilizar e entender o IAR na utilização do Timer e interrupção. Eu sou cabaço ainda nesta área mas estou me esforçando.
Tenho o livro de Daniel Rodrigues de Sousa "O Poder dos 32 bits", e estou tentando fazer os exercícios do livro.
Eu fiz programei bastante com 8051 onde o atendimento a uma interrupção é dentro de uma rotina, que após vc processar a interrupção ele retorna para onde estava processando.
Bom, com o IAR tem um monte de funções e arquivos .h complexas que dá um nó na cabeça.
A minha duvida é a seguinte, onde será o atendimento da interrupção do timer?
No meu programa tenho uma chamada de função "delay_1ms_x(5)" que faz as configurações e habilita a contagem do timer, certo? e depois? para onde vai o meu programa? onde vou fazer o processamento do atendimento da interrupção?

void main( void )
{
delay_1ms_x(5)
}


void delay_1ms_x(unsigned int x)
{
T0MR0 = x * 0x000000C8; //CARREGA T0MR0
T0IR |= 0x00000001; //LIMPA FLAG DO T0MR0
MA_Start_TIMER(0,1); //LIGA TIMER

}

Outra coisa que não entendo no IAR é as chamada de funções MA_Init_xx();

MA_Init_VIC();
MA_Init_PCB();
MA_Init_GPIO();
MA_Init_UART0();
MA_Init_UART1();
MA_Init_I2C();
MA_Init_SPI();
MA_Init_TIMER();
MA_Init_PWM0();
MA_Init_ADC();
MA_Init_RTC();
MA_Init_WDT();
MA_Init_PCB();
MA_Init_GPIO();
MA_Init_TIMER();

Todas as inicializações estão prontas no IAR?

Desculpa pessoal talvez para vcs estas duvidas possam ser ridícula mas realmente estou com problemas para entender isso, preço para que me dêem uma ajuda com isso.
Abraços.
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor fabim » 17 Fev 2010 19:24

Andre assim.

O NXP, diferente de PIC ou 8051 ou outros.
Tem 2 formas de tratar interrupção.
1°- de forma vetorada.
2°- vetor universal, igual o ORG 0x04 dos pics.

Cada tipo de interrupção, pode ser adicionada na vetorização em até 16 no caso do 2368 "se eu bem me lembro".

Fora que tem o VIC, etc.

Acho que você deveria olhar primeiro o user manual, pra depois mecher com o IAR/CCS..rs

Sempre que tiver com duvidanhas, de uma zoiada no user manual, la ele explica nome dos registradores, funções, e como funciona.
O UM da NXP doi pra entrar só da primeira vez, conforme for lendo outros capitulos tu vai ver que os UM´s são na verdade bem simples de serem entendidos.
Agora Pelo amor de DEUS.
LEMBRE-SE, OPTE SEMPRE POR UTILIZAR COMPILADORES ANSI-C, E JAMAIS USE MAKROS DE COMPILADOR.
1° que a portabilidade fica uma bosta, segundo que tu não vai aprender P**** denhuma do componente, terceira que se der algum pau por masi simples que for tu não vai conseguir achar com facilidade!!!

Abraços
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 andreumberto » 18 Fev 2010 08:50

Valeu fabim o brigado pela sua ajuda.

Eu realmente prefiro fazer tudo no braços mesmo para poder encontrar os possiveis problemas, não gosto tambem utilizar rotinas prontas, é que eu já tava surtado pensando que as interrupções do IAR só funciona com esta tal de MA_Init_TIMER();.
Eu já fiz com o meu arm ligar leds ler teclado um Display já to usando o RTC, mas preciso utilizar o Timer senão o meu programa vai ficar uma verdadeira bosta. já tá uma bosta, pois como não estava conseguindo gerar a interrupção do bicho tava fazendo gambiarra das braba.

Estou querendo ler a porta P0.16 contar um tempo e ligar um led que está na porta P0.23
fabim, dá uma olhada no que eu possa estar fazendo de errado no meu programa. O problema é que ele não está entrando na interrupção.

__irq __arm void T0isr(void); //protótipo da função

void main(void)
{
VPBDIV = 0x00000001; // Config PCLK para 20Mhz
PINSEL1 = 0x00000003; //Captura 0.2 Timer1

T1PR = 0x000004E20; //Configura prescaler
T1TCR = 0x00000002; //Reinicia cont. Prescaler
T1CCR = 0x00000005; //Captura borda de subida
T1TCR = 0x00000001; //habilita o timer

VICVectAddr4 = (unsigned) T0isr; //Config. o endereço do vetor
VICVectCntl4 = 0x00000024; // Seleciona canal
VICIntEnable = 0x00000010; //habilita interrupção

while(1);
}

__irq __arm void T0isr(void)

{
IO0SET= IO0SET | P0_23; //Liga a saída P023

T1IR |= 0x00000001; //Limpa fla da interrup.
VICVectAddr = 0x00000000; //Finaliza a interrup.

}

Abraços.
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor tcpipchip » 18 Fev 2010 09:18

Código: Selecionar todos
   'BNU-12-03-2004
   Dim TIMER1_counter as integer
   Dim Stat_Init_Timer1 as boolean
   
   sub main()
       Stat_Init_Timer1 = init_TIMER1()
       Do
       loop while 1 = 1
   end sub
   
   function init_TIMER1() as boolean
    TIMER1_counter = 0
    T1MR0 = &H0001FFFF
    T1MCR = 3                
    init_TIMER1 = __hbbr_install_irq(TIMER1_INT, AddressOf irq_TIMER1)
    VICIntEnable = VICIntEnable Or &b00100000     
    Call __hbbr_enable_irq()
         T1TCR = 1   
   End function
   
Irq irq_TIMER1()
    Print #0,"Ocorreu interrupt"
    T1IR = 1         
    TIMER1_counter = TIMER1_counter + 1
    VICVectAddr = 0
End irq


Talvez te ajude...so que fiz em Basic...para o TIMER 1
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor fabim » 18 Fev 2010 09:43

Se eu perguntar algo, não vai se ofender ?

1° Qual modelo esta utilizando ?
2° não entendi aquela rotina dentro do main, e ainda com um while, e ainda o IAR deixou você fazer aquilo ? carilho !!!!!!!

Fabim
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 andreumberto » 18 Fev 2010 10:01

to usando o lpc2138.
o while fica um loop infinito e o resto é as as configs para a interrupção.
Porque? tá muito doido este negocio?

então
eu tava lendo o "User Manuel" que disse se eu estiver usando o mode Thumb devo usar #pragma com o endereço do vetor

eu tva revisando aqui e tava errado o VICVectCntl4 = 0x00000015; e o
VICIntEnable = 0x00000020;
já fiz as correções mas assim mesmo não funfiou..

me diz uma coisa, quando eu uso o PINSEL0 = 0x00000003 digo que ele vai operar no modo de Capture ou devo colocar ele como Match. O que é Capture e Match?

VPBDIV = 0x00000001;
PINSEL1 = 0x00000003; //Captura 0.2 Timer1

T1PR = 0x000004E20; //Configura prescaler
T1TCR = 0x00000002; //Revisar...
T1CCR = 0x00000005;
T1TCR = 0x00000001;

VICVectAddr4 = (unsigned) T0isr;
VICVectCntl4 = 0x00000015;
VICIntEnable = 0x00000020;


#pragma vector=0x38
__irq __arm void T0isr(void)
{
IO0SET= IO0SET | P0_23; //Liga a saída P021

T1IR |= 0x00000001;
VICVectAddr4 = 0x00000000;

}
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor fabim » 18 Fev 2010 10:07

capture é para capturar tempo, como se fosse um cronometro.

MATCH é um comparador,: Por exemplo o timer 1, ele trm 4 matchs.
Tu pode por exemplo criar 4 tempos diferentes de execução, sendo que o ultimo match irá zerar o timer1.
E ocorrerá 4 interrupções!!
Sacou ?

Tu esta no caminho certo, só não estou sacando o porque de você usar thumb num troço com 256K de flash...
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 andreumberto » 18 Fev 2010 10:19

o IAR que tenho vai só até 32k.
vou tentar mudar isso para fazer um teste.

Eu tava entendendo que Capture é para pegar uma porta de entrada, tipo assim, uma chave.
Então estou errado na minha interpretação.

Então Capture é quando ele chegar a um valor configurado no T0PR atende a interrupção?
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor MarcusPonce » 18 Fev 2010 11:49

Na função que atende a interrupção você colocou:
T1IR |= 0x00000001;
Serve para resetar o pedido de interrupção específico dentre os vários tipos que o T1 pode gerar. Portanto você está querendo zerar uma interrupção que ocorra quando acontecer um match no canal 0 do Timer1, ok ?
Então está faltando configurar o T1MCR: tem que setar o bit 0 para poder gerar a interupção que você quer.

Uma dica: sugiro que você mude o nome da função que atende a interrupção para T1isr, pois está nos últimos posts está usando o T1 e não o T0, que estava usando no início.
MarcusPonce
Byte
 
Mensagens: 166
Registrado em: 12 Fev 2007 13:58
Localização: Campinas - SP

Mensagempor andreumberto » 18 Fev 2010 12:57

Ponce, na verdade T1IR |= 0x00000001; é para zerar a flag do atendimento.
Eu já mexi tanto nisso que to misturando as coisas. Isso que vc falou eu encontrei um erro.

O que estou querendo fazer é utilizar o modo Captura, isso é, quando eu acionar um botão deve contar um tempo e ligar um led.
O led vai ligar quando atender a interrupção.

como estou usando o modo Captura no canal 0 o valor correto do T1IR deve ser 0x00000010; que corresponde ao bit 4 certo?

Ponce, vc tem algum codigo de timer que possa me enviar como exemplo?
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor andreumberto » 18 Fev 2010 15:07

alguem ai utiliza o IAR?
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor MarcusPonce » 19 Fev 2010 00:20

Ok, então a linha que você já tinha colocado
T1CCR = 0x00000005;
está realmente armando a interrupção para quando ocorrer a captura 0 do T1, como você está querendo.

Infelizmente não trabalho com IAR... Não sei se em seu código falta algo.

Você reparou que o comentário desta linha está diferente do código ?
IO0SET= IO0SET | P0_23; //Liga a saída P021

Outro problema em potencial:
VICVectAddr4 = 0x00000000;
Parece que após disparar uma vez a interrupção, o endereço registrado como início da função que trata ela vai ser zerado, a idéia é esta mesmo ?
MarcusPonce
Byte
 
Mensagens: 166
Registrado em: 12 Fev 2007 13:58
Localização: Campinas - SP

Mensagempor andreumberto » 19 Fev 2010 14:35

galera, é possivel queimar um timer? "que pergunta babaca né!!?"
mas sei lá...
eu mudei o meu programa para o Keil, e no Debug tá rodando tudo inclusive a interrupção. Mas quando eu gravo ele no MC não funciona.
Quando gera o pedido da interrupção eu mando ligar um led mas não acende e quando eu coloco a mesma porta dentro do while que é a rotina principal ele funfia.
e agora oque faço? vou vender o kit e comprar uma bicicleta, heuhueuheu

Segue a rotina que estou usando a baixo, mas agora rodando em Keil

#include <lpc21xx.h>
__irq void x0(void);
int main(void)
{
IO0PIN=0x00000000; //Inicializa o GPIO em 0

//======================================
//Inicia Saidas para os LEDs
//======================================
IO0DIR = IO0DIR | 0x80000000; //Configura porta P0_31 como saida LED
IO0DIR = IO0DIR | 0x00800000; //Configura porta P0_23 como saida LED
IO0DIR = IO0DIR | 0x00400000; //Configura porta P0_22 como saida LED
IO0DIR = IO0DIR | 0x00200000; //Configura porta P0_21 como saida LED

//Teste Andre interrupção timer Ciomparação
VPBDIV = 0x00000001;
PINSEL1 = 0x00000800; //Bits 10 e 11 P021 PWM5

T0PR = 0x0000001E; //Carrega o Prescaler ...001E
T0TCR = 0x00000002; // Reseta o conteudo do timer0
T0MCR = 0x00000003; // config o modo comparação...

T0MR1 = 0x00000010;
T0MR2 = 0x00000008;
T0EMR = 0x00000042;

T0TCR = 0x00000001; //lIGA O TIMER

VICVectAddr4 = (unsigned long) x0;
VICVectCntl4 = 0x00000024;

VICIntEnable = 0x00000010;

while(1)
{
IO0SET = IO0SET | 0x00800000; //Liga a saída P023
}
}


//interrupção
__irq void x0(void)
{
IO0SET = IO0SET | 0x00400000; //p0.22

T0EMR |= 0x00000002;
T0IR |= 0x00000001;
VICVectAddr = 0x00000000;

T0TCR = 0x00000002;

}
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor andreumberto » 19 Fev 2010 14:45

só uma perguntinha, o que eu faço com o registrador PINSEL quando eu quero trabalhar sem evento externo?
tipo assim quero somentte quando tiver overflow do timer.

Abraços.
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51

Mensagempor andreumberto » 01 Mar 2010 10:00

Pessoal, resolvido os problemas era eu que estava doido. Tava fazendo varias besteiras para gerar a interrupção. Mas agora já tá funcionando e acho que já entendi o modo de funcionamento.
Outra coisa, mudei o meu programa todo para o Keil muito melhor que o IAR.
Agora tenho que gravar dados na memoria flash, tem algum tópico aqui sobre isso?

Valeu pessoal muito obrigao pela ajuda de vcs.
andreumberto
Bit
 
Mensagens: 24
Registrado em: 07 Abr 2007 01:51


Voltar para ARM

Quem está online

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

x