por fabim » 25 Mar 2009 09:07
Rodrigo, me deixe dar uma exempru por cima pra você poder entender.
Eu só programo com o mikroC, o jean ainda não me arrumou o compilador ANSI C de macho que me prometeu.
Void interrupt(void){
}
Basicamente ao criar isto, você esta dizendo para o compilador que a rotina de tratamento de interrupções seria o mesmo que.
void interrupt(void)Absolut org 0x04 {
}
Lembra de seus primordios de estudo, que o vetor de interrupção fica no endereço 0x04. A maioria dos pic´s adotou este endereço.
Pois bem, este endereço basicamente pode ser inserido toda uma execução de tratamento, ou simplesmente servir para chamada de outras rotinas, totalmente fora de 0x04, as quais são responsáveis pelo tratamento de ADC, SPI, I2C, USART, PSP, e etc.
Neste quesito de como se aplicar uma multi tarefa, depende muito de o que você precisa, qual a necessidade de cada processo, e como deve ser feito isso.
Vamos para um exemplo besta, o qual você pode entender bem o que eu quero dizer.
Neste exemplo o main fica livre, e as rotinas são tratadas dentro de outras rotinas chamadas pela int.
//***********************************************************
void interrupt(void){
if(interrptRB0){ trata_rb0();clr_flg;)
if(interrupt_Usart){trata_usart();clr_flg;}
if(interrupt_adc){trata_adc();clr_flg;}
Clr_flags();
intcon.gie=1;
}
void main(void){
while(1){
portd = ~portd;
delay_ms(500);
}
}
//***********************************************************
Observe o seguinte, para cada trata_interrupt();
O programa sai do main principal, e fica preso dentro desta sub rotina, o tempo suficiente para que o processo de tratamento seja finalizado, isto pode ser um grande problema, se por exemplo o tempo para finalização do tratamento for de 1S, e neste um segundo chegar dados pela serial, ainda não deu tempo de você ir lá tratalo, logo chegara outro dado, e vai sobreescrever o anterior.
Entendeu sobre velocidade e tempo de execução ?Isso complica as coisas!!
AGora observe desta forma.
//***********************************************************
_u short a,b,c;
void interrupt(void){
if(interrptRB0){a=255; clr_flg;}
if(interrupt_Usart){b=255;clr_flg;}
if(interrupt_adc){c=255;clr_flg;}
intcon.gie=1;
}
void main(void){
while(1){
if(a){ trata_rb0();)
if(b){trata_usart();}
if(c){trata_adc();}
}
}
//***********************************************************
Observe a diferença basica!!
Veja que da primeira forma,"claro que teria como ser diferente", quando você entra na int e vai tratar determinada função, você não consegue ver outras int´s pois esta ocupado demais para isto, e o INTCON.GIE não esta ativo, pois o seu processo daquele determinada int tratada não poderia ser parado.CERTO.!
Agora na segunda forma, você criou o que eu chamo como máquina de estados, você fica em um continuo scan, testando interrupções e as tratando, mesmo que esta tratando um determinado, a interrupt pode acontecer novamente, e você pode tratar rapidão outra.
Claro que se eu for explicar tudim tudim, eu vou ficar 1 semana escrevendo, mais só pra te dar uma clareada.
E não precisar escrever tudo sobre SEXO aqui dentro.
[ ].
fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!