• Lunes 29 de Abril de 2024, 11:15

Autor Tema:  Altimetro Digital  (Leído 2861 veces)

drdrink32

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Altimetro Digital
« en: Miércoles 16 de Febrero de 2005, 23:40 »
0
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
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Altimetro Digital
« Respuesta #1 en: Jueves 17 de Febrero de 2005, 13:51 »
0
Citar
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 :)
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Altimetro Digital
« Respuesta #2 en: Jueves 17 de Febrero de 2005, 15:24 »
0
Citar
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 :)
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»