Hallo,

Ik heb een programma geschreven voor het uitlezen van de temperatuur van een DS1820 met een PIC16F887. Nu heb ik de datasheet doorgelezen en aan de hand hiervan een programma geschreven. Nu krijg ik alleen de temperatuur maar niet uitgelezen. Ik weet dus niet of het probleem zit in het versturen van een byte of het ontvangen van een byte. Mijn code ziet er als volgt uit:

 		
		
#include	<P16F887.INC>

			errorlevel 	0,-302

			CBLOCK H'20'
							TEMP
							TIMER
							TIMER1
							BYTE
							COUNTER
			ENDC

ANSEL		EQU	H'0188'
ANSELH		EQU     H'0189'
DS		EQU     H'0002'

;----- Reset

			ORG	H'0'	

RESET		        CLRF	INTCON			; Reset, interrupts uitschakelen, poort B en E uitgangen, alles digitaal
			
			BSF	STATUS,RP0		

			MOVLW	B'11010111'		
			MOVWF	OPTION_REG

			MOVLW	B'00000000'		
			MOVWF	TRISB

			MOVLW	B'00000000'		
			
			BSF	STATUS,RP1		

			CLRF	ANSEL			
			CLRF	ANSELH

			BCF	STATUS,RP0	
			BCF	STATUS,RP1

			CLRF	PORTB			

			GOTO	START			

;----- Timers

TIME9		        MOVLW	D'4'			; Timer van 9 microsec. (0.009 millisec.)
			MOVWF	TIMER
			DECFSZ	TIMER,F
			GOTO	$-1
			RETURN

TIME30		        MOVLW	D'18'			; Timer van 30 microsec. (0.030 millisec.)
			MOVWF	TIMER
			DECFSZ	TIMER,F
			GOTO	$-1
			RETURN

TIME90		        MOVLW	D'58'			; Timer van 90 microsec. (0.090 millisec.)
			MOVWF	TIMER
			DECFSZ	TIMER,F
			GOTO	$-1
			RETURN

TIME300		        MOVLW	D'198'			; Timer van 300 microsec. (0.300 millisec.)
			MOVWF	TIMER
			DECFSZ	TIMER,F
			GOTO	$-1
			RETURN

TIME480		        MOVLW	D'2'			; Timer van 501 microsec. (0.501 millisec.)
			MOVWF	TIMER
BACKT1		        MOVLW	D'165'
			MOVWF	TIMER1
			DECFSZ	TIMER1,F
			GOTO	$-1
			DECFSZ	TIMER,F
			GOTO	BACKT1
			RETURN

TIME500		        MOVLW	D'255'			; Timer van 97 millisec. (5x aanroepen voor minimaal 500 millisec. !!!!!!)
			MOVWF	TIMER
BACKT2		        MOVLW	D'255'
			MOVWF	TIMER1
			DECFSZ	TIMER1,F
			GOTO	$-1
			DECFSZ	TIMER,F
			GOTO	BACKT2
			RETURN

;----- Protocol DS1820

;----- Output

OUTPUT		        BSF	STATUS,RP0		; Maak RE2 een uitgang
			BCF	TRISE,DS		
			BCF	STATUS,RP0		
			RETURN

;----- Input

INPUT		        BSF	STATUS,RP0		; Maak RE2 een ingang
			BSF	TRISE,DS		
			BCF	STATUS,RP0		
			RETURN

;----- Initialization

INI			BTFSC	PORTE,DS		; Initialisatie van de DS1820
			CALL	OUTPUT			
			BCF	PORTE,DS	 	
			CALL	TIME480			
			BSF	PORTE,DS		
			CALL	INPUT		
			BTFSC	PORTE,DS		
			GOTO	$-1		
			CALL	TIME300		
			BTFSS	PORTE,DS		
			GOTO	$-1
			RETURN			
	
;----- Write byte

WRITE		        CALL	OUTPUT			; Het versturen van een byte
			MOVLW	D'8'			
			MOVWF	COUNTER
NEXTWRITE	        BTFSC	BYTE,D'0'		
			GOTO	SEND1			
			GOTO	SEND0			
ROTAWRITE	        RRF	BYTE,F			
			DECFSZ	COUNTER,F		
			GOTO	NEXTWRITE		
			RETURN					
			
SEND1	          	BCF	PORTE,DS		; Het versturen van een bit 1
			NOP
			NOP
			BSF	PORTE,DS		
			CALL	TIME90		
			GOTO	ROTAWRITE

SEND0		        BCF	PORTE,DS		; Het versturen van het bit 0
			CALL	TIME90			
			BSF	PORTE,DS		
			GOTO	ROTAWRITE

;----- Read byte

READ	          	MOVLW	D'9'			; Het ontvangen van een byte
			MOVWF	COUNTER
NEXTREAD	        CALL	OUTPUT
			BCF	PORTE,DS
			CALL	INPUT
			CALL	TIME30
			BTFSC	PORTE,DS
			GOTO	READ1
			GOTO	READ0
ROTAREAD	        RRF	BYTE,F
			DECFSZ	COUNTER,F
			GOTO	NEXTREAD
			RETURN

