16F877A-jednoduchý příklad pro měřeni teploty čidlem DS18B20

NO NEVIEM MA TO TU ZAPOJEN NE 16F628 877 neviem najst…na cidle ds18b20 to beha krasne zo zapalovacom som nahrial na 117st ukazuje to.

Skove cidlo nemam na nalepke je napisane 18s20 ale v balicku su 1820.

hm je to jasne 18b20 ma standartne 12bit prevod kdez to s20 a 20 ma 9 bit.

Tak ze treba upravit prevod na teplotu…poprosil by som spolupracovnika kolegu nech tozbehne :smiley:

cize s ako presnostou ti to treba merat staci aby tio meralo po pol stupnoch 0st; 0,5st; 1st; atd

Dik za snahu a ochotu mi pomoci.
Mam obe cidla, jak 18B20, tak i 18S20. Jaky problem ma u ktereho typu jsem uz popsal drive a to nadale pretrvava :frowning:
Presnost mereni mi staci na 0,5st.
Jestli to chapu spravne, jak pises ze mas zapojene 18B20 na 16F877 ? Ja mam 158F877A, nemuze zde byt nejaky “zadrhel” ? Perdpokladam ze pismenko “A” to ale asi nebude.
Jestli muzes, dej mi sem cely asm script, ne jen “rutiny” pro teplotni cidlo. Mozna ze z toho bych neco vycetl.

Tak musis upravit este toto takto staci riadky kde je pripojene cidlo v tomto pripade PORTC,0 tu ti dam upravene ak chces skopiruj cele do programu a malo by to s 18b20 chodit

;************************ Inicializace procesoru *************************

INIT
banksel PORTC
movlw b’00000001’ ; 0 vstup, 1 vystup
movwf PORTC

banksel	OPTION_REG
movlw	b'00000000'
movwf	OPTION_REG

;portA
banksel TRISA ; vyber banky
movlw b’00000000’ ; 0 vstup, 1 vystup
movwf TRISA ; sup do TRISu
;PORTB
banksel TRISB ; vyber banky
movlw b’00000000’ ; 0 vstup, 1 vystup
movwf TRISB ; sup do TRISu
;vypnuti AD
banksel ADCON0 ; vyber banky
movlw b’11000000’ ; FRC,ADC is OFF
movwf ADCON0

banksel	ADCON1		; vyber banky
movlw	b'00000110'	; vlevo, VSS, VDD		
movwf	ADCON1		; 

;PORTC
banksel TRISC ; vyber banky
movlw b’00000001’ ; 0 vstup, 1 vystup
movwf TRISC ; sup do TRISu
;PORTD
banksel TRISD ; vyber banky
movlw b’00000000’ ; 0 vstup, 1 vystup
movwf TRISD ; sup do TRISu
;PORTE
banksel TRISE ; vyber banky
movlw b’00000000’ ; 0 vstup, 1 vystup
movwf TRISE ; sup do TRISu
banksel PORTA
clrf PORTD

call	INI_LCD		; init LCD

Nastaveni portu je v poradku, jen nevim proc to nechce nacist spravnou hodnotu do TEMP_MSB.

bez toho co som ti tam poslal sa to korektne nezinicializuje a cidla potom nejdu. Tak je osetrene ze pri zapnuti picu sa nastavy log 1 na vystup PORTUC,0 kde je cidlo a potom pri prikaze TRISC ked sa pin nastavy ako vstupny.

A ako zistujes ze MSB nic nieje … ? hned ako sa vratiz podprogramu namerane ???

Prikladam inicializaci procesoru

INIT
	banksel	OPTION_REG
	movlw	b'00000000'
	movwf	OPTION_REG
;portA
	banksel	TRISA		; vyber banky
	movlw	b'00000000'	; 0 vstup, 1 vystup
	movwf	TRISA		; sup do TRISu
;PORTB
	banksel	TRISB		; vyber banky
	movlw	b'00000000'	; 0 vstup, 1 vystup
	movwf	TRISB		; sup do TRISu
