Hola a todos,
como comenté en otro mensaje quiero lograr un pwm con 5us de precisión y 20ms de periodo.
Finalmente lo he logrado generando interrupciones de 5us y realizando el pwm por software (sumando las interrupciones de 5us hasta lograr el periodo).
El código lo hice para un pic16c621 que permite ciclos de reloj de 40Mhz, pero como es OTP (no me di cuenta cuando lo estaba haciendo) voy a migrar el código para implementarlo en un 18f1220 (a 40 Mhz).
Pero a la hora de migrar el código se me ha presentado un problema: ¿dónde consigo la librería p18f1220.inc? ya que en los archivos de mi mplab7.5 no está y por internet no he encontrado el código.
He intentado instalar mplab8.0 pero me da errores.
A ver si me podéis echar una mano, ya que estoy atascado y seguro que es una chorrada.
Si tenéis alguna pista que darme sobre la migración del código también os lo agradeceré.
En principio, con modificar la posición donde se almacenan las variables, el ciclo de reloj y el .inc debería bastar (las posibilidades adicionales de la gama alta supongo que no se activan por defecto, y la configuración de los registros supongo que será igual).
Os incluyo el código para el p16c621 por si os interesa a alguno.
Un saludo.
LIST P=16C621
INCLUDE "P16C621.INC"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
CBLOCK 0x20
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
bcf Salida
movlw b'11111111'
movwf PORTB
movlw b'00001000'
movwf OPTION_REG
bcf STATUS,RP0
movlw TMR0_CARGA
movwf TMR0
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
movlw TMR0_CARGA
movwf TMR0
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,T0IF
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