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.
Daan Timmer
Ik ben programmeur! geen electronicus! http://www.daantimmer.nl/ Er is een ontwerp! nu nog inhoud :-)
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.
