TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado 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
-
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