READ1		        BSF	BYTE,D'0'		; Een bit 1 ontvangen
			CALL	TIME30
			GOTO	ROTAREAD

READ0	         	BCF	BYTE,D'0'		; Een bit 0 ontvangen
			CALL    TIME30
			BSF     PORTE,DS
			GOTO	ROTAREAD
			
;----- Programma

START		        CALL	INI			; Reset
			MOVLW	H'CC'			; Skip ROM
			MOVWF	BYTE
			CALL	WRITE			
			MOVLW	H'44'			; Convert T
			MOVWF	BYTE
			CALL	WRITE
			CALL	TIME500			; Wacht minimaal 500 millisec.
			CALL	TIME500
			CALL	TIME500
			CALL	TIME500
			CALL	TIME500
			CALL	INI			; Reset
			MOVLW	H'CC'			; Skip ROM
			MOVWF	BYTE
			CALL	WRITE
			MOVLW	H'BE'			; Read Scratchpad
			MOVWF	BYTE
			CALL 	WRITE
			CALL	READ
			MOVF	BYTE,W			; Zet temperatuur in TEMP
			MOVWF	TEMP
			CALL	INI			; Reset
			MOVF	TEMP,W		
			MOVWF	PORTB
			SLEEP			

			END

Let bij het ontvangen van een byte niet op de 9de bit. Deze wordt over een andere bit heen geschreven. Dit pas ik later aan.

Het is inmiddels gelukt. Ik krijg nu data binnen

altijd wel leuk om te vertellen wat je verandert hebt om het werkend te krijgen ;-)

Op 6 juli 2009 21:24:54 schreef Daan Timmer:
altijd wel leuk om te vertellen wat je verandert hebt om het werkend te krijgen ;-)

Mee eens. Ik heb de datasheet nog eens goed bestudeerd en kwam erachter dat als je een databit ontvangt, je na een bepaalde tijd de ingang (op dat moment een ingang, om een bit te lezen) hoog moet maken (resistor pull-up).

Cool dat het nu werkt voor je.

Moest je ook nog code veranderen?

Ik heb toevallig vanochtend een lijstje gemaakt om de ic's te bestellen.

Echter een vraagje, in je code zie ik niet terug dat je een uniek ID opvraagd van de chip.
Hieruit begrijp ik dat je maar een temp sensor er op aangesloten hebt? Klopt dit?

Eigenlijk wilde ik het in JAL programeren. Heb je wat advies om meerdere sensoren aan te pakken, zowel in code als hardware?

succes verder en alvast bedankt.

Op 8 juli 2009 01:06:16 schreef rvamerongen:
Moest je ook nog code veranderen?

De code is inderdaad gewijzigd. Hier staat nog niet in dat ik de pull-up weerstand hoog maak tijdens het lezen.

Echter een vraagje, in je code zie ik niet terug dat je een uniek ID opvraagd van de chip. Hieruit begrijp ik dat je maar een temp sensor er op aangesloten hebt? Klopt dit?

Ik heb inderdaad 1 sensor aangesloten, waardoor ik de unieke code niet heb opgevraagd, aangezien ik natuurlijk eerst het protocol wil begrijpen. Je moet het in het begin niet te moeilijk maken, door meteen 2 of 3 sensoren te plaatsen. Je kunt, als je eenmaal het protocol begrijpt en de timing goed hebt, over stappen naar meerdere sensoren en beginnen te puzzelen met de unieke code's.

Ik zelf begin hier nog niet aan, dit is namelijk mijn doel niet. In de toekomst kan ik altijd nog 2 sensoren inlezen, 1 binnen en 1 buiten bijvoorbeeld. Maar wat is daarentegen de meerwaarde hiervan, het scheelt 1 pin.

Dank je voor je reactie,

Ik zag eergisteren dat er al bij CO een ontwerp staat met deze onderdelen.
Ach ja, weetje voor de volgende keer, eerst bij CO kijken voordat ik zelf iets teken.

Idd het scheelt maar een pin, maar voor mijn doeleind zitten ze ( 3 st ) op een ( 1 ) kabel.
Ben nu even aan het uitvogelen, op papier, hoe ik kan bepalen welke welke DS18s20 is zonder van te voren te weten wat UNID is.

Succes. Laat me maar weten als je het gelukt is. Ik ben benieuwd.

Mod-edit: http://www.circuitsonline.net/forum/faq#replys

[Bericht gewijzigd door Henry S. op (82%)]

Hallo,

ik heb de EysyPIC5 aangeschaft met de ontwikkel omgeving MicoBasic.
Nu wil ik assembler-instructies opnemen binnen het MicroBasic programma. Hoe moet ik dat nu doen?
Ik zie in diverse programma's staan:
LIST P=16F887, en #INCLUDE <P16F887.INC>. Wat moet ik nu doen.

Waar kan ik de P16F887.INC vinden en moet ik deze dan zetten in de directory van MicroBasic.

Wie kan helpen.

Sorry,

mijn vraag op de verkeerde plaats gesteld. Is de eerste keer.