; MOVDRV-1: Control de 2 motores DC y lectura de sensores digitales ; 10/1/03 ; Ref. NA-01 Rev. 2 ; SELEKRON MICROCONTROL S.L. www.selekron.com ; ;Este sencillo programa muestra cómo controlar 2 motores DC en modo bidireccional por RS-232 ;mediante la tarjeta MOVDRV-1, y cómo leer el estado de 12 entradas digitales. ;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 ;Se controlarán 4 modos de marcha: ADELANTE, ATRÁS, ROTAR DERECHA y ROTAR IZQUIERDA. ;Se leerá el estado de los 12 sensores digitales, enviándolo al PC. ;Se devuelve un eco de la tecla pulsada ; ;Suponemos los 2 motores montados sobre una plataforma móvil de tipo TRICICLO, con 2 ruedas motrices, ;una en cada motor, y la tercera rueda de giro libre. ;Configuramos convenientemente los jumpers asociados a las entradas digitales para polarizar éstas ;al nivel deseado. Las resistencias pull-up y pull-down de la placa son de 47 Kohmios. ;Los niveles de entrada se pueden simular mediante variación de estos jumpers,o conectar sensores ;reales en las entradas. Por ejemplo, se puede llevar el jumper J14 a nivel bajo mientras se ;conecta en la entrada 1(pin 2 de J26) un pulsador hacia la línea +5V(pin 4) ó +5VLIMITADA( pin 3) ;El mismo procedimiento para el resto de entradas. ; ;TECLAS DE CONTROL: ; ; ;A Avanza hacia adelante ;F Avanza hacia atrás ;W Rotación a la izquierda ;Z Rotación a la derecha ;Q Para los 2 motores ;I DEVUELVE EL ESTADO DE LOS 12 SENSORES DIGITALES COMO '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 endc ;*********************************************************************** 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 ; bcf STATUS,RP1 endm BANK_1 macro bsf STATUS,RP0 ; bcf STATUS,RP1 ;Este programa sólo usa los bancos 1 y 2 endm ;BANK_2 macro ; bcf STATUS,RP0 ; bsf STATUS,RP1 ; endm ;BANK_3 macro ; bsf STATUS,RP0 ; bsf STATUS,RP1 ; endm ;************************************************************************* ;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 ;Pasa el dato recibido a W. movwf TECLA ;Guarda el dato recibido en la variable TECLA ;Chequea qué tecla se ha pulsado movlw "A" ;Si es A avanza hacia ADELANTE subwf TECLA, w btfsc STATUS, Z goto ADELANTE movlw "F" ;Si es F avanza hacia ATRÁS subwf TECLA, w btfsc STATUS, Z goto ATRAS movlw "W" ;Si es W gira a la IZQUIERDA subwf TECLA, w btfsc STATUS, Z goto IZQUIERDA movlw "Z" ;Si es X gira a la DERECHA subwf TECLA, w btfsc STATUS, Z goto DERECHA movlw "Q" ;Si es Q para los motores subwf TECLA, w btfsc STATUS, Z goto PARAR 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 PARAR BANK_0 bcf PORTC,1 bcf PORTC,2 goto FIN_INTER ADELANTE BANK_0 bsf PORTD,0 bsf PORTD,1 ;Motores 1 y 2 hacia adelante bsf PORTC,1 bsf PORTC,2 ;Activa motores 1 y 2 goto FIN_INTER ATRAS BANK_0 bcf PORTD,0 bcf PORTD,1 ;Motores 1 y 2 hacia atrás bsf PORTC,1 bsf PORTC,2 ;Activa motores 1 y 2 goto FIN_INTER IZQUIERDA BANK_0 bsf PORTC,1 bsf PORTC,2 ;Activa motores 1 y 2 bsf PORTD,0 bcf PORTD,1 ;Motor 1 derecha y 2 izquierda goto FIN_INTER DERECHA BANK_0 bsf PORTC,1 bsf PORTC,2 ;Activa motores 1 y 2 bcf PORTD,0 bsf PORTD,1 ;Motor 1 izquierda y 2 derecha goto FIN_INTER VER_ENTRADAS BANK_1 movlw 0XFF movwf TRISB ;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 ;Enviamos 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 clrf PORTE ;Salidas de PORTE =0 BANK_1 movlw 0XFF ;PORTA entradas movwf TRISA movlw B'11111111' movwf TRISB ;PORTB entradas movlw B'10011001' ;PORTC entradas y salidas movwf TRISC movlw B'11000000' ;PORTD entradas y salidas movwf TRISD clrf TRISE ;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 movlw b'10010000' movwf RCSTA ;USART ON bsf INTCON,PEIE ;Activa interrupción de periféricos bsf INTCON,GIE ;Activa interrupciones LOOP goto LOOP end