TERMOMETRO CON PIC16F877A E LM35 CODICE ASSEMBLER
MessaggioInviato:29 apr 2017, 12:17
ciao voglio realizzare unTERMOMETRO CON PIC 16F877A, SENSORE TEMPERATURA LM35 E DISPLAY 16x2.
Il progetto ha un messaggio iniziale con shift verso destra.
Funziona su un range di temperatura da 0 - 100 °C con step di temperatura ogni 0.5°C.
Dopo i 100°C viene visualizzato un messaggio lampeggiante Tc>100°C.
ORA VORREI AGGIUNGERE ANCHE LE TEMPERATURE NEGATIVE...MA NON RIESCO!!! HELP!
GRAZIE
Il progetto ha un messaggio iniziale con shift verso destra.
Funziona su un range di temperatura da 0 - 100 °C con step di temperatura ogni 0.5°C.
Dopo i 100°C viene visualizzato un messaggio lampeggiante Tc>100°C.
ORA VORREI AGGIUNGERE ANCHE LE TEMPERATURE NEGATIVE...MA NON RIESCO!!! HELP!
GRAZIE
Codice: Seleziona tutto
;TERMOMETRO CON PIC16F877A, SENSORE LM35, DISPLAY 16x2
;RANGE DA 0 - 100 °C, STEP TEMPERATURA DI 0.5°C CON MISURAZIONE OGNI 5 MINUTI
PROCESSOR 16F877A
RADIX DEC
INCLUDE "P16F877A.inc"
;------------------------------------------------------------------
org 32
cblock 0x20
count1
count2
count3
count4
sample
shift
DATOH
DATOL
POINT
POINT0
endc
;---------------------------------CONTROLLO COMANDI LCD---------------------------------
#define RS PORTC,2
#define E PORTC,1
portlcd equ PORTD
CLEAN equ b'00000001' ;CLEAR DISPLAY
SELECT_ROW1 equ b'10000000' ;SELECT ROW 1
SELECT_ROW2 equ b'11000000' ;SELECT ROW 2
shiftdl equ b'00011100' ;MOVE DISPLAY TO LEFT
shiftdr equ b'00011000' ;MOVE DISPLAY TO RIGHT
shiftcl equ b'00010100' ;MOVE CURSOR TO LEFT
shiftcr equ b'00010000' ;MOVE CURSOR TO RIGHT
org 0x00 ;VETTORE RESET
GOTO INIT
org 0x04 ;VETTORE INTERRUPT
INIT
bsf STATUS,RP0
clrf TRISD ;PORTD OUT
bcf TRISC,1 ;PORTC,1 OUT (E)
bcf TRISC,2 ;PORTC,2 OUT (RS)
bcf STATUS,RP0
clrf PORTD ;AZZERO PORTD
clrf PORTC ;AZZERO PORTC
call INIT_CONFIG_ADC
call INIT_LCD
;---------------------------------SCRIVI TESTO INIZIALE + MOVIMENTO E TEMPERATURA---------------------------------
;SCRIVI TESTO INIZIALE
START
CLRF POINT
call MESS ;CALL START MESSAGE
movlw .11 ;NUMBER LETTER TO MOVE (SHIFT)
movwf shift ;COPY NUMBER ROW TO "SHIFT"
;MOVIMENTO
ROTATE
call DELAY
movlw shiftdr ;COMMAND ROTAZIONE
call cmd
decfsz shift,F
goto ROTATE
movlw CLEAN ;COMMAND CLEAN DISPLAY
call cmd
GOTO OPERA0 ;SALTA IL DELAY5MIN E MISURA SUBITO LA TEMPERATURA
;SCRIVI GRADI MISURATI
OPERA
call DELAY_5MIN ;DELAY5MIN - TEMPO DI OGNI MISURAZIONE
OPERA0
movlw SELECT_ROW1 ;SCRIVI SU 1 RIGA
call cmd
call ACQUISIZIONE_ADC ;CALL ACQUISIZIONE DATO DALL ADC
;SCRIVI TESTO TEMPERATURA
movlw "T"
call dato
movlw "e"
call dato
movlw "m"
call dato
movlw "p"
call dato
movlw "e"
call dato
movlw "r"
call dato
movlw "a"
call dato
movlw "t"
call dato
movlw "u"
call dato
movlw "r"
call dato
movlw "a"
call dato
movlw ":"
call dato
movlw SELECT_ROW2 ;scrivi su 2 riga
call cmd
CALL CONVERS ;SCRIVI NUMERO GRADO
OPERA1
;SCRIVI PUNTO " . "
movlw '.' ;SCRIVI PUNTO
call dato
;SCRIVI DECIMI
BTFSS ADRESH,0 ;SE IL BIT O DEL REGISTRO ADRESH (NUMERO BINARIO DELLA CONVERSIONE DI T) VALE:
goto SCRIVI_ZERO ;VALE 1 SCRIVI 0 ALTRIMENTI SKIP
MOVLW '5' ;SCRIVI 5 DECIMI
CALL dato
GOTO OPERA2
SCRIVI_ZERO
MOVLW '0' ;SCRIVI 0 DECIMI
CALL dato
OPERA2
;SCRVI SIMBOLO " °C "
movlw B'11011111' ;SIMBOLO DEL GRADO " ° "
call dato
movlw 'C' ;" C " DI GRADI CELSIUS
call dato
goto OPERA
;---------------------------------CONVERTITORE DA NUMERO BINARIO A NUMERO DECIMALE---------------------------------
CONVERS ;CONVERTE NUMERO DA BINARIO A DECIMALE
MOVF ADRESH,W ;MUOVI CODICE BINARIO(CONVERSIONE) IN W
MOVWF POINT ;MUOVI W IN POINT
INCRE
INCF POINT,F ;INCREMENTA POINT FINO AD ARRIVARE ALLA DECINA INTERESSATA PER CAPIRE CHE TEMPERATURA MISURA
;ES. (POINT= 8°C)-CONTINUA AD INCREMENTARE FIN QUANDO NON ARRIVA A 10-PER POI ANDARE ALLA SUBROUTINE DEL 10
;0-9
MOVLW 20 ;W=20 (20 PERCHE' CALCOLANDO ANCHE I DECIMALI DI 0.5 (0°C = 0 , 10°C = 20)
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO ZERO ;0-9
;10-19
MOVLW 40 ;W=40
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO TEN ;10-19
;20-29
MOVLW 60 ;W=60
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO TWENTY ;20-29
;30-39
MOVLW 80 ;W=80
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO THIRTY ;30-39
;40-49
MOVLW 100 ;W=100
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO FOURTY ;40-49
;50-59
MOVLW 120 ;W=120
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO FIFTY ;50-59
;60-69
MOVLW 140 ;W=140
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO SIXTY ;60-69
;70-79
MOVLW 160 ;W=160
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO SEVENTY ;70-79
;80-89
MOVLW 180 ;W=180
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO EIGHTY ;80-89
;90-99
MOVLW 200 ;W=200
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO NINETY ;90-99
;T>100
MOVLW 250 ;W=220
XORWF POINT,W ;compara VALORED con W
BTFSC STATUS,Z ;se diverso skip
GOTO ONE_HUNDRED ;T>100
GOTO INCRE
;SCRIVI "Tc>100 °C" E LAMPEGGIA
ONE_HUNDRED
MOVLW 'T'
CALL dato
MOVLW 'c'
CALL dato
MOVLW '>'
CALL dato
MOVLW '1'
CALL dato
MOVLW '0'
CALL dato
MOVLW '0'
CALL dato
movlw B'11011111' ;SIMBOLO DEL GRADO " ° "
call dato
movlw 'C' ;" C " DI GRADI CELSIUS
call dato
CALL DELAY1S
CALL CLEAN_ROW
GOTO OPERA
;------------------------------------------------------------------
ZERO
;DEC
MOVLW '0' ;SCRIVI DECINA " 0 "
CALL dato
;UNITA
MOVF ADRESH,W ;COPIA CONVERSIONE BINARIA IN W
SUBLW 20 ;20-W
BTFSC STATUS,Z ;SE ZERO VAI A OPERA ALTRIMENTI SKIP
GOTO OPERA ;RICALCOLA
CALL TAB ;SCRIVI UNITA
CALL dato
GOTO OPERA1 ;PROCEDI
TEN
;DEC
MOVLW '1'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 40
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
TWENTY
;DEC
MOVLW '2'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 60
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
THIRTY
;DEC
MOVLW '3'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 80
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
FOURTY
;DEC
MOVLW '4'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 100
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
FIFTY
;DEC
MOVLW '5'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 120
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
SIXTY
;DEC
MOVLW '6'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 140
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
SEVENTY
;DEC
MOVLW '7'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 160
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
EIGHTY
;DEC
MOVLW '8'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 180
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
NINETY
;DEC
MOVLW '9'
CALL dato
;UNI
MOVF ADRESH,W
SUBLW 200
BTFSC STATUS,Z
GOTO OPERA
CALL TAB
CALL dato
GOTO OPERA1
TAB ;TAB UNITA
addwf PCL,F
retlw '9' ;9.5
retlw '9'
retlw '9'
retlw '8'
retlw '8'
retlw '7'
retlw '7'
retlw '6'
retlw '6'
retlw '5'
retlw '5'
retlw '4'
retlw '4'
retlw '3'
retlw '3'
retlw '2'
retlw '2'
retlw '1'
retlw '1'
retlw '0'
retlw '0'
;------------------------------------------------------------------
CLEAN_ROW ;CLEAN ROW 2
movlw SELECT_ROW2
call cmd
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
movlw " "
call dato
return
;---------------------------------CONFIGURAZIONE ADC---------------------------------
INIT_CONFIG_ADC:
bsf STATUS,RP0
bsf TRISA,0 ;SETTA POTRA,0 IN
bcf STATUS,RP0
movlw b'11000001' ;FRC, AN0, GO/DONE=0, ADON=1
movwf ADCON0
banksel ADCON1 ;SELEZIONA BANCO
movlw b'00001000' ;LEFT JUSTIFIED, FRC, ALL ANALOGIC (PORTA) AND VREF- VREF+
movwf ADCON1
banksel ADCON0 ;SELEZIONA BANCO
return
;---------------------------------ACQUISIZIONE DELL' ADC---------------------------------
ACQUISIZIONE_ADC
call SAMPLETIME ;RITARDO DEI ACQUISIZIONE
bsf ADCON0,GO_DONE ;INIZIA CONVERSIONE
btfsc ADCON0,GO_DONE ;TERMIN CONVERSIONE E CONTROLLA L'ESITO
goto $-1 ;NON ANCORA TERMINATA....QUINDI RICONTROLLA
banksel ADRESH ;TERMINATA E CONTINUA
movf ADRESH,W ;MUOVI I BIT PIU SIGNIFICATIVI IN W
movwf DATOH ;DATOH = W
banksel ADRESL
movf ADRESL,W ;MUOVI I BIT MENO SIGNIFICATIVI IN W
movwf DATOL ;DATOL = W
banksel PORTB ;CAMBIO BANCO
bcf STATUS,C ;SELEZIONA REGISTRO
rrf DATOH,F ;RUOTA VERSO DESTRA I BIT DI DATOH E DATOL DEL REGISTRO F PASSANDO ...
rrf DATOL,F ; ... PER IL CARRY ED ELIMINANDO IL BIT MENO SIGNIFICATIVO
return
;---------------------------------SETTAGGIO COMANDI LCD (RS=0)---------------------------------
INIT_LCD
movlw b'00110000'
call cmd
movlw b'00110000'
call cmd
movlw b'00110000'
call cmd
movlw b'00111100'
call cmd
movlw b'00001000'
call cmd
movlw b'00000001'
call cmd
movlw b'00000110'
call cmd
movlw b'00001100'
call cmd
movlw b'00000010'
call cmd
return
;---------------------------------INVIA CARATTERI A DISPLAY (E, RS)---------------------------------
dato
movwf portlcd
bsf RS
nop
nop
nop
bsf E
call DELAY_5
bcf E
return
cmd
movwf portlcd
bcf RS
nop
nop
nop
bsf E
call DELAY_5
bcf E
return
;---------------------------------MESSAGGIO INIZIALE---------------------------------
MESS
movlw "T"
call dato
movlw "E"
call dato
movlw "R"
call dato
movlw "M"
call dato
movlw "O"
call dato
movlw "M"
call dato
movlw "E"
call dato
movlw "T"
call dato
movlw "R"
call dato
movlw "O"
call dato
movlw SELECT_ROW2
call cmd
movlw "I"
call dato
movlw "L"
call dato
movlw "A"
call dato
movlw " "
call dato
movlw " "
call dato
movlw "&"
call dato
movlw " "
call dato
movlw " "
call dato
movlw "I"
call dato
movlw "L"
call dato
movlw "O"
call dato
return
;---------------------------------RITARDI---------------------------------
SAMPLETIME
movlw .225
movwf sample
SAMPLETIME1
nop
nop
decfsz sample,F
goto SAMPLETIME1
return
;------------------------------------------------------------------
DELAY_5 ;DELAY 5ms
movlw d'1'
movwf count3
DEL25A
movlw d'100'
movwf count2
DEL15A
movlw d'166'
movwf count1
DEL5A
decfsz count1,F
goto DEL5A
decfsz count2,F
goto DEL15A
decfsz count3,F
goto DEL25A
return
;------------------------------------------------------------------
DELAY
movlw d'3'
movwf count3
DEL25B
movlw d'200'
movwf count2
DEL15B
movlw d'166'
movwf count1
DEL5B
decfsz count1,F
goto DEL5B
decfsz count2,F
goto DEL15B
decfsz count3,F
goto DEL25B
return
;------------------------------------------------------------------
DELAY1S ;delay 1 secondo
movlw d'7'
movwf count1
movlw d'47'
movwf count2
movlw d'3'
movwf count3
del_1s
decfsz count1,F
goto $+2
decfsz count2,F
goto $+2
decfsz count3,F
goto del_1s
goto $+1
goto $+1
goto $+1
return
;------------------------------------------------------------------
DELAY_5MIN
movlw 0x54
movwf count1
movlw 0xA1
movwf count2
movlw 0xFD
movwf count3
movlw 0x02
movwf count4
Delay_0
decfsz count1, f
goto $+2
decfsz count2, f
goto $+2
decfsz count3, f
goto $+2
decfsz count4, f
goto Delay_0
goto $+1
goto $+1
nop
return
END