;******************************************************************************************* ; MOTORES cc 5 ; ;Este programa controla mediante modulación de anchura de pulsos ocho velocidades diferentes ;que se aplican a un motor cc conentado en las bornas M1 de la placa MSx84. Las diferentes ;velocidades se elegirán con los tres primeros conmutadores de la placa MSx84. El número de ;la velocidad se visualiza en el Display de la Trainer. ; ; Autor: Iván Trueba ; (c) Microsystems Engineering ; c/ Gral. Concha Nº39 - 8º ; 48012 Bilbao Tfno. 4223263 ; ;****************************************************************************************** list p = 16f84 ;Elección del modelo del PIC RADIX HEX ;Sistema de numeración hexadecimal. include "Regx84.inc" ;Se incluye la definición de registros para el PIC 16F84. TEMP EQU 0X0E ;Registros de propósito general. TEMP2 EQU 0x0F ORG 0x00 ;El programa comienza en la dirección 0. goto INICIO ORG 5 ;Se salta el vector interrupción. ;******************************************************************************************* ;DEC7SEG: Esta rutina decodifica el valor que hay en W para visualizarlo en un display. DEC7SEG addwf PCL, F ;Subrutina para el display 7 segmentos retlw 3F retlw 06 retlw 5B retlw 4F retlw 66 retlw 6D retlw 7D retlw 07 retlw 7F ;******************************************************************************************** ;Rutinas de DELAY. DELAY10 bcf INTCON, 2 movlw 0xD8 movwf OPTION_REG ;Carga el timer 0 para que cuente 39. DELAY10_1 btfss INTCON, 2 ;Se espera a que se desborde el TMR0 goto DELAY10_1 decfsz TEMP2, 1 ;Se decrementa la variable TEMP2, que es la que goto DELAY10 ;determinará la duración de los pulsos. RETURN ;********************************************************************************************* INICIO bsf STATUS, RP0 ;Banco 1. movlw B'00000111' ;Se configura RA0, RA1 Y RA2 como entradas y el resto de la movwf PORTA ;puerta A como salida. clrf PORTB ;PuertaB como salida. movlw b'00000010' ;Se asigna el Divisor de Frecuencia al TMR0 con un preescaler movwf OPTION_REG ;de 256. bcf STATUS, RP0 ;Vuelta al banco 0. ;******************************************************************************************** ;BUCLE. Se mira el estado de los interruptores RA0 - RA2 de la Trainer para saber que velocidad ;está introducida. BUCLE movf PORTA, W andlw b'00000111' ;El programa realiza diversas máscaras para saber movwf TEMP ;cual es la combinación introducida por los conmutadores ;de la Trainer. xorlw b'00000000' btfsc STATUS, Z goto VEL_1 movf TEMP, W xorlw b'00000001' btfsc STATUS, Z goto VEL_2 movf TEMP, W xorlw b'00000010' btfsc STATUS, Z goto VEL_3 movf TEMP, W xorlw b'00000011' btfsc STATUS, Z goto VEL_4 movf TEMP, W xorlw b'00000100' btfsc STATUS, Z goto VEL_5 movf TEMP, W xorlw b'00000101' btfsc STATUS, Z goto VEL_6 movf TEMP, W xorlw b'00000110' btfsc STATUS, Z goto VEL_7 movf TEMP, W xorlw b'00000111' btfsc STATUS, Z goto VEL_8 goto BUCLE ;********************************************************************************************** ;VEL_*: Estas rutinas son las que se encargan de que aparecezca por el display el número de la ;velocidad elegida y dan al motor el tren de pulsos correspondiente a dicha velocidad. VEL_1 movlw 0x01 ;SE visualiza el número correspondiente a la marcha en el LCD. call DEC7SEG movwf PORTB movlw 0xFF movwf TEMP2 ;Se aplica el tren de pulsos al motor clrf PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE ;Se vuelve a mirar el estado de los interruptores VEL_2 movlw 0x02 call DEC7SEG movwf PORTB movlw 0xC0 movwf TEMP2 clrf PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE VEL_3 movlw 0x03 call DEC7SEG movwf PORTB movlw 0xA0 movwf TEMP2 clrf PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE VEL_4 movlw 0x04 call DEC7SEG movwf PORTB movlw 0x80 movwf TEMP2 clrf PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE VEL_5 movlw 0x05 call DEC7SEG movwf PORTB movlw 0x60 movwf TEMP2 clrf PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE VEL_6 movlw 0x06 call DEC7SEG movwf PORTB movlw 0x40 movwf TEMP2 CLRF PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE VEL_7 movlw 0x07 call DEC7SEG movwf PORTB movlw 0x20 movwf TEMP2 CLRF PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE VEL_8 movlw 0x08 call DEC7SEG movwf PORTB movlw 0x01 movwf TEMP2 clrf PORTA call DELAY10 movlw b'00011000' movwf PORTA call DELAY10 GOTO BUCLE END ;Fin del programa. ;**********************************************************************************************