; MOVDRV-1: Control de 1 motor paso a paso desde RS-232 ; 1/3/03 ; Ref. NA-02 Rev. 2 ; SELEKRON MICROCONTROL S.L. www.selekron.com ; ;El siguiente programa permite manejar 1 motor paso a paso bipolar según las órdenes recibidas ;desde el PC vía RS-232, mediante la tarjeta MOVDRV-1. ; ;Se usará el Hyperterminal de Windows para comunicarse con MOVDRV-1 en modo 19200 baudios, 8 bits ;sin paridad, 1 bit de parada. Control de flujo: Xon/ Xoff ;TECLAS DE CONTROL: ; ; Q MOTOR 1 GIRO HORARIO ; W MOTOR 1 GIRO ANTIHORARIO ; E MOTOR 1 MARCHA/PARO ; R INCREMENTA VELOCIDAD MOTOR 1 ; T DECREMENTA VELOCIDAD MOTOR 1 ; Y DESACTIVA TORQUE MOTOR 1 ; I Envía al PC el estado de las 12 entradas de sensores digitales ; SECUENCIAS DE CONTROL ; ; CONTROL1 CONTROL2 ; PASO1 1 0 ; PASO2 0 0 ; PASO3 0 1 ; PASO4 1 1 ; PASO5 1 0 ; ; ;El microcontrolador montado en la tarjeta MOVDRV-1 es un PIC16F877A trabajando a 20 MHz. ; ; List p=16F877A include "P16F877A.INC" __CONFIG _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF cblock 0x20 TECLA ;Este registro contendrá el valor de la última tecla pulsada en el PC. PUERTOA ;En estos registros se almacena el valor de la última lectura de puertos. PUERTOB PUERTOC PUERTOD PUERTOE TEMPO_1 ;Esta variable determina el retardo entre pasos. Es modificable desde el PC. CONT_1 CONT_2 CONT_3 ;Registros para el retardo. CONTROL ;Registro que almacena el estado de los motores PASO_ACTUAL ;Almacena el paso en curso del motor endc ; Bits del registro CONTROL ; ; Bit0 Sentido giro MOTOR1 0=Horario 1=Antihorario ; Bit1 Estado MOTOR1 0=Paro(con torque) 1=Activo(marcha) ; Bit2 Estado MOTOR1 0=Sin torque 1=Con torque ; ;****************************************** org 0x00 ;Vector de Reset goto PRINCIPIO org 0x04 goto INTER ;Vector de interrupción ;*********************************************************************** MOVFF macro origen,destino ;COPIA EL CONTENIDO DE 'origen' hacia 'destino' movf origen,W movwf destino endm ;************************************************************************ BANK_0 macro ;Macros de selección de bancos bcf STATUS,RP0 endm BANK_1 macro bsf STATUS,RP0 endm ;********************************************* ;Retardo entre pasos RETARDO clrf CONT_2 clrf CONT_1 movf TEMPO_1,w movwf CONT_3 LOOP_CONT decfsz CONT_1,f goto LOOP_CONT decfsz CONT_2,f goto LOOP_CONT decfsz CONT_3,f goto LOOP_CONT RETURN ;******************************************************************************************** ;TX_232: Transmite el dato presente en W por RS-232 TX_232 bcf PIR1,TXIF ;Restaura el flag de TX movwf TXREG ;Carga el dato para transmisión BANK_1 Tx_espera btfss TXSTA,TRMT ;Comprueba si se ha enviado ya. goto Tx_espera ;Esperar hasta que se envíe. BANK_0 RETURN ;********************************************** ;TRATAMIENTO DE INTERRUPCIÓN INTER btfss PIR1,RCIF ;Comprueba interrupción por recepción RETFIE ;NO, retorna bcf INTCON,GIE ;Desctiva interrupciones bcf PIR1,RCIF ;Restaura el flag. movf RCREG, w movwf TECLA ;Guarda el dato recibido en la variable TECLA ;Chequea qué tecla se ha pulsado movlw "Q" ;Si es Q giro horario subwf TECLA, w btfsc STATUS, Z ;Tecla Q ? goto HORARIO_1 movlw "W" ;Si es W giro antihorario subwf TECLA, w btfsc STATUS, Z ;Tecla W ? goto ANTIHOR_1 movlw "E" ;Al pulsar E marcha. Al pulsar otra vez PARO subwf TECLA, w btfsc STATUS, Z ;Tecla E ? goto MARCHA_PARO_1 movlw "R" ;Si es R incrementa velocidad subwf TECLA, w btfsc STATUS, Z ;Tecla R ? goto INC_V_1 movlw "T" ;Si es T decrementa velocidad subwf TECLA, w btfsc STATUS, Z ;Tecla T ? goto DEC_V_1 movlw "Y" ;Si es Y desactiva corriente del motor subwf TECLA, w btfsc STATUS, Z ;Tecla Y ? goto NO_TORQUE_1 movlw "I" subwf TECLA, w btfsc STATUS, Z ;Tecla I ? goto VER_ENTRADAS ;Transmite estado de las 12 entradas digitales FIN_INTER bsf INTCON,PEIE ;Activa interrupción de periféricos bsf INTCON,GIE ;Activa interrupciones movf TECLA,w call TX_232 ;Devuelve un eco de la tecla pulsada por RS-232 movlw 0X0D ;envía un retorno de carro. call TX_232 RETFIE NO_TORQUE_1 bcf CONTROL,2 movf PORTC,w andlw B'11111001' ;Elimina la corriente de las dos fases MOTOR 1 movwf PORTC goto FIN_INTER HORARIO_1 bsf CONTROL,2 bcf CONTROL,0 goto FIN_INTER ANTIHOR_1 bsf CONTROL,2 bsf CONTROL,0 goto FIN_INTER MARCHA_PARO_1 btfss CONTROL,1 ;Invierte es estado del bit 1 del registro CONTROL goto MARCHA_1 goto PARO_1 MARCHA_1 bsf CONTROL,1 goto FIN_INTER PARO_1 bcf CONTROL,1 goto FIN_INTER INC_V_1 decfsz TEMPO_1,f ;Reduce el retardo entre pasos goto FIN_INTER incf TEMPO_1,f goto FIN_INTER DEC_V_1 incfsz TEMPO_1,f ;Incrementa el retardo entre pasos goto FIN_INTER movlw 0XFF movwf TEMPO_1 goto FIN_INTER ;******************************************** VER_ENTRADAS BANK_1 movlw 0XFF movwf PORTB ;PORTB entradas BANK_0 MOVFF PORTA,PUERTOA ;Lee y almacena el estado de los puertos A-D. MOVFF PORTB,PUERTOB MOVFF PORTC,PUERTOC MOVFF PORTD,PUERTOD movlw 0x09 ;Transmite una tabulación. call TX_232 call CHEK_B0 call CHEK_B1 call CHEK_B2 call CHEK_B3 call CHEK_B4 call CHEK_B5 call CHEK_B6 call CHEK_B7 movlw " " call TX_232 ;Separa con un espacio los dos grupos de entradas call CHEK_D6 call CHEK_D7 call CHEK_A4 call CHEK_C0 movlw 0x09 ;Transmite una tabulación. call TX_232 goto FIN_INTER CHEK_B7 btfss PUERTOB,7 goto MANDA_1 goto MANDA_0 CHEK_B6 btfss PUERTOB,6 goto MANDA_1 goto MANDA_0 CHEK_B5 btfss PUERTOB,5 goto MANDA_1 goto MANDA_0 CHEK_B4 btfss PUERTOB,4 goto MANDA_1 goto MANDA_0 CHEK_B3 btfss PUERTOB,3 goto MANDA_1 goto MANDA_0 CHEK_B2 btfss PUERTOB,2 goto MANDA_1 goto MANDA_0 CHEK_B1 btfss PUERTOB,1 goto MANDA_1 goto MANDA_0 CHEK_B0 btfss PUERTOB,0 goto MANDA_1 goto MANDA_0 CHEK_D6 btfss PUERTOD,6 goto MANDA_1 goto MANDA_0 CHEK_D7 btfss PUERTOD,7 goto MANDA_1 goto MANDA_0 CHEK_A4 btfss PUERTOA,4 goto MANDA_1 goto MANDA_0 CHEK_C0 btfss PUERTOC,0 goto MANDA_1 goto MANDA_0 MANDA_0 movlw 0X30 ;Se envía el valor invertido del detectado, puesto que call TX_232 ;las entradas son invertidas por el 74HCT240 RETURN MANDA_1 movlw 0X31 call TX_232 RETURN ;********************************************* ;Programa principal PRINCIPIO BANK_1 movlw 0XFF ;PORTA entradas movwf PORTA movlw B'11111111' movwf PORTB ;PORTB entradas movlw B'10011001' ;PORTC entradas y salidas movwf PORTC movlw B'11000000' ;PORTD entradas y salidas movwf PORTD clrf PORTE ;PORTE salidas movlw b'00100100' movwf TXSTA ;TX en On, modo asíncrono, 8 bits, alta velocidad movlw .64 movwf SPBRG ;19200 baudios con Fosc=20 MHz bsf PIE1,RCIE ;ENABLE interrupción de recepción BANK_0 clrf PORTC clrf PORTD clrf PORTE ;Salidas de PORTE =0 movlw b'10010000' movwf RCSTA ;USART ON bsf INTCON,PEIE ;Activa interrupción de periféricos bsf INTCON,GIE ;Activa interrupciones movlw 0x01 movwf TEMPO_1 ;Carga un valor bajo para el retardo entre pasos. LOOP btfss CONTROL,2 ;Comprueba si está en modo SIN TORQUE goto LOOP btfss CONTROL,1 ;Comprueba si está en modo PARADO CON TORQUE goto LOOP btfsc CONTROL,0 goto INC_PASO DEC_PASO decf PASO_ACTUAL,f movlw b'00000011' ;Borra todos los bits, excepto 0 y 1 andwf PASO_ACTUAL,f goto BUSCA_PASO INC_PASO incf PASO_ACTUAL,f movlw b'00000011' ;Borra todos los bits, excepto 0 y 1 andwf PASO_ACTUAL,f BUSCA_PASO movf PASO_ACTUAL,w call TABLA_PASOS movwf PORTD movf PORTC,w iorlw B'00000110' ;Habilita la corriente para MOTOR1 movwf PORTC call RETARDO goto LOOP TABLA_PASOS addwf PCL,f ;Se crea una tabla con 4 valores(sólo sirven dos bit) para los pasos. retlw b'00000010' ;Paso 1 retlw b'00000000' ;Paso 2 retlw b'00000001' ;Paso 3 retlw b'00000011' ;Paso 4 end ;Fin