Beruflich Dokumente
Kultur Dokumente
com *******
; PROGRAMA : X-Temp_LM35.asm
; Funcion :Medicion de temperatura de 4 canales con 2,56V +Vref externo y
;
sensores LM35, indicacion de temp. en LCD 2x16.
;
;
Medicin de 0 a +150 C
;
;--------------------------------------------------------------------------; Revision : 1.00
Fecha: 22/2/2003
Programa para : PIC16F876
; CPU Clock : 4 MHz
Tiempo instruccion : 1uS
;
WDT : OFF
Tipo de reloj : XT
; Code Prot : OFF
cfg USART rs232 ; none
;
Autor : Daniel C. Martin -> ionitron@x-robotics.com <;************************************************* www.x-robotics.com *******
processor 16F876
LIST
P=16F876
INCLUDE <P16f876.inc>
__config 3D31
PDel0
PDel1
PDel2
BUFFER
DATO_A
DATO_B
Digito
INNER
OUTER
cnt_bit
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0x21
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x2A
ASCII_H
ASCII_M
ASCII_L
HEXADECIMAL
EQU
EQU
EQU
EQU
0x2B
0x2C
0x2D
0x2E
Canal
EQU
0x2F
;---------------------------------------------------------------------------org
goto
0x00
INICIO
;vector de inicio
org
0x05
bcf
bcf
STATUS,RP0
STATUS,RP1
clrf
PORTA
;banco 0
bsf
STATUS,RP0
;banco 1
clrf
clrf
TRISB
TRISC
bcf
STATUS,RP0
;banco 0
clrf
clrf
clrf
PORTA
PORTB
PORTC
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
START
CALL
LCD_INI
;Inicia LCD (CFG puertos...)
START_1
REPETIR
acabar
MOVLW
CALL
MOVLW
CALL
MOVLW
b'00000001'
LCD_REG
b'00000110'
LCD_REG
b'00001100'
CALL
LCD_REG
MOVLW 0x80
CALL
LCD_REG
;MOVF
Digito,w
;CALL
DATO_1
;IORLW 0x00
;BTFSC STATUS,2
;GOTO
acabar
;CALL
LCD_DATOS
;INCF
Digito,f
;GOTO
REPETIR
;===========================================================================
;
Inicio de conversion de valores analogicos
;===========================================================================
;---------------------Configuracion CONVERTIDOR A/D------------------------CFGADC
bsf
STATUS,RP0
;Banco 1
bcf
STATUS,RP1
movlw
movwf
movlw
movwf
b'00000011'
ADCON1
b'11111111'
TRISA
bcf
movlw
movwf
bcf
STATUS,RP0
b'01000001'
ADCON0
PIR1,ADIF
;Banco 0
;seleccion Tad, canales para
;conversion y A/D=ON
;limpia flag de conversion completa
;
FIN de configuracion de registros
;--------------------------------------------------------------------------lecturas
movlw
d'0'
movwf
call
Canal
RUN_ADC
movlw
call
movlw
call
movlw
call
movlw
call
0x80
LCD_REG
'T'
LCD_DATOS
'1'
LCD_DATOS
'='
LCD_DATOS
call
inLCD
;visualiza dato--------------------movlw 0xDF
;
call
LCD_DATOS
;Visualiza caracter
movlw 0x20
;" "
call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'1'
;selecciona canal ADC
movwf Canal
call
RUN_ADC
movlw
call
movlw
call
movlw
call
movlw
call
0x88
LCD_REG
'T'
LCD_DATOS
'2'
LCD_DATOS
'='
LCD_DATOS
call
inLCD
;visualiza dato--------------------movlw 0xDF
;
call
LCD_DATOS
;Visualiza caracter
movlw 0x20
;" "
call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'2'
;selecciona canal ADC
movwf Canal
call
RUN_ADC
movlw
call
movlw
call
movlw
call
movlw
call
0xC0
LCD_REG
'T'
LCD_DATOS
'3'
LCD_DATOS
'='
LCD_DATOS
call
movlw
call
movlw
inLCD
0xDF
LCD_DATOS
0x20
;visualiza dato--------------------;
;Visualiza caracter
;" "
;Visualiza caracter
;Visualiza caracter
call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'4'
;selecciona canal ADC
movwf Canal
call
RUN_ADC
movlw
call
movlw
call
movlw
call
movlw
call
0xC8
LCD_REG
'T'
LCD_DATOS
'4'
LCD_DATOS
'='
LCD_DATOS
call
inLCD
;visualiza dato--------------------movlw 0xDF
;
call
LCD_DATOS
;Visualiza caracter
movlw 0x20
;" "
call
LCD_DATOS
;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call
delay
;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
goto
lecturas
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;--------------------------------------------------------------------------RUN_ADC
bcf
bcf
STATUS,RP0
STATUS,RP1
;Banco 0
;Banco 0
movlw
movwf
;bcf
rlf
rlf
rlf
iorwf
;bsf
rrf
rrf
bcf
b'01000001'
ADCON0
ADCON0,ADON
Canal,F
Canal,F
Canal,W
ADCON0,F
ADCON0,ADON
Canal,F
Canal,F
PIR1,ADIF
;enciende el convertidor
;retorna a la anterior
;limpia flag de conversion completa
nop
nop
GO_ADC
bsf
wait_ADC
btfsc
goto
READ_OK
wait_ADC
;bucle
;mostrar en lcd!************************************************************
inLCD
movf
ADRESH,W
call
Hex_Ascii
bcf
bcf
STATUS,RP0
STATUS,RP1
bcf
movf
xorlw
btfsc
goto
movf
CALL
STATUS,Z
ASCII_H,W
;sobreescribe el dato distancia
0x30
;Comprueba si es cero a la izquierda
STATUS,Z
cero_izquierda
ASCII_H,W
LCD_DATOS
;Visualiza caracter
cero_izquierda movf
ASCII_M,W
;iorlw 0x00
;btfss STATUS,Z
CALL
LCD_DATOS
movf
CALL
ASCII_L,W
LCD_DATOS
call
call
DELAY_5MS
DELAY_5MS
;banco 0
return
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;#########################################################RUTINAS DE LCD####
LCD_E
BSF
PORTC,2
;Activa seal E
NOP
NOP
NOP
;Espera 1uS
BCF
PORTC,2
;Desactiva seal E
RETURN
LCD_BUSY
L_BUSY
BSF
BSF
MOVLW
MOVWF
BCF
BSF
NOP
BTFSC
GOTO
PORTC,1
STATUS,RP0
0xFF
TRISB
STATUS,RP0
PORTC,2
PORTB,7
L_BUSY
BCF
BSF
CLRF
BCF
BCF
RETURN
PORTC,2
STATUS,RP0
TRISB
STATUS,RP0
PORTC,1
LCD_REG
BCF
MOVWF
CALL
GOTO
PORTC,0
PORTB
LCD_BUSY
LCD_E
LCD_DATOS
BCF
MOVWF
CALL
BSF
GOTO
PORTC,0
PORTB
LCD_BUSY
PORTC,0
LCD_E
LCD_INI
MOVLW
CALL
CALL
MOVLW
CALL
CALL
MOVLW
CALL
CALL
RETURN
b'00111000'
LCD_REG
DELAY_5MS
b'00111000'
LCD_REG
DELAY_5MS
b'00111000'
LCD_REG
DELAY_5MS
;Codigo de instruccion
;Temporiza 5 mS.
;Codigo de instruccion
;Temporiza 5 mS.
;Codigo de instruccion
;Temporiza 5 mS.
;****************************************************************************
;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de
;inicio del LCD
DELAY_5MS
movlw .6
; 1 set number of repetitions (B)
movwf PDel0
; 1 |
PLoop1
movlw .207
; 1 set number of repetitions (A)
movwf PDel1
; 1 |
PLoop2
nop
; 1 clear watchdog
decfsz PDel1, 1
; 1 + (1) is the time over? (A)
goto
PLoop2
; 2 no, loop
decfsz PDel0, 1
; 1 + (1) is the time over? (B)
goto
PLoop1
; 2 no, loop
PDelL1
goto
PDelL2
; 2 cycles delay
PDelL2
nop
; 1 cycle delay
return
; 2+2 Done
;###########################################################################
del_1ms
in_lp
delay
out_lp
movlw
movwf
nop
nop
decfsz
goto
return
d'199'
INNER
movwf
call
OUTER
del_1ms
;delay 1mS
INNER,F
in_lp
;vueltas de 1mS
decfsz OUTER,F
goto
out_lp
return
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
Hex_Ascii
;
.254
HEXADECIMAL
ASCII_H
ASCII_M
ASCII_L
movlw
subwf
btfss
goto
movwf
incf
goto
D'100'
HEXADECIMAL,W
STATUS,C
Decenas
HEXADECIMAL
ASCII_H,F
Centenas
;D'100' --> W
;HEXADECIMAL - D'100' --> W
; HEXADECIMAL es menor que D'100' ?
;Si
;Salva el resto
;Incrementa el contador de centenas BCD
;Vuelve por otros D'100'
movlw
subwf
btfss
goto
movwf
incf
goto
D'10'
HEXADECIMAL,W
STATUS,C
Unidades
HEXADECIMAL
ASCII_M,F
Decenas
;D'10' --> W
;HEXADECIMAL - D'10' --> W
; HEXADECIMAL es menor que D'10' ?
;Si
;Salva el resto
;Incrementa el contador de decenas BCD
;Vuelve por otros D'10'
movf
movwf
clrf
HEXADECIMAL,W
ASCII_L
HEXADECIMAL
movlw
iorwf
iorwf
H'30'
ASCII_L,F
ASCII_M,F
;H'30' --> W
;Convierte de BCD a ASCII
;Convierte de BCD a ASCII
movf
btfsc
goto
movlw
iorwf
return
ASCII_H,F
STATUS,Z
Espacio
H'30'
ASCII_H,F
;ASCII_H --> F
;? ASCII_H es D'00' ?
;Si
;H'30' --> W
;Convierte de BCD a ASCII
;Retorna
movlw
movwf
'0'
ASCII_H
;
Centenas
;
;
Decenas
;
;
Unidades
;
;
Bcd_A_Ascii
;
;
Espacio
;
;A' ' --> W
;A' ' --> ASCII_H
;movwf ASCII_M
;A' ' --> ASCII_H
;movwf ASCII_L
;A' ' --> ASCII_H
return
;Retorna
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
; Description: Waits 100 cycles
;------------------------------------------------------------Delayp1
movlw .23
; 1 set number of repetitions
movwf PDel0
; 1 |
PLoop02
nop
; 1 clear watchdog
decfsz PDel0, 1
; 1 + (1) is the time over?
goto
PLoop02
; 2 no, loop
PDelL12
goto
PDelL22
; 2 cycles delay
PDelL22
nop
; 1 cycle delay
return
; 2+2 Done
END
;************************************************* www.x-robotics.com *******