; NA05.ASM ; MOVDRV-1/LCD: LECTURA Y PRESENTACIÓN EN LCD DE LAS 4 ENTRADAS ANALÓGICAS. ; Ref. NA05 ; 1/2/2003 ; ; SELEKRON MICROCONTROL S.L. www.selekron.com ; ; Se representa el valor de la conversión de las entradas anlógicas sobre el LCD. ; Para simular la presencia de sensores en las entradas analógicas, se pueden conectar 4 potenciómetros de 4K7 ; en los conectores J2, J3, J5 y J6, con el cursor en el pin 2 y los extremos en los pines 4 y 5, resp. ; Véase el esquema eléctrico de las entradas en el manual de la placa MOVDRV-1. ; Téngase en consideración que el PORTB es compartido por el bus de datos del LCD y las salidas del 74HCT240. ; Por tanto, al hacer un acceso al LCD hay que deshabilitar el 74HCT240 (bsf PORTE,2) ; El microcontrolador es un PIC16F877A trabajando a 20 MHz. LIST P=16F877A include __CONFIG _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF #define EN_LCD bsf PORTC,5 ;Línea E=1 #define DIS_LCD bcf PORTC,5 ;Línea E=0 #define LECTURA bsf PORTE,1 ;LCD Modo RD #define ESCRITURA bcf PORTE,1 ;LCD Modo WR #define INSTRUCCION bcf PORTE,0 ;Línea RS=0 #define MODO_DATO bsf PORTE,0 ;Línea RS=1 #define HCT240_EN bcf PORTE,2 ;Habilita las salidas del 74HCT240 hacia RB0-RB7 #define HCT240_DIS bsf PORTE,2 ;Deshabilita las salidas del 74HCT240 hacia RB0_RB7 cblock 0x20 CHAR ;Contiene el carácter para enviar al LCD. INS ;Contiene la instrucción para enviar al LCD. TEMP TEMP2 ;Variables temporales CONT ;Variable para contadores. TEMPO_1 TEMPO_2 TEMPO_3 ;Variables para temporizadores BCD2 BCD1 BCD0 ;Resultado de la conversión a BCD N_CANAL ;Número de canal actual del ADC HBYTE ;Usadas en la conversión 16 bits binario a BCD. LBYTE endc ;**************************************************** BANK_0 macro ;Macros de selección de bancos bcf STATUS,RP0 endm BANK_1 macro bsf STATUS,RP0 endm MOVFF macro origen,destino ;COPIA EL CONTENIDO DE 'origen' hacia 'destino' movf origen,W movwf destino endm CLR_LCD macro movlw b'00000001' ;Borra el LCD call SEND_INS endm LCD_OFF macro movlw b'00001000' call SEND_INS ;Apaga LCD endm LCD_ON macro movlw b'00001100' call SEND_INS ;Enciende LCD, con cursor off, blind off endm L1_P0 macro movlw 0X80 ;Coloca el cursor en línea 1, posición 0 call SEND_INS endm L1_P8 macro movlw 0X87 ;Coloca el cursor en línea 1, posición 8 call SEND_INS endm L2_P0 macro movlw 0XC0 ;Coloca el cursor en línea 2, posición 0 call SEND_INS endm L2_P8 macro movlw 0XC7 ;Coloca el cursor en línea 2, posición 8 call SEND_INS endm ;**************************************************** org 0x00 goto INICIO SEND_CHAR movwf CHAR ;Enviará el carácter existente en w. call BUSY_CHECK ;Chequea el flag busy. MODO_DATO movf CHAR,w movwf PORTB ;Coloca el dato en PORTB EN_LCD ;Pulso Enable de 1 uS. nop nop nop nop DIS_LCD return SEND_INS movwf INS ;Enviará la instrucción existente en w call BUSY_CHECK ;Chequea el flag busy movf INS,w movwf PORTB ;Coloca el dato en PORTB EN_LCD ;Pulso Enable de 1 uS. nop nop nop nop DIS_LCD return BUSY_CHECK LECTURA BANK_1 movlw 0xff movwf TRISB ;Port B entradas BANK_0 INSTRUCCION BUSY_1 EN_LCD ;Pulso Enable 1uS. nop nop nop nop DIS_LCD movf PORTB,w movwf TEMP btfsc TEMP,7 ; Chequea el bit busy goto BUSY_1 ; Si está ocupado, chequea de nuevo ESCRITURA BANK_1 clrf TRISB ;Port B salidas BANK_0 return TEMPO_LCD movlw .40 ;Retardo para inicialización del LCD. movwf TEMPO_1 clrf TEMPO_2 TEMPO_LCD1 decfsz TEMPO_2,f goto TEMPO_LCD1 decfsz TEMPO_1,f goto TEMPO_LCD1 return ;******************** Antes de llamar a CANAL_AD hay que poner en N_CANAL el nº de canal a adquirir******** CANAL_AD bcf PIR1,ADIF ;Restaura flag de fin de conversión. movlw b'11000111' andwf ADCON0,f ;Borra Nº canal rlf N_CANAL,f rlf N_CANAL,f rlf N_CANAL,w iorwf ADCON0,f movlw .50 ;Retardo para cumplir el Tadq. ( XTAL= 20 MHZ) movwf TEMPO_1 DELAY_ADQ decfsz TEMPO_1,f goto DELAY_ADQ bsf ADCON0,GO ;Inicia conversión ADC_WAIT btfss PIR1,ADIF ;Acabada conversión ? goto ADC_WAIT return ;Si ;******************************************* CANAL_0 movlw .0 ;Este canal no se visualiza en este programa. Corresponde al muestreo movwf N_CANAL ;de la tensión de alimentación: Vin/5 goto CANAL_AD ;******************************************* CANAL_1 movlw .1 movwf N_CANAL goto CANAL_AD ;******************************************* CANAL_2 movlw .2 movwf N_CANAL goto CANAL_AD ;******************************************* CANAL_3 movlw .3 movwf N_CANAL goto CANAL_AD ;******************************************* CANAL_4 movlw .4 movwf N_CANAL goto CANAL_AD ;****************************************************************************************** ; Esta rutina lee el valor del canal actual del ADC y lo guarda en LBYTE y HBYTE. LEE_ADC BANK_1 movf ADRESL,W BANK_0 ;Lee el byte bajo de la conversión movwf LBYTE ;Guarda en LBYTE movf ADRESH,W ;Lee el byte alto de la conversión movwf HBYTE ;Guarda en HBYTE return ;**************************************************************************************** ;Convierte el número binario de 16 bits contenido en HBYTE y LBYTE en 5 dígitos BCD que quedarán ;en BCD0, BCD1 y BCD2 (LSB). Es adaptación de una rutina de Microchip. B2_BCD bcf STATUS,C clrf CONT bsf CONT,4 ;CONTADOR=16 clrf BCD0 clrf BCD1 clrf BCD2 LOOP16 rlf LBYTE,F rlf HBYTE,F rlf BCD2,F rlf BCD1,F rlf BCD0,F ;Multiplica por 2 decfsz CONT,F goto ADJ return ADJ movlw BCD2 movwf FSR call ADJ_BCD incf FSR,F call ADJ_BCD incf FSR,F call ADJ_BCD goto LOOP16 ADJ_BCD movf INDF,W addlw 0x03 movwf TEMP2 btfsc TEMP2,3 ;Comprueba si es mayor de 7 movwf INDF movf INDF,W addlw 0x30 movwf TEMP2 btfsc TEMP2,7 ;Comprueba si es mayor de 7 movwf INDF return ;***************************************************************************** ;Desempaqueta, convierte a ASCII y envía al LCD, los 5 dígitos BCD contenidos en BCD0, BCD1 y BCD2. VISUALIZA movf BCD0,W iorlw 0x30 ;Dígito de más peso ;call SEND_CHAR ;No se transmite este dígito, porque es cero. movf BCD1,W movwf TEMP2 swapf TEMP2,W andlw 0x0f iorlw 0x30 call SEND_CHAR ;Envía el nible de más peso de BCD1 movf TEMP2,W andlw 0x0f iorlw 0x30 call SEND_CHAR ;Envía el nible de menos peso de BCD1 movf BCD2,W movwf TEMP2 swapf TEMP2,W andlw 0x0f iorlw 0x30 call SEND_CHAR ;Envía el nible de más peso de BCD2 movf TEMP2,W andlw 0x0f iorlw 0x30 call SEND_CHAR ;Envía el nible de menos peso de BCD2 return ;***************************************************************************** INICIO clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE BANK_1 movlw b'00111111' ;RA0,RA1,RA2,RA3,RA4 y RA5 entradas. movwf TRISA clrf TRISB ;Port B salidas. movlw B'11011111' ;Port C entradas excepto RC5 (LCD_ENABLE) movwf TRISC movlw 0XFF ;Port D entradas movwf TRISD clrf TRISE ;Port E salidas. movlw b'10000010' ;A/D justificado derecha. AN0-AN4 analógicos. AN5-AN7 digitales movwf ADCON1 BANK_0 HCT240_DIS ;Deshabilita las salidas del 74HCT240 movlw b'10000001' ;Fosc/32. ADC en ON. movwf ADCON0 movlw b'00111000' ;Envía código inicialización al LCD, 3 veces con un intervalo. call SEND_INS call TEMPO_LCD movlw b'00111000' call SEND_INS call TEMPO_LCD movlw b'00111000' call SEND_INS call TEMPO_LCD ;FIN INICIALIZACION CLR_LCD ;Borra el display LCD_ON ;LCD ON, CURSOR OFF, BLINK OFF. LOOP L1_P0 ;Cursor del LCD línea 1, posición 0. call CANAL_1 call LEE_ADC ;Lee el valor de la conversión call B2_BCD ;Convierte a BCD. call VISUALIZA L1_P8 ;Sitúa el cursor en línea 1, posición 8 call CANAL_2 call LEE_ADC ;Lee el valor de la conversión call B2_BCD ;Convierte a BCD. call VISUALIZA L2_P0 ;Cursor en línea 2, posición 0 call CANAL_3 call LEE_ADC ;Lee el valor de la conversión call B2_BCD ;Convierte a BCD. call VISUALIZA L2_P8 ;Cursor en línea 2, posición 8 call CANAL_4 call LEE_ADC ;Lee el valor de la conversión call B2_BCD ;Convierte a BCD. call VISUALIZA goto LOOP end