ilario92 Inserito: 29 aprile 2017 Segnala Inserito: 29 aprile 2017 ciao voglio realizzare un TERMOMETRO 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!!! .! grazie a tutti ;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
Livio Orsini Inserita: 29 aprile 2017 Segnala Inserita: 29 aprile 2017 Il problema è che l'A/D del PIC legge solo tensioni positive 0-5V. Devi mettere un amplificatore non invertente che offsetti lo 0°C da 0V a +2V, poi amplificando 3 ottieni 5V a 100°C e 0.35V per -55°C. PS Porre la medesima domanda su più forum (Grix) ti aumenta solo la confusione e rende meno disponibili i lettori che scoprono la discussione multipla.
ilario92 Inserita: 2 maggio 2017 Autore Segnala Inserita: 2 maggio 2017 amplificatore non invertente? ora provo a cercare qualcosina su internet su come configurare l'amplificatore grazie
gabri-z Inserita: 2 maggio 2017 Segnala Inserita: 2 maggio 2017 Errore ! Dovevo cancellare il mio messaggio .
gabri-z Inserita: 3 maggio 2017 Segnala Inserita: 3 maggio 2017 Avevo fatto un'osservazione che poi mi e' risultata errata.
Livio Orsini Inserita: 3 maggio 2017 Segnala Inserita: 3 maggio 2017 Quote amplificatore non invertente? ora provo a cercare qualcosina su internet su come configurare l'amplificatore E' una configurazione di base direi che è un classico. Invece di mettere la R dell'ingresso "+" a zero V, devi usarla come ingresso di segnale. La resistenza che va al "-" invece che usarla come ingresso di segnale la colleghi alla tensione di offset, in questo caso +2V. Attenzione che il guadagno non è più Rf / Rs, ma (Rf + Rs) / Rs; in altri termini nella confugurazione non invertente il guadagno è maggiore. Puoi usare anche un ampli alimentato a soli 5V, purchè sia un ottimo rail to rail.
Zorban Inserita: 4 maggio 2017 Segnala Inserita: 4 maggio 2017 Non l'ho mai utilizzato ma se usi il DS18B20 risolvi molti problemi: http://it.rs-online.com/web/p/products/5402805/?cm_mmc=IT-PPC-_-google-_-3_IT_IT_M_SEMIS_Phrase-_-maxim%7Csensori_di_temperatura_e_umidit%C3%A0&mkwid=sciuhgXhJ_dc%7Cpcrid%7C84672609379%7Cpkw%7Cds18b20%7Cpmt%7Cp%7Cprd%7C&gclid=Cj0KEQjwoqvIBRD6ls6og8qB77YBEiQAcqqHeyRViqpfgbpVzU8XvEDadqpViXJgwIM23A2VomAP-8kaApzw8P8HAQ Devi ovviamente riscrivere il software ... Se cerchi ci sono anche molti altri sensori che utilizzano la SPI o la I2C ... Saluti
Zorban Inserita: 4 maggio 2017 Segnala Inserita: 4 maggio 2017 Anche questo nuovo sensore della TI (LMT01LPG) potrebbe fare al caso tuo e credo che sia più semplice il progetto dell'interfaccia software. In questo caso occorre però adoperare l'interrupt del uP (credo! Ho solo dato un'occhiata veloce al data sheet) mentre con il DS18B20 il controllo è asincrono con il uP come master e permette la lettura di più sensori 1-wire. http://it.rs-online.com/web/p/sensori-di-temperatura-e-umidita/1330679/ Ti ripeto, non li ho mai utilizzati e ho solo dato un'occhiata ai data sheet ma piuttosto che impazzire con tensioni negative e Amp OP .... Di nuovo saluti Andrea
tesla88 Inserita: 4 maggio 2017 Segnala Inserita: 4 maggio 2017 un modo easy ? Pagina 16 - figura 18 del pdf :http://www.ti.com/lit/ds/symlink/lm35.pdf
ic910 Inserita: 20 giugno 2017 Segnala Inserita: 20 giugno 2017 Prova a prendere in considerazione il TC1047 della microchip come sensore di temperatura .Ti permette di misurare una temperatura da -40° a 125° senza aggiungere altri componenti esterni . Ogni 10° ha una variazione di 100mV 10 mV a grado.
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora