; MOVDRV-1: Control de 2 motores DC y lectura de sensores digitales ; ; Adaptación de la nota NA01 para PIC18F452 ; ; 10/1/04 ; Ref. NA-01_F452 ; 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. Los dos motores giran en el mismo sentido. ;F Avanza hacia atrás. Los dos motores giran en el mismo sentido. ;W Rotación a la izquierda. Los dos motores giran en sentido opuesto. ;Z Rotación a la derecha. Los dos motores giran en sentido opuesto. ;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 PIC18F452 I/P trabajando a 20 MHz ;sin multipicador del oscilador ;Este ejemplo es una adaptación directa para PIC18F452 del programa original para PIC16F877A. ;Creado y ensamblado con MPLAB IDE v6.30 LIST P=18F452 #include ;****************************************************************************** ;Bits de configuración __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H __CONFIG _CONFIG2L, _BOR_OFF_2L & _PWRT_OFF_2L __CONFIG _CONFIG2H, _WDT_OFF_2H __CONFIG _CONFIG3H, _CCP2MX_OFF_3H __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L __CONFIG _CONFIG7H, _EBTRB_OFF_7H ;****************************************************************************** CBLOCK 0x080 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 ;****************************************************************************** ;Vector de RESET ORG 0x0000 goto PRINCIPIO ;****************************************************************************** ;Vector de interrupción de alta prioridad ;El programa de atención a interrupción de alta prioridad se ejecutará siempre que ocurra una ;interrupción de alta prioridad, o cuando se produzca cualquier interrupción si la prioridad de ;interrupción no está habilidada. ORG 0x0008 bra INTER ;Salta al programa de atención a interrupción de alta prioridad. ;****************************************************************************** ;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 FAST ;******************************************************************************* ; goto INTER ;Vector de interrupción ;************************************************************************* ;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 Tx_espera btfss TXSTA,TRMT ;Comprueba si se ha enviado ya. goto Tx_espera ;Esperar hasta que se envíe. RETURN ;************************************************************************* PARAR bcf PORTC,1 bcf PORTC,2 goto FIN_INTER ADELANTE 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 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 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 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 movlw 0XFF movwf TRISB ;PORTB entradas 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 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 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