TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: ionhs en 19 de Abril de 2011, 06:04:30

Título: Duda 8051 interrupciones timer
Publicado por: ionhs en 19 de Abril de 2011, 06:04:30
Estoy peleándome con las interrupciones. Tengo programada una interrupción en el temporizador 1 para cuando haga overflow. Lo hace correctamente el problema es que tras la interrupción cuando vuelve al programa principal vuelve a entrar a la interrupción de temporizador 1. vuelve a ejecutarse al interrupción y al salir continua el programa principal sin problemas.

Le he dado vueltas y no entiendo porque realiza 2 veces la interrupción. Porque cuando hace overflow se activa el TF1 y al entrar en la interrupción, el TF1 se desactiva. No se si hago algo mal o es cosa del simulador. Os dejo el código por si veis algo:


$MOD51   ; This includes 8051 definitions for the Metalink assembler

ZERBAIT   EQU      20H
BESTE   EQU      30H

      ORG   00H
      LJMP   30H   
   
      ORG   13H       ;interrupcion int1
      LJMP   INT_EX1   

      ORG   1BH       ;interrupcion timer1
      LJMP   INT_ET1   

      ORG   30H   ;Programa principal

      SETB   EA   
      SETB   EX1   
      SETB   ET1   
      CLR   PX1   
      SETB   PT1   

      MOV   TMOD,#10H   
      SETB   TR1
      MOV   TH1,#0FFH
      MOV   TL1,#00H

BUCLE:   MOV   A,R0   
      ADDC   A,#ZERBAIT
      JMP   BUCLE
      

INT_EX1:            
      PUSH   ACC   
      PUSH   PSW
      
      MOV   A,#BESTE   
      CLR   C
      
      POP   PSW   
      POP   ACC   
      RETI

INT_ET1:            
      PUSH   ACC   
      PUSH   PSW
      
      CLR   ET1   ;Esto está de sobra pero sino se repite dos veces la interrupción del temporizador 1

      ADD   A,#BESTE   
      DA   A

      POP   PSW   
      POP   ACC
      RETI


NOP

END
Título: Re: Duda 8051 interrupciones timer
Publicado por: hector.ar en 22 de Abril de 2011, 17:12:31
No estas borrando el flag de desbordamiento del timer 1 y tampoco "recargas" el timer 1.
Deberia ser algo asi (la parte de la interrupcion del timer1):

INT_ET1:           
      PUSH   ACC   
      PUSH   PSW
     
      CLR   ET1   ;Esto está de sobra pero sino se repite dos veces la interrupción del temporizador 1
     
;modificacion
      CLR     TF1       ;inicializa overflow flag de timer 1 (quizas sea lo mismo que la linea anterior, no recuerdo que es ET1)
      MOV   TH1,#0FFH ;recargo el timer
      MOV   TL1,#00H



      ADD   A,#BESTE   
      DA   A

      POP   PSW   
      POP   ACC
      RETI

Saludos!
Héctor