2
« 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