Autor Tema: Migración 16c621 a 18f1220  (Leído 2093 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado robotdoblador

  • PIC10
  • *
  • Mensajes: 6
Migración 16c621 a 18f1220
« 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

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Migración 16c621 a 18f1220
« Respuesta #1 en: 30 de Noviembre de 2007, 10:58:58 »
Lo primero que nos deberías decir es: qué tipo de interrupción quieres habilitar.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado robotdoblador

  • PIC10
  • *
  • Mensajes: 6
Re: Migración 16c621 a 18f1220
« Respuesta #2 en: 30 de Noviembre de 2007, 11:31:21 »
Hola León, gracias por el interés.
Sólo utilizo la interrupción que genera el desbordamiento del timer0.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Migración 16c621 a 18f1220
« Respuesta #3 en: 30 de Noviembre de 2007, 12:32:19 »
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
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado robotdoblador

  • PIC10
  • *
  • Mensajes: 6
Re: Migración 16c621 a 18f1220
« Respuesta #4 en: 03 de Diciembre de 2007, 07:56:16 »
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

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Migración 16c621 a 18f1220
« Respuesta #5 en: 03 de Diciembre de 2007, 13:05:09 »
Me alegro que lo hallas podido solucionar y quiero darte las gracias por compartir tu programa.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.