Página 1 de 1
Usar duas interrupções FAST

Enviado:
14 Set 2007 16:17
por filipespc
Eu estou fazendo um programa que usa duas interrupções externas e uma por timer... eu queria que a interrupção por timer não fosse capaz de interromper as interrupções externas. Pensei em colocá-las como FAST (eu programo em C).
O problema é que o compilador não está deixando eu colocar as duas interrupções como FAST.
a mensagem de erro é: "Too many fast interrupt handlers have been defined"
Eu dei uma boa lida no datasheet, e não entendi pq as duas não podem ser FAST.
Grato, Filipe
Re: Usar duas interrupções FAST

Enviado:
14 Set 2007 16:22
por andre_luis
Porque o PIC possui apenas um vetor de interrupção.
FAST é aquela cujo flag será analizado primeiro.

Enviado:
14 Set 2007 16:29
por filipespc
Na verdade, eu estou usando um PIC18f452
Esse PIC tem dois vetores de interrupção, o FAST serve justamente para colocar a interrupção no de mais alta prioridade.
a ordem das interrupções é definida pela diretiva #priority
Me corrija se eu estiver enganado

Enviado:
14 Set 2007 16:43
por andre_luis
filipe,
Pelo que voce está reportando, aparentemente essa diretiva FAST só acita mesmo uma entrada de parametro.
Talvez voce tenha que contornar isso, usando a diretiva #PRIORITY, que lamentavelmente atribuirá prioridades diferentes à interrupcoes de mesma relevancia.
Mas, voltando à diretiva FAST, voce nao concorda que soa meio esquizito, definirmos 2 interrupções como de prioridade igual, se apenas 1 delas será tratada por vez ? Qual delas o programa irá escolher em tempo de execução ? ( Só estou usando a intuição )
Só pra refletir....
+++

Enviado:
14 Set 2007 18:39
por filipespc
André,
As interrupções FAST não são de mesma prioridade... Assim como as interrupções comuns, a prioridade entre elas é definida pela ordem em que as flags de interrupção são verificadas.
O que as diferencia das outras interrupções é que elas podem interromper uma rotina de interrupção que não seja FAST que esteja em andamento.
Isso acontece porque passam a existir dois flags para habilitar interrupções globais, o GIEH e o GIEL. Quando uma interrupção que não é FAST está sendo tratada, a flag GIEL é resetada, inibindo a ocorrência de outras interrupções não FAST. Porém, a GIEH continua setada, fazendo com que interrupções FAST possam interromper o tratamento de uma interrupção em andamento. Já o contrário não ocorre, quando a flag GIEH está resetada, as interrupções não FAST também ficam desabilitadas, não acontecendo nada se algum evento ocorrer.
Isso pelo menos foi o que eu entendi do datasheet.

Enviado:
17 Set 2007 15:09
por filipespc
Ninguém que tenha tido um problema parecido pode me ajudar?