SoloCodigo
		Programación Específica => Microcontroladores => Mensaje iniciado por: drdrink32 en Miércoles 16 de Febrero de 2005, 23:40
		
			
			- 
				Hola!! Estoy desarrollando un codigo para mi proyecto, un altimetro digital. Lo tengo casi listo, pero al probarlo en el pic, no me salen los datos que corresponderian en el  LCD.
 
 Las caracteristicas son:
 
 Un conversor A/D de 10 bits, para obetener una resolucion de 1024 bits. Con una precision de 10 metros, tendriamos un rango de o a 10000 metros (aprox).
 El conversor esta conectado a un circuito que lleva un sensor de presion, pero bueno, eso ya queda en tensiones de referencia y demas. El tema es que convierta a digital y muestre los datos en el lcd
 Aqui os dejo el codigo que llevo hecho! (espero que si a alguien le sirve, lo aproveche!!!!!)
 
 Lo teneis tb para descargar para quien no lo vea bien por aqui
 
 processor 16F876
 
 LIST   P=16F876
 
 INCLUDE   <P16f876.inc>
 
 __config 3D31
 
 
 
 
 PDel0      EQU   0x21
 PDel1      EQU   0x22
 PDel2      EQU   0x23
 BUFFER      EQU   0x24
 ADRESH1      EQU   0x25
 ADRESL1    EQU   0x26
 Digito      EQU   0x27
 INNER      EQU   0x28
 OUTER      EQU   0x29
 cnt_bit      EQU   0x2A
 
 MILES      EQU   0x2B
 CENTENES   EQU   0x2C
 DECENES    EQU   0x2D
 UNIDAES    EQU   0x2E
 
 
 
 org    0x00
 goto    INICIO
 
 
 org    0x05
 
 
 
 
 INICIO
 
 ;Inicializacion de puertos
 bcf      STATUS,RP0   ;banco 0
 bcf      STATUS,RP1
 
 clrf   PORTA
 bsf      STATUS,RP0   ;banco 1
 
 clrf   TRISB      ;portb como salida
 clrf   TRISC
 
 bcf      STATUS,RP0   ;banco 0
 
 
 clrf   PORTA
 clrf   PORTB
 clrf   PORTC
 
 ;Programa principal
 
 
 CALL    LCD_INI         ;Inicia LCD (CFG puertos...)
 MOVLW   b'00000001'     ;Borrar LCD y Home
 CALL    LCD_REG
 MOVLW   b'00000110'     ;
 CALL    LCD_REG
 MOVLW   b'00001100'     ;LCD On, cursor Off,Parpadeo Off
 CALL    LCD_REG
 MOVLW   0x80            ;Direccion caracter
 CALL    LCD_REG
 CALL   COMIENZA
 movlw   'T'
 call    LCD_DATOS       ;Visualiza caracter
 movlw   '1'
 call    LCD_DATOS       ;Visualiza caracter
 movlw   '='
 call    LCD_DATOS       ;Visualiza caracter
 
 call   inLCD      ;visualiza
 movlw   0xDF      ;º
 call    LCD_DATOS       ;Visualiza caracter
 movlw   0x20      ;" "
 call    LCD_DATOS       ;Visualiza caracter
 
 
 
 
 ;//////////////////////////////////////////////////////////////
 ;/////////////////CONVERSOR A/D DE 10 BITS/////////////////////
 ;//////////////////////////////////////////////////////////////
 
 Conversion_AD
 
 ; Configuracion ADCON0
 
 movlw   b'10000001'
 movwf   ADCON0
 
 ; Configuracion ADCON1
 
 BANKSEL ADCON1
 movlw   b'10000101'
 movwf   ADCON1
 BANKSEL ADCON0
 return
 
 ; Se inicia el AD
 LeerAD
 bsf       ADCON0, GO_DONE      ;Inicio
 btfsc   ADCON0, GO_DONE
 goto    $-1         ;Espera al fin de la conversion
 
 return
 
 ;//////////////////////////////////////////////////////////////
 ;////////////////RUTINAS DE CONTROL DE LCD/////////////////////
 ;//////////////////////////////////////////////////////////////
 
 LCD_E           BSF     PORTC,2         ;Activa señal E
 NOP
 NOP
 NOP                     ;Espera 1uS
 BCF     PORTC,2         ;Desactiva señal E
 RETURN
 
 LCD_BUSY        BSF     PORTC,1         ;Pone el LCD en modo lectura
 BSF     STATUS,RP0      ;Selecciona el Banco 1
 MOVLW   0xFF
 MOVWF   TRISB           ;Puerta B act£a de entrada
 BCF     STATUS,RP0      ;Selecciona el Banco 0
 BSF     PORTC,2         ;Activa el LCD (Señal E)
 NOP
 L_BUSY          BTFSC   PORTB,7         ;Chequea el bit BUSY
 GOTO    L_BUSY          ;Est  a "1" (Ocupado)
 BCF     PORTC,2         ;Desactiva el LCD (Se¤al E)
 BSF     STATUS,RP0      ;Selecciona el Banco 1
 CLRF    TRISB           ;Puerta B actua como salida
 BCF     STATUS,RP0      ;Selecciona el Banco 0
 BCF     PORTC,1         ;Pone el LCD en modo escritura
 RETURN
 
 LCD_REG         BCF     PORTC,0         ;Desactiva RS (Modo instruccion)
 MOVWF   PORTB           ;Saca el codigo de instruccion
 CALL    LCD_BUSY        ;Espera a que se libere el LCD
 GOTO    LCD_E           ;Genera pulso en señal E
 
 LCD_DATOS       BCF     PORTC,0         ;Desactiva RS (Modo instrucci¢n)
 MOVWF   PORTB           ;Valor ASCII a sacar por PORTB
 CALL    LCD_BUSY        ;Espera a que se libere el LCD
 BSF     PORTC,0         ;Activa RS (Modo dato)
 GOTO    LCD_E           ;Genera pulso en señal E
 
 LCD_INI         MOVLW   b'00111000'
 CALL    LCD_REG         ;Codigo de instruccion
 CALL    DELAY_5MS       ;Temporiza 5 mS.
 MOVLW   b'00111000'
 CALL    LCD_REG         ;Codigo de instruccion
 CALL    DELAY_5MS       ;Temporiza 5 mS.
 MOVLW   b'00111000'
 CALL    LCD_REG         ;Codigo de instruccion
 CALL    DELAY_5MS       ;Temporiza 5 mS.
 RETURN
 
 
 
 ;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de
 ;inicio del LCD
 
 DELAY_5MS     movlw   .6
 movwf   PDel0
 PLoop1     movlw   .207
 movwf   PDel1
 PLoop2       nop
 decfsz  PDel1, 1
 goto    PLoop2
 decfsz  PDel0,  1
 goto    PLoop1
 PDelL1     goto   PDelL2
 PDelL2     nop
 return
 
 
 del_1ms      movlw   d'199'
 movwf   INNER
 in_lp      nop
 nop
 decfsz   INNER,F
 goto   in_lp
 return
 
 delay      movwf   OUTER      ;vueltas de 1mS
 out_lp      call   del_1ms
 decfsz   OUTER,F
 goto   out_lp
 return
 
 ;//////////////////////////////////////////////////////////////
 ;/////////RUTINA DE CONVERSION DE DATOS OBTENIDOS//////////////
 ;//////////////////////////////////////////////////////////////
 
 ; "Extraccion" de datos del conversor A/D
 
 COMIENZA
 CLRF   MILES
 CLRF   CENTENES
 CLRF   DECENES
 MOVF   ADRESL,0
 MOVWF   ADRESL1
 MOVF   ADRESH,0
 MOVWF   ADRESH1
 cuentacent
 MOVLW   d'100'
 SUBWF   ADRESL1,0
 BTFSS   STATUS,C
 GOTO    inccent
 miraADRESH
 MOVF   ADRESH1,0
 BTFSC   STATUS,Z
 GOTO    cuentadec
 decADRESH
 DECF   ADRESH1,1
 MOVLW   d'156'
 ADDWF   ADRESL1,1
 inccent
 INCF   CENTENES,1
 GOTO    cuentacent
 
 cuentadec
 MOVLW   d'10'
 SUBWF   ADRESL1,0
 BTFSC   STATUS,C
 GOTO    fin
 INCF   DECENES,1
 GOTO    cuentadec
 
 fin
 MOVF    ADRESH1,0
 MOVWF   UNIDAES
 
 Bcd_A_Ascii
 movlw    H'30'           ;H'30' --> W
 iorwf   DECENES,F       ;Convierte de BCD a ASCII
 iorwf   CENTENES,F      ;Convierte de BCD a ASCII
 movf    MILES,F         ;ASCII_H --> F
 btfsc   STATUS,Z        ;? ASCII_H es D'00' ?
 goto    Espacio         ;Si
 movlw   H'30'           ;H'30' --> W
 iorwf   MILES,F         ;Convierte de BCD a ASCII
 return                  ;Retorna
 Espacio
 ;
 movlw   '0'            ;A' ' --> W
 movwf   MILES      ;A' ' --> ASCII_H
 movwf   CENTENES     ;A' ' --> ASCII_H
 movwf   DECENES     ;A' ' --> ASCII_H
 return                  ;Retorna
 
 END
