;***************Control de motor por PWM dezpliegue de RPM en 7 segmentos************
LIST P=18F4550 ;Directiva para definir el pricesador
#include <P18F4550.INC> ;Definici?n de variables especificas del procesador
;************************************************************************************
;Bits de configuraci?n
CONFIG FOSC = INTOSC_EC ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;************************************************************************************
;Definici?n de variables
CBLOCK 0x000 ;ejemplo de definici?n de variables en RAM de acceso
flags
sdato
ENDC ;fin del bloque de constantes
;************************************************************************************
ORG 0x0000 ;vector de reset
bra inicio
inicio ORG 0x0008
goto SIRD
org 0x0020
bsf OSCCON,IRCF2,0
bcf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;oscilador interno a 1MHz
movlw 0x0F
movwf ADCON1,0 ;puertos digitales 8
clrf PORTC,0 ;limpiamos el puerto C
clrf PORTD,0 ;limpiamos el puerto D
clrf TRISD,0 ;Puerto D como salida
movlw 0xC0
movwf INTCON,0
bsf RCON,IPEN,0
;**************Configuraci?n PWM1************************************************
movlw d'155'
movwf PR2,0 ;periodo pwm 10ms
movlw 0x00
movwf CCPR1L,0 ;Duty Cycle inicia en 0%
bcf TRISC,2,0 ;pin CCP1 salida
movlw 0x06
movwf T2CON,0 ;Timer2 encendido y preescaler x 16
movlw 0x0C
movwf CCP1CON,0 ;Modo PWM
;**************Configuraci?n PWM2*********************************************
movlw 0x00
movwf CCPR2L,0 ;Duty Cycle inicia en 0%
bcf TRISC,1,0 ;pin CCP2 salida
movlw 0x0C
movwf CCP2CON,0 ;Modo PWM
;**************Configuraci?n Serial EUSART************************************
bsf TRISC,7,0 ;RC7 pin RX
bsf PIE1,RCIE,0 ;Habilita interrupcion de recepcion de datos
bsf IPR1,RCIP,0 ;Alta prioridad de interrupcion
movlw 0x26
movwf TXSTA,0 ;Tx modo asincrono,high speed con registro TSR vacio
movlw 0x90
movwf RCSTA,0 ;Recepcion habilitada de 8 bits
movlw 0x08
movwf BAUDCON,0 ;Detecci?n automatica desactivada 16bit baud rate generate
clrf SPBRGH,0
movlw d'25'
movwf SPBRG ;Comunicaci?n serial a 9600 baudios
bsf TRISC,6,0 ;RC6 pin TX
;*******Guardando valores de DCycle y codigo de 7 segmentos para usar DirIndirecto*********
clrf TBLPTRL,0
movlw 0x03
movwf TBLPTRH,0
clrf TBLPTRU,0 ;tblptr direccion 0x000300
LFSR FSR0, 400h ;Direccionamos el primer valor en direccion 400h de FSR0
next tblrd *+ ;lee tabla y aumenta en uno el apuntador
movff TABLAT,POSTINC0 ;mueve lo del registro tablat al registro FSR0 e incrementa el apuntador
movf FSR0L,W,0
xorlw 0x07 ;*******Son los valores para********
btfss STATUS,Z,0 ;******* el ciclo de trabajo************
bra next
LFSR FSR0, 400H ;colocamos el apuntodor FSR0 en la direccion 400h
;**********************Programa**************************************************
inc btfss flags,0,0
bra dec
btfss PORTD,0,0
bra incv
clrf PORTD,0
bra inc1
incv movf CCPR1L,W,0
xorwf CCPR2L,W,0
btfsc STATUS,Z,0
bra inc1
movlw 0x00
cpfseq CCPR1L,0
bra compCCPR2
movff CCPR2L,CCPR1L
clrf flags,0
bra inc
compCCPR2 movlw 0x00
cpfseq CCPR2L,0
bra inc1
movff CCPR1L,CCPR2L
clrf flags,0
bra inc
inc1 movlw 0x05
cpfseq FSR0L,0
bra INCDuty
movff INDF0, CCPR1L
clrf flags,0
movff INDF0, CCPR2L
bra inc
INCDuty movff PREINC0, CCPR1L
clrf flags,0
movff INDF0, CCPR2L
bra inc
dec btfss flags,1,0
bra rev
movlw 0x00
cpfseq FSR0L,0
bra dec1
clrf flags,0
bra inc
dec1 movff POSTDEC0, CCPR1L
clrf flags,0
movff INDF0, CCPR2L
bra inc
rev btfss flags,2,0
bra stp
movlw 0x00
movwf FSR0L,0
movff FSR0L,0
movff INDF0, CCPR1L
movff INDF0, CCPR2L
bsf PORTD,0,0
bsf PORTD,1,0
clrf flags,0
bra inc
stp btfss flags,3,0
bra izq
clrf PORTD,0
movlw 0x00
movwf FSR0L,0
movff FSR0L,0
movff INDF0, CCPR1L
movff INDF0, CCPR2L
clrf flags,0
bra inc
izq btfss flags,4,0
bra der
movlw 0x00
cpfseq CCPR2L,0
bra izq1
movff CCPR1L, CCPR2L
izq1 clrf flags,0
clrf CCPR1L,0
clrf PORTD,0
bra inc
der btfss flags,5,0
bra inc
movlw 0x00
cpfseq CCPR1L,0
bra der1
movff CCPR2L,CCPR1L
der1 clrf flags,0
clrf CCPR2L,0
clrf PORTD,0
bra inc
;**************Servicio de interrupcio Recepcion de dato serial**************************************
SIRD btfss PIR1,RCIF,0 ;verifica si la interrupcion fue por Recepcion de dato serial
bra endd
bcf PIR1,RCIF,0 ;limpiamos bandera de interrupcion por recepcion de dato
movff RCREG,sdato ;movemos el dato recibido a un registro para compararlo posteriormente
movlw 0x41
cpfseq sdato,0 ;verificamos si se recibio la letra A
bra compF ;sino salta a otra comparaci?n
bsf flags,0,0 ;Activamos bandera para acelerar
bra endd
compF movlw 0x46
cpfseq sdato,0 ;verificamos si se recibio la letra F
bra compR ;sino salta a otra comparaci?n
bsf flags,1,0 ;Activamos bandera para desacelerar
bra endd
compR movlw 0x52
cpfseq sdato,0 ;verificamos si se recibio la letra R
bra compS ;sino salta a otra comparaci?n
bsf flags,2,0 ;Activamos bandera de reversa
bra endd
compS movlw 0x53
cpfseq sdato,0 ;verificamos si se recibio la letra S
bra compI ;sino salta a otra comparaci?n
bsf flags,3,0 ;Activamos bandera de stop
bra endd
compI movlw 0x44
cpfseq sdato,0 ;verificamos si se recibio la letra I
bra compD ;sino salta a otra comparaci?n
bsf flags,4,0 ;Activamos bandera para dar vuelta a la izquierda
bra endd
compD movlw 0x49
cpfseq sdato,0 ;verificamos si se recibio la letra D
bra endd ;sino saltamos al fin del servicio de interrupci?n
bsf flags,5,0 ;Activamos bandera para dar vuelta a la derecha
endd retfie FAST
;*****************Codigo exadecimal para 7 seg y variacion de pwm**********************************
org 0x300 ;La directiva DB sirve para definir un byte a partir de la direccion especificada por ORG
DB 0X00,0x5D,0x6C,0x7C,0x8C,0x9B,0xAB
END