trate de pegarlo como un fichero adjunto pero no hay suficiente espacio, asi que
lo voy a pegar con riesgo a que me jalen las orejas por el tamaño. Reitero las gracias.
; PIC 12c508
; __________
; Vdd(+5v) I O I Vss(masa)
; I I
; BAT_IN I I FRENO
; SERVO_IN I I PWM-out
; ----------
;******************************************************************
;****** CABECERA DEL PROGRAMA *************************************
;*****************************************************************
LIST P = 12c508a
INCLUDE <P12c508a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _MCLRE_OFF & _IntRC_OSC
;*****************************************************************
;****** FUNCIONAMIENTO DEL PROGRAMA *******************************
;******************************************************************
;El bucle dura 51 US.
; para 1224us IN -> OUT STOP -> / 51 us = 24 pasos x 2 (nb cuenta)= 48 CUENTAS
; para 1785us IN -> OUT MAXIMO -> / 51 us = 35 pasos x 2 (nb cuenta)= 70 CUENTAS
; con 24 pasos IN -> 0 pasos OUT
; con 35 pasos IN -> 11x2 pasos OUT
; con 11x2+1 pasos OUT , MAX -> 23x51 = 1173us => frecPWM = 0.85kHz.
;******************************************************************
;****** DEFINES ***************************************************
#DEFINE ACTPWM bcf
#DEFINE DESPWM bsf
#DEFINE PIN GPIO,3 ;Pin de entrada de Señal Receptor
#DEFINE PBAT GPIO,4 ;Pin de entrada de Señal de la bateria
#DEFINE PSTOP GPIO,1 ;Pin de salida de MOSFET FRENO
#DEFINE POUT GPIO,2 ;Pin de salida de PWM MOSFET
#DEFINE EEPREV FLAGS,0 ;Estado previo de la entrada
;#DEFINE PIN FLAGS,7 ;Define temporal para la entrada de señal
;#DEFINE PBAT FLAGS,6 ;Define temporal para la señal de bateria
#DEFINE TEST FLAGS,5 ;Define de prueba del programa
#DEFINE NbPLow .24 ;Relacion de pasos que detecta la posicion LOW de la palanca IpwmHref-1
#DEFINE IpwmHrf .48 ;Relacion de Frecuencias entre PWMIN - PWMOUT
#DEFINE OpwmFrec .23 ;Pasos del ciclo de las señal de salida
#DEFINE pStop .200 ;Pasos de retardo para activar el Freno 14x200x50us=140ms
#DEFINE pBat .200 ;Pasos de verificacion de caida de la bateria 200x50us=10ms
#DEFINE pRecOff .200 ;Pasos de de verificacion de apagao del receptor 200x50usx14=140ms
;******************************************************************
;***** DEFINO LOS REGISTROS RAM ***********************************
IpwmH EQU 07h ;Variable con los pasos del estado H de la entrada
OpwmH EQU 08h ;Variable con los pasos del estado H de la salida
CpwmF EQU 09h ;Contador de pasos de la frecuencia de salida
CpwmH EQU 0Ah ;Contador del estado H de la salida
CpBat EQU 0Bh ;Contador de pasos del estado de la bateria Low
CpStop EQU 0Ch ;Contador de pasos para retardar la activacion del freno
CpROff EQU 0Dh ;Contador de pasos para detectar el receptor apagado
FLAGS EQU 0Eh ;Flags
CTmp1 EQU 0Fh ;Variable temporal de contador
CTmp2 EQU 10h ;Variable temporal de contador
CTmp3 EQU 11h ;Variable temporal de contador
CTmp4 EQU 12h ;Variable temporal de contador
;******************************************************************
;****** CONFIGURO EL PIC ******************************************
RESET
org 00h
movwf OSCCAL
movlw b"11000000" ;Configuro el registro OPTION
OPTION
movlw b"11111001" ;Todas entradas menos gpio,2 -> salidaPWM y gpio,1 -> FRENO
tris GPIO
bcf PSTOP ;Desactivo el freno
NOP
DESPWM POUT ;Desactivo la señal de Salida de PWM
;******************************************************************
;****** INICIALIZO VARIABLES **************************************
INITVAR
clrf FLAGS
clrf IpwmH
movlw pStop
movwf CpStop
movlw pBat
movwf CpBat
movlw pRecOff
movwf CpROff
movlw OpwmFrec
movwf CpwmF
movlw .1
movwf CpwmH
movwf OpwmH
;******************************************************************
;****** INICIO EL PROGRAMA ****************************************
;*****************************************************************
;******************************************************************
;Aqui compruebo si estoy probando el programa para ir directamente al inicio de regulacion
btfsc TEST ;Es LOW la entrada de señal
goto WAITLOW2 ;NO
;******************************************************************
;Aqui retardo la puesta en marcha del programa para dar tiempo al receptor a enviar la señal
movlw .250
call PAUSAMS
;Compruebo que al encender el regulador el acelerador este LOW
ISLOWPAL
movlw .10 ;Hago que la comprobacion de palanca baja se realice 10 veces...
movwf CTmp4
WAITLOW1
btfsc PIN ;Es LOW la entrada de señal
goto WAITLOW1 ;NO
WAITHIGH1
btfss PIN ;Es HIGH la entrada de señal
goto WAITHIGH1 ;NO
CONTANDO ;El bucle de comprobacion debe durar el mismo tiempo que el del programa
movlw .15 ;Duracion: 2+(15-1)*3+2+1+4= 51us.
movwf CTmp1
CONT_11 decfsz CTmp1,f ;Este bucle dura 3us.
goto CONT_11
NOP
incf IpwmH,f ;Incremento el contador de ciclos de entrada
btfsc PIN ;Es LOW la entrada de señal
goto CONTANDO ;NO
movlw NbPLow ;Cargo en W la relacion entre PWM"s
subwf IpwmH,w ;Resto a los ciclos de la señal de entrada la relacion entre señales y lo guardo en W
btfss STATUS,0 ;Compruebo si el resultado es negativo
goto INICIO ;SI, me voy a comenzar la ejecucion de la regulacion
clrf IpwmH ;NO, Reseteo la variable IpwmH usada antes
;DESDE AQUI esto debe durar unos 250ms.
movlw .250
call ZUMBIDO
;DESDE AQUI otros 250-(20+10)(del pulso de señal del servo)= 220ms.
movlw .220
call PAUSAMS
;Vuelta a comprobar el acelerador
goto ISLOWPAL
;*********************************************************************
;*********************************************************************
;Aqui es donde se comienza con la regulacion de la velocidad del motor
;*********************************************************************
INICIO
clrf IpwmH ;reseteo la variable IpwmH usada antes
decfsz CTmp4,f
goto WAITLOW1
;******************************************************************
;******************************************************************
;Genero una señal que indique el inicio del programa
movlw .5
movwf CTmp4
PITIDO
movlw .50
call PAUSAMS
movlw .50
call ZUMBIDO
decfsz CTmp4,f
goto PITIDO
;******************************************************************
;******************************************************************
;INICIO DEL PROGRAMA DE REGULACION
WAITLOW2
btfsc PIN
goto WAITLOW2
START11
btfsc PIN ;es L la señal de entrada
goto SALTO10 ;NO
btfss EEPREV ;SI, fue H la señal de entrada en el ultimo ciclo?
goto SALTO30 ;NO
bcf EEPREV ;SI, especifico que la señal de entrada en este ciclo ha cambiado a L
movlw IpwmHrf ;cargo en W la relacion entre PWM"s
subwf IpwmH,w ;resto a los ciclos de la señal de entrada la relacion entre señales y lo guardo en W
btfss STATUS,0 ;compruebo si el resultado es negativo
movlw .0 ;SI, Pongo el registro W a 0 para que luego se incremente a 1 y se actualice el registro OpwmH
movwf OpwmH ;NO, Pongo el contenido de W en la variable de pasos de salida
incf OpwmH,f ;Incremento el resultado de la resta para evitar el resultado no negativo y que puede ser .0 produciendo un error al aplicar la instruccion decfsz al valor .0
clrf IpwmH ;Pongo a cero el contador de ciclos de la señal de entrada
movlw pRecOff ;Reseteo el contador de deteccion de Receptor Apagado
movwf CpROff
goto SALTO31
SALTO11
bsf EEPREV ;especifico que la ultima entrada ha sido H
incf IpwmH,f ;incremento el contador de ciclos de entrada
;******************************************************************
;COMPRUEBO SI LA BATERIA ESTA CON CARGA SUFUCIENTE
SALTO31
btfsc PBAT ;es L la señal de la bateria
goto SALTO40A ;NO
decfsz CpBat,f ;SI, Aqui decremento el contador de la bateria LOW
goto SALTO40B ;NO es cero
DESPWM POUT ;SI, Desactivo la señal de PWM
movlw .12 ;Espero 3 Segundos para volver a activar la regulacion
movwf CTmp4 ; Asi evito los tirones del limite de la BATERIA
WAITSECOND
movlw .250
call PAUSAMS
decfsz CTmp4,f
goto WAITSECOND
goto INITVAR ;Me voy al inicio del programa y empezamos de nuevo...
;******************************************************************
;AQUI SE GENERA LA SEÑAL DE SALIDA PWM
SALTO41 ;ESTO ES EL PUNTO MEDIO DEL PROGRAMA
btfsc PIN ;Compruebo la señal de entrada otra vez...
incf IpwmH,f ;incremento el contador de ciclos de entrada
;Comienzo con la generacion de señal
decfsz CpwmF,f
goto SALTO60A
movlw OpwmFrec
movwf CpwmF
movf OpwmH,w
movwf CpwmH
decfsz CpStop,f ;Decremento el contador de activacion del freno para retardar su activacion
goto SALTO50 ;NO es cero
bsf PSTOP ;Se hace Cero el contador; Activo el freno
movlw .1 ;pongo el registro W a 1 para que luego se actualice el registro CpStop
movwf CpStop ;Pongo el contenido de W en la variable de retardo STOP
SALTO51
decfsz CpROff,f ;Decremento el contador de pasos de deteccion de Receptor Apagado
goto SALTO60B
movlw .1
movwf OpwmH
movwf CpwmH
movwf CpROff
SALTO61
decfsz CpwmH,f
goto SALTO71
DESPWM POUT
movlw .1
movwf CpwmH
goto START10
SALTO71
bcf PSTOP ;Desactivo el freno
movlw pStop ;Reseteo el contador de retardo del freno
movwf CpStop
ACTPWM POUT ;Activo la señal de Salida de PWM
goto START11
;******************************************************************
;****** GOTOS para equilibrar el programa *************************
;******************************************************************
SALTO10
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
goto SALTO11
SALTO30
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
goto SALTO31
SALTO40A
movlw pBat ;Reseteo el contador de retardo de comprobacion Bateria
movwf CpBat
goto SALTO41
SALTO40B
goto SALTO41
SALTO50
goto SALTO51
SALTO60A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
goto SALTO61
SALTO60B
NOP
goto SALTO61
START10
goto START11
;******************************************************************
;******************************************************************
;****** Funciones del programa ************************************
;******************************************************************
;***********************************
;*** Genera el Zumbido del motor ***
ZUMBIDO
movwf CTmp3
GENSIG1
;RETARDO unos 40us
ACTPWM POUT ;Genero la señal de aviso de acelerador en marcha
movlw .13 ;Duracion: 1+2+(13-1)*3+2= 41us.
movwf CTmp1
CONT_21 decfsz CTmp1,f ;Este bucle dura 3us.
goto CONT_21
;RETARDO unos 940us
DESPWM POUT
movlw .10
movwf CTmp1
CONT_31 movlw .30
movwf CTmp2
CONT_32 decfsz CTmp2,f ;Este bucle dura 3us.
goto CONT_32
decfsz CTmp1,f
goto CONT_31 ;Este bucle dura 1+2+(2+(3x(30-1)+2)+3)x10-1= 942us.
decfsz CTmp3,f
goto GENSIG1 ;Este bucle dura (41+942)x!W-1=Xus.
retlw .0
;**********************************
;*** Genera una pausa de !Wx1ms ***
PAUSAMS
movwf CTmp3
;RETARDO unos 980us
CONT_43 movlw .10
movwf CTmp1
CONT_41 movlw .31
movwf CTmp2
CONT_42 decfsz CTmp2,f ;Este bucle dura 3us.
goto CONT_42
decfsz CTmp1,f
goto CONT_41 ;Este bucle dura 2+(2+(3x(31-1)+2)+3)x10-1= 971us.
decfsz CTmp3,f
goto CONT_43 ;Este bucle dura 971x!W-1=Xus
retlw .0
;******************************************************************
;******************************************************************
END