;vypnuti AD	
	banksel	ADCON0		; vyber banky
	movlw	b'11000000'	; FRC,ADC is OFF			
	movwf	ADCON0		
	
	banksel	ADCON1		; vyber banky
	movlw	b'00000110'	; vlevo, VSS, VDD		
	movwf	ADCON1		; 

;PORTC
	banksel	TRISC		; vyber banky
	movlw	b'00000000'	; 0 vstup, 1 vystup
	movwf	TRISC		; sup do TRISu
;PORTD
	banksel	TRISD		; vyber banky
	movlw	b'00000000'	; 0 vstup, 1 vystup
	movwf	TRISD		; sup do TRISu
;PORTE
	banksel	TRISE		; vyber banky
	movlw	b'00000000'	; 0 vstup, 1 vystup
	movwf	TRISE		; sup do TRISu
	banksel	PORTA

	clrf	PORTD

MSB zjistuji hned za

       call    KOM_S_C_1	    ;
       movf    TEMP_LSB,0      ;
       movwf   a1              ; v a1 mam data z TEMP_LSB
       call    view_bin_data   ; vypis na LCD co obsahuje a1

       movf    TEMP_ MSB,0     ;
       movwf   a1              ; v a1 mam data z TEMP_MSB
       call    view_bin_data   ; vypis na LCD co obsahuje a1

vymen inicializaciu za tu co som ti dal tam o par prispevkov vyssie.

zistujes to blbo…
call KOM_S_C_1 totot spusta prevod teploty v cidle.

call	namerane  toto caka na odpoved od cidla ze prevod skoncil a data sa zapisu do LSB A MSB  cize to tvoje ma vyzerat takto :


call	namerane    ;
   movf    TEMP_LSB,0      ;
   movwf   a1              ; v a1 mam data z TEMP_LSB
   call    view_bin_data   ; vypis na LCD co obsahuje a1

   movf    TEMP_ MSB,0     ;
   movwf   a1              ; v a1 mam data z TEMP_MSB
   call    view_bin_data   ; vypis na LCD co obsahuje a1 

a inac to co je poslane ako prve v LSB bude na displeji prepisane tym druhym MSB…

ja sem osel, samozrejme ze to zjistuji az za
call namerane
ja to zkousel uz ze zoufalstvi i zobrazit hned po
call KOM_S_C_1
a to jsem postnul sem na forum.

	call	Teplota_Prevod

;ukaze text a teplotu
	call	LINE1

movf  TEMP_MSB,0
movwf a1
call	view_bin_data

   LCDout   " "
	LCDout	'T'
	LCDout	'e'
	LCDout	'p'
	LCDout	'l'
	LCDout	'o'
	LCDout	't'
	LCDout	'a'
	

	call	LINE2

movf  TEMP_LSB,0
movwf a1
call	view_bin_data
	
   LCDout   " "
	btfss	PLUS
	movlw	' '
	btfsc	PLUS
	movlw	'-'
	LCDw
	movf	T3,w
	LCDw
	movf	T2,w
	LCDw
	movf	T1,w
	LCDw
	LCDout	'.'
	movf	T0,w
	LCDw
	goto	MAIN

No a na display mam:

00000000 Teplota
00110010 003.1

Na jakem procesoru to zkousis ?

POUZI cidlo 18B20. mas ho ? NA tomto to ide dobre.

stymto cidlom 18S20 treba upravit prevod co sa mi nechce by som musel porozmyslat ako to je urobene. mne to zobrazuje tak ako tebe.

Inak mas SZ

V příloze máš i pro S i B, stačí vybrat, jake máš čidlo,

; call Teplota_Prevod_S ; call Teplota_Prevod_B

pokud chceš zkusit, jestli převod je funkční. od toho je tam tohle, na tom jsem to testoval[code]; call KOM_S_C_1 ;
; call namerane ;

incfsz	TEMP_LSB,f
goto	$+2
incf	TEMP_MSB,f[/code]

