TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: robotdoblador en 30 de Noviembre de 2007, 10:35:00
-
Hola a todos.
Tengo hecha ya la migración y me compila sin problemas, pero a la hora de simular el código no genera las interrupciones.
A ver si algún alma cándida me puede echar una mano.
He seguido el tutorial de microchip (an1050) y no sé qué puede ser.
La simulación del código antes de migrar (16c621) me funciona sin problemas.
A continuación os dejo el código.
Un saludo,
Raúl
; LIST P=16C621
; INCLUDE "P16C621.INC"
LIST P=18F1220
INCLUDE "P18F1220.INC"
; RADIX HEX
; __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
CONFIG OSC = HSPLL, PWRT = On, WDT = OFF
; CONFIG OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;
; CBLOCK 0x20
CBLOCK 0
FactorAlto
Entrada
Variable_Marca
Contador_Bucle_INTERNO
Contador_Bucle_EXTERNO
Contador_ON_OFF
Guarda_W
Guarda_STATUS
ENDC
TMR0_CARGA EQU -d'38'
ALTO_CERO_GRADOS EQU d'610'
TIEMPO_PATRON EQU d'5'
FACTOR_MINIMO EQU ALTO_CERO_GRADOS/TIEMPO_PATRON
#DEFINE Salida PORTA,0
#DEFINE Variable_Angulo PORTB,7
#DEFINE Marca Variable_Marca,0
ORG 0
goto Inicio
ORG .4
goto Interrupcion
Inicio
; bsf STATUS,RP0
setf BSR
bcf Salida
movlw b'11111111'
movwf PORTB
movlw b'00001000'
; movwf OPTION_REG
movwf T0CON
; bcf STATUS,RP0
clrf BSR
movlw TMR0_CARGA
; movwf TMR0
movwf TMR0L
movlw b'10100000'
movwf INTCON
;*********************************
Principal
movf PORTB,W
andlw b'01111111'
movwf Entrada
addlw FACTOR_MINIMO
movwf FactorAlto
goto Principal
;*********************************
Interrupcion
movwf Guarda_W
swapf STATUS,W
movwf Guarda_STATUS
; bcf STATUS,RP0
clrf BSR
movlw TMR0_CARGA
movwf TMR0L
movf Contador_ON_OFF,W
andlw b'11111111'
btfss STATUS,Z
goto Ajuste_ON_OFF
btfsc Salida
goto Dos_Posibilidades
movf Contador_Bucle_EXTERNO,W
andlw b'11111111'
btfss STATUS,Z
goto Ajuste_OFF
Pone_ON
bsf Salida
btfsc Variable_Angulo
goto Angulo_Grande
movf FactorAlto,W
movwf Contador_ON_OFF
bcf Marca
movlw .15
movwf Contador_Bucle_EXTERNO
nop
nop
nop
nop
goto Fin_Interrupcion
Angulo_Grande
movlw .249
movwf Contador_ON_OFF
bsf Marca
movlw .14
movwf Contador_Bucle_EXTERNO
nop
nop
nop
goto Fin_Interrupcion
Dos_Posibilidades
btfsc Marca
goto Segundo_Ciclo
Pone_OFF
bcf Salida
movf FactorAlto,W
sublw .249
movwf Contador_ON_OFF
nop
nop
nop
nop
nop ;5
nop
nop
nop
nop
nop ;10
nop
Fin_Interrupcion
swapf Guarda_STATUS,W
movwf STATUS
swapf Guarda_W,F
swapf Guarda_W,W
bcf INTCON,RBIF
bcf INTCON,TMR0IF
retfie
Ajuste_ON_OFF
decf Contador_ON_OFF,F
nop
nop
nop
nop
nop ;5
nop
nop
nop
nop
nop ;10
nop
nop
nop
nop
nop
nop
goto Fin_Interrupcion
Ajuste_OFF
movf Contador_Bucle_INTERNO,W
andlw b'11111111'
btfsc STATUS,Z
goto Fin_Bucle_Ajuste_OFF
decf Contador_Bucle_INTERNO,F
nop
nop
nop
nop
nop ;5
nop
goto Fin_Interrupcion
Fin_Bucle_Ajuste_OFF
movlw .249;
movwf Contador_Bucle_INTERNO
decf Contador_Bucle_EXTERNO,F
nop
nop
nop
goto Fin_Interrupcion
Segundo_Ciclo
movf Entrada,W
movwf Contador_ON_OFF
bcf Marca
bcf Salida
nop
nop
nop
nop
nop ;5
nop
nop
nop
goto Fin_Interrupcion
END
-
Lo primero que nos deberías decir es: qué tipo de interrupción quieres habilitar.
-
Hola León, gracias por el interés.
Sólo utilizo la interrupción que genera el desbordamiento del timer0.
-
Aquí tienes una ayuda
9.7 TMR0 Interrupt
In 8-bit mode (which is the default), an overflow
(FFh → 00h) in the TMR0 register will set flag bit,
TMR0IF. In 16-bit mode, an overflow (FFFFh → 0000h)
in the TMR0H:TMR0L registers will set flag bit,
TMR0IF. The interrupt can be enabled/disabled by
setting/clearing enable bit, TMR0IE (INTCON<5>).
Interrupt priority for Timer0 is determined by the value
contained in the interrupt priority bit, TMR0IP
(INTCON2<2>). See Section 11.0 “Timer0 Module”
for further details on the Timer0 module.
Esto está en la hoja de datos. Veo que has habilitado del registro INTCON el bit 5 y el 7, pero deberas chequear si lo tienes configurado correctamente para 8 o 16 bit. Tambien debes habilitar el bit 7 del registro T0CON, este habilita al contador timer0. Prueba esto y nos dices
-
Genial chavales, ya está.
Como decía León, me faltaba habilitar el TMR0 y, lo que me ha costado más tiempo descubrir, no había cambiado la posición de memoria de las interrupciones de 04 a 08.
También he cambiado la cabecera de configuración para ponerla de acuerdo al formato que viene en el .INC
A continuación el código, por si a alguien le interesa.
Todavía no lo he probado con el servomotor, pero quería comunicaros que la duda que os comenté ya está solucionada.
Un saludo y gracias.
LIST P=18F1220
INCLUDE "P18F1220.INC"
__CONFIG _CONFIG1H, _HS_OSC_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H
__CONFIG _CONFIG5L, _CP0_OFF_5L
CBLOCK 0
FactorAlto
Entrada
Variable_Marca
Contador_Bucle_INTERNO
Contador_Bucle_EXTERNO
Contador_ON_OFF
Guarda_W
Guarda_STATUS
ENDC
TMR0_CARGA EQU -d'38'
ALTO_CERO_GRADOS EQU d'610'
TIEMPO_PATRON EQU d'5'
FACTOR_MINIMO EQU ALTO_CERO_GRADOS/TIEMPO_PATRON
#DEFINE Salida PORTA,0
#DEFINE Variable_Angulo PORTB,7
#DEFINE Marca Variable_Marca,0
ORG 0
goto Inicio
ORG .8
goto Interrupcion
Inicio
setf BSR
bcf Salida
movlw b'11111111'
movwf PORTB
movlw b'11001000'
movwf T0CON
clrf BSR
movlw TMR0_CARGA
movwf TMR0L
movlw b'10100000'
movwf INTCON
;*********************************
Principal
movf PORTB,W
andlw b'01111111'
movwf Entrada
addlw FACTOR_MINIMO
movwf FactorAlto
goto Principal
;*********************************
Interrupcion
movwf Guarda_W
swapf STATUS,W
movwf Guarda_STATUS
clrf BSR
movlw TMR0_CARGA
movwf TMR0L
movf Contador_ON_OFF,W
andlw b'11111111'
btfss STATUS,Z
goto Ajuste_ON_OFF
btfsc Salida
goto Dos_Posibilidades
movf Contador_Bucle_EXTERNO,W
andlw b'11111111'
btfss STATUS,Z
goto Ajuste_OFF
Pone_ON
bsf Salida
btfsc Variable_Angulo
goto Angulo_Grande
movf FactorAlto,W
movwf Contador_ON_OFF
bcf Marca
movlw .15
movwf Contador_Bucle_EXTERNO
nop
nop
nop
nop
goto Fin_Interrupcion
Angulo_Grande
movlw .249
movwf Contador_ON_OFF
bsf Marca
movlw .14
movwf Contador_Bucle_EXTERNO
nop
nop
nop
goto Fin_Interrupcion
Dos_Posibilidades
btfsc Marca
goto Segundo_Ciclo
Pone_OFF
bcf Salida
movf FactorAlto,W
sublw .249
movwf Contador_ON_OFF
nop
nop
nop
nop
nop ;5
nop
nop
nop
nop
nop ;10
nop
Fin_Interrupcion
swapf Guarda_STATUS,W
movwf STATUS
swapf Guarda_W,F
swapf Guarda_W,W
bcf INTCON,RBIF
bcf INTCON,TMR0IF
retfie
Ajuste_ON_OFF
decf Contador_ON_OFF,F
nop
nop
nop
nop
nop ;5
nop
nop
nop
nop
nop ;10
nop
nop
nop
nop
nop
nop
goto Fin_Interrupcion
Ajuste_OFF
movf Contador_Bucle_INTERNO,W
andlw b'11111111'
btfsc STATUS,Z
goto Fin_Bucle_Ajuste_OFF
decf Contador_Bucle_INTERNO,F
nop
nop
nop
nop
nop ;5
nop
goto Fin_Interrupcion
Fin_Bucle_Ajuste_OFF
movlw .249;
movwf Contador_Bucle_INTERNO
decf Contador_Bucle_EXTERNO,F
nop
nop
nop
goto Fin_Interrupcion
Segundo_Ciclo
movf Entrada,W
movwf Contador_ON_OFF
bcf Marca
bcf Salida
nop
nop
nop
nop
nop ;5
nop
nop
nop
goto Fin_Interrupcion
END
-
Me alegro que lo hallas podido solucionar y quiero darte las gracias por compartir tu programa.