- 
				 Estoy desarrollando un codigo para mi proyecto, un altimetro digital. Lo tengo casi listo, pero al probarlo en el pic, no me salen los datos que corresponderian en el LCD. 
 - Hola, gracias por colgar el codigo junto con tu consulta, asi se nos es mas facil ayudarte :) .. cuando mensionas esto de arriba, "no me salen los datos que corresponderian en el LCD", los datos son erroneos porque sin duda alguna estas haciendo una mala conversion de la informacion. Para probar y no tener luchas con sensores podrias emular el mismo con una resistencia variable, cuando logres que la coversion y la muestra de los datos sea correcta, montas los sensores y continuas las pruebas. Aparentemente tomas bien el dato, pero lo conviertes mal.
 Voy a rebizar el codigo, por la tarde te dejare una rutina de conversion para leer el ADC e imprimirlo en el LCD, es un lector de temperaturas simple del cual puedes utilizar partes del codigo para tu proyecto. Bajare el archivo para leerlo detenidamente. Saludos :)
- 
				COMIENZA
 CLRF   MILES
 CLRF   CENTENES
 CLRF   DECENES
 MOVF   ADRESL,0
 MOVWF   ADRESL1
 MOVF   ADRESH,0
 MOVWF   ADRESH1
 cuentacent
 MOVLW   d'100'
 SUBWF   ADRESL1,0
 BTFSS   STATUS,C
 GOTO  inccent
 miraADRESH
 MOVF   ADRESH1,0
 BTFSC   STATUS,Z
 GOTO  cuentadec
 
 
 - Algo que encontre leyento el code es que recoges los datos del bufer del ADC pero no entras en los bancos correspondientes. Dependiendo de la configuracion de tu ADC debes buscar los datos entrando en el banco que corresponda. El compilador no te arroja ningun Warning???. Saludos :)