Opraven INIT
TEMP.asm (18.3 KB)

…teraz ked som upravil tvoj prevod :smiley: inicializaciu si mu neopravil podla toho co som tu dal

Nastavenie TRISC,0 ako VStupny … inak LOG1 je IN LOG0 out… ASi deformacia s ATMELOV

Ja zkousel i 18B20, uz jsem to uvedl drive. Vysledek je nasledujici:

18B20 zobrazi se hodnota 085.0, zde se nacte jak MSB, tak i LSB, ale nemeri to
18S20 zobrazi se hodnota 003.2, zde jsou same 00000000 v MSB, LSB se meni podel zahrati/ochlazeni cidla

strc tam 18b20 zapnito a potom odpoj a pripoj cidlo… lebo ked si este nepouzil moju inicializaciu tak sa to zasekne.

Prikladam moj asm pre pic 16f628A
teplomer.asm (18.3 KB)

Tak jsem vyzkousel asm od honza3 a svete div se, ono to uz funguje :slight_smile:

Ted to meri pres 18S20 s 18B20 to nefunguje (samozrejme pouzil jsem “spravny” ; call Teplota_Prevod_X podle daneho cidla).
Vecer si projdu stary i novy script a postuduji v cem byl problem.
Nejak nechapu ty prevodni tabulky, kdybych chtel aby mi to merilo po 0.1 a ne po 0.5 stupne, jaka je filosofie tech tabulek ?

Kazdopadne vsem dekuji za pomoc pri reseni meho problemu. Chlapi, vy bydlet nekde blizko me, tak Vas za tu ochotu rad pozvu na pivo :smiley:

Pokud chceš aby to měřilo po 0.1°C, použij 18B20 s 12bit převodem.

Jj, to mozna az mi bude fungovat 18B20.

Spis me zajima ta podstata tabulkove konverze.

Mereni je uz ok, ale nejde mi mereni z AD pervodniku.
Zmenil jsem

;vypnuti AD	
;	banksel	ADCON0		; vyber banky
;	movlw	b'11000000'	; FRC,ADC is OFF			
;	movwf	ADCON0		
;
;	banksel	ADCON1		; vyber banky
;	movlw	b'00000110'	; vlevo, VSS, VDD		
;	movwf	ADCON1		; 

;zapnuti AD	
	banksel	ADCON0		; vyber banky
	movlw	b'01000001'	; FRC,ADC is OFF			
	movwf	ADCON0		
;
	banksel	ADCON1		; vyber banky
	movlw	b'00000000'	; vlevo, VSS, VDD		
	movwf	ADCON1		; 

Nameri mi to pouze 4.99V neob 0.00V, podle toho jake mam U na pinu RA0. Zmenu U provadim pripojenym trimrem, kde jeden vyvod je na +, druhy vyvod n - a ten prostredni mi jde na pin RA0. Hodnota trimru je 10K. Kdyz pouziju script asm (viz priloha), tak tam to funguje dobre.

Mohu jeste pozadat o pomoc ?
adclcd-2vstupy.asm (11.9 KB)

Uz jsem to vyresil, nemuzu soucasne mit:

;portA
	banksel	TRISA		; vyber banky
	movlw	b'00000000'	; 0 vstup, 1 vystup
	movwf	TRISA		; sup do TRISu

a

;zapnuti AD	
	banksel	ADCON0		; vyber banky
	movlw	b'01000001'	; FRC,ADC is OFF			
	movwf	ADCON0		
	banksel	ADCON1		; vyber banky
	movlw	b'00000000'	; vlevo, VSS, VDD		
	movwf	ADCON1		; 

Vstup, kterej je jako AD, musíš nastavit v TRISA

;portA banksel TRISA ; vyber banky movlw b'00000001' ; 1 vstup, 0 vystup movwf TRISA ; sup do TRISu

Ten komentář u druhého řádku může být pro začátečníky matoucí, doporučuji opravit.