VIC - vetor e controle

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

VIC - vetor e controle

Mensagempor fabim » 10 Ago 2009 12:00

Amigos,
Estou aqui tentando "compreender", e não copiar o exemplo.
Vejam o codigo a baixo..

Código: Selecionar todos
__irq void T0_IRQHandler (void) {
  unsigned short flag;
/*gerar um clock de 5khz*/
 if(flag){
 IOSET = 1;
 flag = 0x00;

 }else{
 IOCLR = 1;
 flag = 0xff;

 }
 

 T0IR        = 1;       /* zera flag de interrupção*/
 VICVectAddr = 0;  /* zera registrador que indica canal que gerou int*/
}

void init_tmr0(void){
  /* INICIALIZAÇAO DA INTERRUPÇAO PELO TIMER 0 */
T0MR0         = 1199; /* 100uS at 12.0 MHz */
T0MCR         = 3;    /*abilita e cria interrupt em MR0*/
T0TCR         = 1;    /* liga timer0*/
VICVectAddr0  = (unsigned long)T0_IRQHandler;/* coloca endereço*/
VICVectCntl0 = 0x24; /*liga IRQ, canal 4 tmr0*/
VICIntEnable |= 0x20; // abilita int do tmr0 canal 4


pelo que eu consegui compreender.

VIC"ENDEREÇO"0....15.{
Escrevo neste registrador, o endereço da rotina que vai ser apontada,
}QUE:{
VIC"CONTROLE"0....15
Esta com o bit5 IRQ em 1, e os BITS 0..4, cuja valor esta apontando para qual canal vai acionar a interrupção, que no meu caso é o canal 4}

Lembrando que devo abilitar o bit do TMR0 no registrador
VICIntEnable, para que seja ligado o canal que irá para o barramento que gera a interrupção.

É isto mesmo ?

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 austrax » 10 Ago 2009 13:07

VICVectAddr = Endereço onde se encontra a rotina de tratamento da interrupção.

VICVectCntl = Seleciona e habilita um slot especifico. 5 bits de seleção e 1 bit de habilitação. Quanto menor o número do slot, maior será a prioridade da interrupção

VICIntEnable = Habilita a interrupção para um periférico específico.
Editado pela última vez por austrax em 10 Ago 2009 14:20, em um total de 1 vez.
"Corte sua própria lenha. Assim, ela aquecerá você duas vezes." (Henry Ford)
Avatar do usuário
austrax
Byte
 
Mensagens: 139
Registrado em: 04 Mai 2007 20:10

Mensagempor fabim » 10 Ago 2009 13:24

austrax escreveu:VICVectAddr = Endereço onde se encontra a rotina de tratamento da interrupção.

VICVectCntl = Seleciona e habilita um slot especifico. 4 bits de seleção e 1 bit de habilitação. Quanto menor o número do slot, maior será a prioridade da interrupção

VICIntEnable = Habilita a interrupção para um periférico específico.


Pois intão Daví.
VICVectCntl
Eu estou olhando o manuél userotário.
São 5 bits de seleção do canal, e 1 bit de abilitação de IRQ.
Bit´s 0...4 para canal.
Bit 5 abilita ou desabilita.

Pelo que eu observei, aqui na tabela.

no meu caso quero que
VICVectAddr0 = &rotina de tratamento de TMR0;
VICVectCntl0 = canal 4 = TMR0// e bit5 = 1 = liga chamada de IRQ
VICIntEnable = 1<<4, liga flag que abilita int por comparação do MR0
PCONP = 1 - abilita periferico relativo ao timer0

Bom se eu bem entendi,:
VICVectCntl0= seleção de qual flag vai gerar a int para que o VICVectAddr0 seja executado chamando a rotina que esta sendo apontada.
VIDE tabela, com indicação de numero de canal com seu distinto flag.

É isto mesmo ?

Abraços

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 austrax » 10 Ago 2009 15:39

No caso você define quais periféricos irão utilizar interrupção, qual a prioridade de cada periférico no atendimento das mesmas e qual será a designação da rotina de tratamento.
Temos 16 slots de prioridade e cada um tem um vetor de endereçamento e de controle


Então a habilitação da interrupção do periférico (canal) você faz no VICIntEnable
Ex. VICIntEnable = 0x00008000; //(EINT1)

A selecão de prioridade para este periférico (canal) você faz no VICIntCntl[slot].
Por exemplo prioridade 0... logo slot 0. Então configuro o canal correspondente nesse slot, referente ao periférico. Como a EINT1 coresponde ao canal 15 então temos que setar os bits 0,1,2 e3 e o bit 5 que habilita
Ex. VICIntCntl0 = 0x0000002f;

O endereço da rotina de tratamento no VICIntAddr[slot]
Ex. VICIntAddr0 = (unsigned long) EINT1_Int;
"Corte sua própria lenha. Assim, ela aquecerá você duas vezes." (Henry Ford)
Avatar do usuário
austrax
Byte
 
Mensagens: 139
Registrado em: 04 Mai 2007 20:10

Mensagempor fabim » 11 Ago 2009 08:37

Tõim õim õim... aff.
Agora tendeu daví..

VICVectAddr[0]
VICVectCntl[0]

os dois aí de cima são irmãos, e são os primeirões de qualquer coisa.


VICVectAddr[15]
VICVectCntl[15]

os dois aí de cima também são irmãos, só que são os ultimos da fila..

Sendo assim, os irmãos [0], tem uma prioridade maior que os irmãos [15].
Se por exemplo eu selecionar os dois, irmãos [0] e irmãos[15], para a mesma interrupt INT0, porêm para rotinas vetorizadas distintas, quando houver o int por INT0, os irmãos [0] vão ser os primeiros a perceber....

tendeu agora ?

Abraços Daví..
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 Djalma Toledo Rodrigues » 11 Ago 2009 10:25

Isso são todos irmãos porém, com alturas diferentes :D
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor tcpipchip » 11 Ago 2009 11:01

E FIQ, quando usar?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor fabim » 11 Ago 2009 11:19

tcpipchip escreveu:E FIQ, quando usar?


Bom, pelo que eu entendi no the book is on the table arm7 in portujêis.

O FIQ tem prioridade, sobre os IRQ´s.

Se o vetor FIQ e IRQ[0], acontecerem simultaneamente, o FIQ vai ser tratado primeiro que o IRQ.

Ou se ja estiver tratando uma IRQ no vertor[0...15], e acontecer uma FIQ, ele deixa de tratar a IRQ vai lá tratar a FIQ, e volta novamente para IRQ.

Por exemplo, em um botão de panico, que tem a maior prioridade sobre tudo.
Ele deve ser vetorizado por exemplo pela INT1, e FIQ.
seja qual for a IRQ, ou o que ele estiver fazendo, ele para, e em +/- 200nS ele vai tratar a rotina vetorizada pelo FIQ, depois volta para onde estaja, seja um vetor IRQ ou o main.

Bom eu didaticamente, consegui compreender dessa forma.

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 tcpipchip » 11 Ago 2009 11:47

Bem,

Entao deve ser mais para interrupts com maior prioridade, como exemplo, DMA...certo ?

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor fabim » 11 Ago 2009 11:52

tcpipchip escreveu:Bem,

Entao deve ser mais para interrupts com maior prioridade, como exemplo, DMA...certo ?

TCPIPCHIP


BEM-2°, eu ainda não sei se o DMA tem interrupt por termino de transferencia.
O LPC2103 tem DMA não sinho.

Mais no caso, de por exemplo, tu estar usando o DMA em pingpong, para alimentar uma matriz de geração de imagem.
Se existir int de final de transferencia, o FIQ deve ser configurado para o DMA X. Caso contrario, dependendo do processo tu vai ter uma imagem robozinho com strobo..rsrs

Se eu bem entendi, deveria ser assim.
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!!!?


Voltar para ARM

Quem está online

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

x