list p=16f84 #include p16f84.inc contador equ 10 ;contador de pulsos valor equ 11 ;contador durante los retardos micro equ 12 ;valor enviado por el serial aux equ 13 ;para la lectura de los pulsos manopla equ 14 ;indica motor a girar en medio paso y sentido de giro retardo_mep_L equ d'255' ;contador bajo en el retardo entre 1/2 y 1/2 paso retardo_mep_H equ d'100' ;contador alto en el retardo entre 1/2 y 1/2 paso ;L=255 H=0 1300 1/2 pasos/seg ;L=255 H=10 130 1/2 pasos/seg ;L=255 H=100 13 1/2 pasos/seg ;cálculo 1/2 paso: 8+3H(L+1)=período_mp(us) retardo_mip equ d'200' ;retardo entre micropasos + contador contador_L equ 15 contador_H equ 16 org 0 ;********************************************************************************** ; Setup ;********************************************************************************** SETUP bcf STATUS,RP0 ;selecciono banco 0 bcf STATUS,RP1 clrf PORTA ;Limpieza de variable clrf PORTB clrf valor clrf contador clrf aux clrf micro clrf contador_L clrf contador_H bsf STATUS,RP0 ;selecciono banco 1 movlw B'00000111' ;configuro RA1 como entrada de pulsos movwf TRISA movlw B'00000000' ;configuro PORTB como salidas movwf TRISB bcf STATUS,RP0 ;selecciono banco 0 goto micro_paso ;********************************************************************************** ; Retardo ;********************************************************************************** retardo movlw retardo_mep_L movwf contador_L movlw retardo_mep_H movwf contador_H inicio_retardo decfsz contador_L,1 goto inicio_retardo decfsz contador_H,1 goto inicio_retardo return ;********************************************************************************** ; Rutina micropasos ;********************************************************************************** micro_paso clrf PORTB inicio_micropaso ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso bsf PORTB,0 ;pongo a 100% el bobinado A movlw d'205' ;d'69'pongo a 27% el bobinado B movwf valor call PWM_B movlw d'210' ;d'94'pongo a 37% el bobinado B movwf valor call PWM_B movlw d'215' ;d'117'pongo a 46% el bobinado B movwf valor call PWM_B movlw d'220' ;d'138'pongo a 54% el bobinado B movwf valor call PWM_B movlw d'225' ;d'158'pongo a 62% el bobinado B movwf valor call PWM_B movlw d'230' ;pongo a 69% el bobinado B movwf valor call PWM_B movlw d'235' ;pongo a 77% el bobinado B movwf valor call PWM_B movlw d'240' ;pongo a 86% el bobinado B movwf valor call PWM_B movlw d'245' ;pongo a 94% el bobinado B movwf valor call PWM_B movlw d'255' ;pongo a 100% el bobinado B movwf valor call PWM_B bsf PORTB,1 ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso movlw d'245' ;pongo a 94% el bobinado A movwf valor call PWM_A movlw d'240' ;pongo a 86% el bobinado A movwf valor call PWM_A movlw d'235' ;pongo a 77% el bobinado A movwf valor call PWM_A movlw d'230' ;pongo a 69% el bobinado A movwf valor call PWM_A movlw d'225' ;pongo a 62% el bobinado A movwf valor call PWM_A movlw d'220' ;pongo a 54% el bobinado A movwf valor call PWM_A movlw d'215' ;pongo a 46% el bobinado A movwf valor call PWM_A movlw d'210' ;pongo a 37% el bobinado A movwf valor call PWM_A movlw d'205' ;pongo a 27% el bobinado A movwf valor call PWM_A movlw d'0' ;pongo a 0% el bobinado A movwf valor call PWM_A bcf PORTB,0 ;pongo a 0% el bobinado A y a 100% el de B ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso movlw d'205' ;pongo a 27% el bobinado C movwf valor call PWM_C movlw d'210' ;pongo a 37% el bobinado C movwf valor call PWM_C movlw d'215' ;pongo a 46% el bobinado C movwf valor call PWM_C movlw d'220' ;pongo a 54% el bobinado C movwf valor call PWM_C movlw d'225' ;pongo a 62% el bobinado C movwf valor call PWM_C movlw d'230' ;pongo a 69% el bobinado C movwf valor call PWM_C movlw d'235' ;pongo a 77% el bobinado C movwf valor call PWM_C movlw d'240' ;pongo a 86% el bobinado C movwf valor call PWM_C movlw d'245' ;pongo a 94% el bobinado C movwf valor call PWM_C movlw d'255' ;pongo a 100% el bobinado C movwf valor call PWM_C bsf PORTB,2 ;pongo a 100% el bobinado C y el B ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso movlw d'245' ;pongo a 94% el bobinado B movwf valor call PWM_B movlw d'240' ;pongo a 86% el bobinado B movwf valor call PWM_B movlw d'235' ;pongo a 77% el bobinado B movwf valor call PWM_B movlw d'230' ;pongo a 69% el bobinado B movwf valor call PWM_B movlw d'225' ;pongo a 62% el bobinado B movwf valor call PWM_B movlw d'220' ;pongo a 54% el bobinado B movwf valor call PWM_B movlw d'215' ;pongo a 46% el bobinado B movwf valor call PWM_B movlw d'210' ;pongo a 37% el bobinado B movwf valor call PWM_B movlw d'205' ;pongo a 27% el bobinado B movwf valor call PWM_B movlw d'0' ;pongo a 0% el bobinado B movwf valor call PWM_B bcf PORTB,1 ;pongo a 0% el bobinado B y a 100% el de C ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso movlw d'205' ;pongo a 27% el bobinado D movwf valor call PWM_D movlw d'210' ;pongo a 37% el bobinado D movwf valor call PWM_D movlw d'215' ;pongo a 46% el bobinado D movwf valor call PWM_D movlw d'220' ;pongo a 54% el bobinado D movwf valor call PWM_D movlw d'225' ;pongo a 62% el bobinado D movwf valor call PWM_D movlw d'230' ;pongo a 69% el bobinado D movwf valor call PWM_D movlw d'235' ;pongo a 77% el bobinado D movwf valor call PWM_D movlw d'240' ;pongo a 86% el bobinado D movwf valor call PWM_D movlw d'245' ;pongo a 94% el bobinado D movwf valor call PWM_D movlw d'255' ;pongo a 100% el bobinado D movwf valor call PWM_D bsf PORTB,3 ;pongo a 100% el bobinado D y el B ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso movlw d'245' ;pongo a 94% el bobinado C movwf valor call PWM_C movlw d'240' ;pongo a 86% el bobinado C movwf valor call PWM_C movlw d'235' ;pongo a 77% el bobinado C movwf valor call PWM_C movlw d'230' ;pongo a 69% el bobinado C movwf valor call PWM_C movlw d'225' ;pongo a 62% el bobinado C movwf valor call PWM_C movlw d'220' ;pongo a 54% el bobinado C movwf valor call PWM_C movlw d'215' ;pongo a 46% el bobinado C movwf valor call PWM_C movlw d'210' ;pongo a 37% el bobinado C movwf valor call PWM_C movlw d'205' ;pongo a 27% el bobinado C movwf valor call PWM_C movlw d'0' ;pongo a 0% el bobinado C movwf valor call PWM_C bcf PORTB,2 ;pongo a 0% el bobinado C y a 100% el de D ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso movlw d'205' ;pongo a 27% el bobinado A movwf valor call PWM_A movlw d'210' ;pongo a 37% el bobinado A movwf valor call PWM_A movlw d'215' ;pongo a 46% el bobinado A movwf valor call PWM_A movlw d'220' ;pongo a 54% el bobinado A movwf valor call PWM_A movlw d'225' ;pongo a 62% el bobinado A movwf valor call PWM_A movlw d'230' ;pongo a 69% el bobinado A movwf valor call PWM_A movlw d'235' ;pongo a 77% el bobinado A movwf valor call PWM_A movlw d'240' ;pongo a 86% el bobinado A movwf valor call PWM_A movlw d'245' ;pongo a 94% el bobinado A movwf valor call PWM_A movlw d'255' ;pongo a 100% el bobinado A movwf valor call PWM_A bsf PORTB,0 ;pongo a 100% el bobinado D y el A ;call teclado ;leo desde la manopla ;btfsc manopla,2 ;verifico manopla ;call medio_paso movlw d'245' ;pongo a 94% el bobinado D movwf valor call PWM_D movlw d'240' ;pongo a 86% el bobinado D movwf valor call PWM_D movlw d'235' ;pongo a 77% el bobinado D movwf valor call PWM_D movlw d'230' ;pongo a 69% el bobinado D movwf valor call PWM_D movlw d'225' ;pongo a 62% el bobinado D movwf valor call PWM_D movlw d'220' ;pongo a 54% el bobinado D movwf valor call PWM_D movlw d'215' ;pongo a 46% el bobinado D movwf valor call PWM_D movlw d'210' ;pongo a 37% el bobinado D movwf valor call PWM_D movlw d'205' ;pongo a 27% el bobinado D movwf valor call PWM_D movlw d'0' ;pongo a 0% el bobinado D movwf valor call PWM_D bcf PORTB,3 ;pongo a 0% el bobinado D y a 100% el de A goto inicio_micropaso ;********************************************************************************** ; Rutina PWM en el bobinado A ;********************************************************************************** PWM_A clrf contador movlw retardo_mip movwf micro inicio_PWM_A movf contador,0 subwf valor,0 movf STATUS,0 movwf aux iorlw b'11111110' andwf PORTB,1 movf aux,0 andlw b'00000001' iorwf PORTB,1 nop ;hay que poner tantos nops como sea necesario para realizar el ajuste fino de frecuencia en micropasos nop ;el período del micropaso es los microsegundos de la rutina * el varo de micro incfsz contador,1 goto inicio_PWM_A decfsz micro,1 goto inicio_PWM_A return ;********************************************************************************** ; Rutina PWM en el bobinado B ;********************************************************************************** PWM_B clrf contador movlw retardo_mip movwf micro inicio_PWM_B movf contador,0 subwf valor,0 movf STATUS,0 movwf aux rlf aux,1 movf aux,0 iorlw b'11111101' andwf PORTB,1 movf aux,0 andlw b'00000010' iorwf PORTB,1 nop ;hay que poner tantos nops como sea necesario para realizar el ajuste fino de frecuencia en micropasos nop ;el período del micropaso es los microsegundos de la rutina * el varo de micro incfsz contador,1 goto inicio_PWM_B decfsz micro,1 goto inicio_PWM_B return ;********************************************************************************** ; Rutina PWM en el bobinado C ;********************************************************************************** PWM_C clrf contador movlw retardo_mip movwf micro inicio_PWM_C movf contador,0 subwf valor,0 movf STATUS,0 movwf aux rlf aux,1 rlf aux,1 movf aux,0 iorlw b'11111011' andwf PORTB,1 movf aux,0 andlw b'00000100' iorwf PORTB,1 nop ;hay que poner tantos nops como sea necesario para realizar el ajuste fino de frecuencia en micropasos nop ;el período del micropaso es los microsegundos de la rutina * el varo de micro incfsz contador,1 goto inicio_PWM_C decfsz micro,1 goto inicio_PWM_C return ;********************************************************************************** ; Rutina PWM en el bobinado D ;********************************************************************************** PWM_D clrf contador movlw retardo_mip movwf micro inicio_PWM_D movf contador,0 subwf valor,0 movf STATUS,0 movwf aux rlf aux,1 rlf aux,1 rlf aux,1 movf aux,0 iorlw b'11110111' andwf PORTB,1 movf aux,0 andlw b'00001000' iorwf PORTB,1 nop ;hay que poner tantos nops como sea necesario para realizar el ajuste fino de frecuencia en micropasos nop ;el período del micropaso es los microsegundos de la rutina * el varo de micro incfsz contador,1 goto inicio_PWM_D decfsz micro,1 goto inicio_PWM_D return ;********************************************************************************** ; Rutina 1/2 paso ;********************************************************************************** medio_paso clrf PORTB inicio_mediopaso movlw b'100' ;100 RACW, 101 RACCW, 110 DECCW, 111 DECCCW subwf manopla,0 btfsc STATUS,Z call RACW movlw b'101' subwf manopla,0 btfsc STATUS,Z call RACCW movlw b'110' subwf manopla,0 btfsc STATUS,Z call DECCW movlw b'111' subwf manopla,0 btfsc STATUS,Z call DECCCW return ;********************************************************************************** ; Rutina RACW ;********************************************************************************** RACW clrf PORTB inicio_RACW clrf aux bsf aux,0 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,1 bsf aux,2 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 bsf aux,3 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,3 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,3 movf aux,0 movwf PORTB call retardo movlw b'100' ;verifico manopla subwf manopla,0 btfss STATUS,Z return goto inicio_RACW ;********************************************************************************** ; Rutina RACCW ;********************************************************************************** RACCW clrf PORTB inicio_RACCW clrf aux bsf aux,0 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,3 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,3 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,3 bsf aux,2 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 bsf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,1 movf aux,0 movwf PORTB call retardo movlw b'101' ;verifico manopla subwf manopla,0 btfss STATUS,Z return goto inicio_RACCW ;********************************************************************************** ; Rutina DECCW ;********************************************************************************** DECCW clrf PORTB inicio_DECCW clrf aux bsf aux,0 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,1 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,1 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,1 bsf aux,2 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 bsf aux,3 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,3 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,3 swapf aux,1 movf aux,0 movwf PORTB call retardo movlw b'110' ;verifico manopla subwf manopla,0 btfss STATUS,Z return goto inicio_DECCW ;********************************************************************************** ; Rutina DECCCW ;********************************************************************************** DECCCW clrf PORTB inicio_DECCCW clrf aux bsf aux,0 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,3 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,3 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,3 bsf aux,2 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,2 bsf aux,1 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,1 swapf aux,1 movf aux,0 movwf PORTB call retardo clrf aux bsf aux,0 bsf aux,1 swapf aux,1 movf aux,0 movwf PORTB call retardo movlw b'111' ;verifico manopla subwf manopla,0 btfss STATUS,Z return goto inicio_DECCCW ;********************************************************************************** ; Rutina Leo teclado ;********************************************************************************** teclado movf PORTA,0 andlw b'00000111' movwf manopla return ;********************************************************************************** end ;Fin del programa.