
;Send reset pulse, $CC & $44 to start a conversion. 
;Wait 500 milliseconds for conversion to take place. 
;Send reset pulse, $CC & $BE to begin memory read. 
;Receive value and sign bytes and save them. 
;Send reset pulse to terminate read. 
;If sign is $FF then send '-' out RS232. 
;Convert integer magnitude to decimal and send out RS232. 
;Send a '.' out RS232. 
;If LSB of value is 0 send a '0' else send '5' out RS232. 
;Send carriage return out RS232. 
;Delay until next reading. 
;Go to first step and repeat measurement. 

;***** COMPILATION MESSAGES & WARNINGS *****

	ERRORLEVEL -207 	; found label after column 1
	ERRORLEVEL -302 	; register in operand not in bank 0

;***** PROCESSOR DECLARATION & CONFIGURATION *****

	PROCESSOR 16F84A
	#include "p16f84a.inc"
	
	; embed Configuration Data within .asm File.
	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

;***** MEMORY STRUCTURE *****
;	ORG		H'2100'
	
	ORG     0x00			; processor reset vector
  	goto    MAIN

;***** PORT DECLARATION *****
;	#define	b0		PORTB,0x00
	
;***** CONSTANT DECLARATION *****
;

	CONSTANT 	BASE = 0x0C		; base address of user file registers	
;	CONSTANT	pa = 0X05	;!!!! kolko da e dalag nomera !!!!
;
;***** REGISTER DECLARATION *****
;TMR0                         EQU     H'0001'
	FLAGreg	equ		BASE+d'1'
	TXREG	equ		BASE+d'2'	
	BITS	equ		BASE+d'3'
	RXREG	equ		BASE+d'4'
	CNTMSEC	equ		BASE+d'5'
	TEMPL	equ		BASE+d'6'
	TEMPH	equ		BASE+d'7'
	ZNAK	EQU		BASE+D'8'
	tmr_u	EQU		BASE+D'9'
	nv		EQU		BASE+D'10'
	tv		EQU		BASE+D'11'
	uv		EQU		BASE+D'12'
	CRC1	EQU		BASE+D'13'
	CRC2	EQU		BASE+D'14'
	A1		EQU		BASE+D'15'
	A2		EQU		BASE+D'16'
	A3		EQU		BASE+D'17'
	A4		EQU		BASE+D'18'
	A5		EQU		BASE+D'19'
	TT		EQU		BASE+D'20'


WAIT1
		MOVWF	TT
TT1		NOP	
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		DECFSZ	TT
		GOTO	TT1
		RETURN



	M1HI        BSF  STATUS, RP0       ; go to page 1
                BSF  TRISA, 3          ; make RA3 an input
                BCF  STATUS, RP0       ; back to page 0
                RETURN                 ; master 1 wire HI
       
	M1LO        BCF  PORTA, 3          	; port A, bit 3 low  6
			
                BSF  STATUS, RP0       ; go to page 1
                BCF  TRISA, 3          ; make port A, bit 3 an output  9
                BCF  STATUS, RP0       ; back to page 0
				
			
                RETURN                 ; master 1 wire LO

    SLOTLO     CALL M1LO         ; begin by taking RA3 low
               GOTO DLY80        ; and remain low    60
    SLOTHI     CALL M1LO         ; a quick low on RA3   6
				NOP
				CALL M1HI         ; return high right away  54
    DLY80      	MOVLW	D'8'		 ; decimal 80 microsec    55
				CALL	WAIT1		; delay
               CALL M1HI         ; always end on high  10
				movlw	d'1
				call	WAIT1
               RETURN


	TXBYTE1    MOVWF TXREG       ; put W into transmit register
               MOVLW 8           ; eight bits of data
               MOVWF BITS        ; a counter for bits
    TX1LOOP    RRF TXREG, f      ; roll rightmost bit into carry
               BTFSC STATUS, C   ; if carry 0 want to send 0
               GOTO HIBIT1       ; else send 1 bit
               CALL SLOTLO       ; output low bit ( RA3 )
               GOTO DONE1        ; are we finished?
    HIBIT1     CALL SLOTHI       ; output a high bit ( RA3 )
    DONE1      DECFSZ BITS, f    ; 1 less data bit, skip when zero
               GOTO TX1LOOP      ; more bits left
               RETURN


 	RXBYTE1    MOVLW 8           ; eight bits of data
               MOVWF BITS        ; a counter for bits
    RX1LOOP    CALL  M1LO        ; a quick low pulse
               CALL  M1HI        ; and back high
               NOP               ; waiting for about ...
            	NOP               ; 14 microseconds ...
            	NOP               ; to elapse ...
            	NOP               ; before reading RA3
            	BSF STATUS, C     ; make carry a 1
            	BTFSS PORTA, 3    ; read RA3 skip if received a 1
            	BCF STATUS, C     ; make carry a 0
            	RLF  RXREG, f     ; roll carry into RXREG LSB
            	DECFSZ BITS, f    ; 1 less data bit, skip when zero
            	GOTO RX1LOOP      ; more bits left
            	RETURN


 RESET      CALL  M1LO        ; make I/O line low
                     ; 150 x 4 = 600 microseconds500
                  ; delay
			MOVLW	D'60'
			CALL	WAIT1
            CALL  M1HI        ; and back high
                  
			MOVLW	D'40'		;  400 microseconds 72
                   
			CALL	WAIT1			; delay
            RETURN


MAIN
			BSF  STATUS, RP0       ; go to page 1
			MOVLW	0
			MOVWF	TRISB
			MOVWF	TRISA			;ALL PORTS ARE OUTPUTS
			MOVLW 	b'11010100'
			movwf	OPTION_REG
            
            BCF  STATUS, RP0
			BCF		INTCON,7
			MOVLW	H'FF'
			MOVWF	PORTB
			MOVLW	D'100'		;WAIT 250 us
			CALL	WAIT1
			MOVLW	0
			MOVWF	PORTB
			MOVLW	D'100'		;WAIT 250 us
			CALL	WAIT1


L1			

				CALL	RXBYTE1
				MOVFW	RXREG
				ADDLW   1
        		BTFSS   STATUS,Z
        		GOTO    L1
L2			CALL	RESET		;RESET DS1820
			;MOVLW	D'250'		;WAIT 250 us
			;CALL	NMSEC
			MOVLW	D'25'
			CALL	WAIT1
			;MOVLW	D'250'		;wait	250 us
			;CALL	NMSEC
	;	MOVLW	D'25'
	;	CALL	WAIT1
	;	CALL	RESET		;reset DS1820
			movlw	H'CC'		;SKIP ROM
			MOVWF	TXREG
			CALL	TXBYTE1
			MOVLW	H'44'		;CONVERSE
			MOVWF	TXREG
			CALL	TXBYTE1
			;MOVLW	H'FF'		;WAIT 255 uS
			;CALL	NMSEC
			MOVLW	D'25'
			CALL	WAIT1
			CALL	RESET		;RESET	DS1820
			movlw	H'CC'		;SKIP ROM
			MOVWF	TXREG
			CALL	TXBYTE1
			movlw	H'BE'		;READ DS1820
			MOVWF	TXREG
			CALL	TXBYTE1
			CALL	RXBYTE1		;READ D15-D8
			MOVFW	RXREG
			MOVWF	TEMPH		;AND WRITE  IN TEMPH
			;MOVWF	PORTB
			CALL	RXBYTE1		;READ D7-D0
			MOVFW	RXREG
			MOVWF	TEMPL		;AND WRITE IN TEMPL
			MOVWF	PORTB
			CALL	RXBYTE1
			MOVWF	CRC1
			CALL	RXBYTE1
			MOVWF	CRC1
			
			CALL	RXBYTE1
			MOVWF	A1
			CALL	RXBYTE1
			MOVWF	A2
			CALL	RXBYTE1
			MOVWF	A3
			CALL	RXBYTE1
			MOVWF	A4
			CALL	RXBYTE1
			MOVWF	A5
			GOTO	L2

hextobcd
	movfw	tmr_u		;convert tmr_u to BCD
	movwf	nv		;nv is tenths of micro sec.

	clrf	tv		;tv represents micro sec tens
	clrf	uv		;uv represents micro sec units

	movlw	d'100'		;
tens	subwf	nv, f		;nv = nv - 100
	btfss	STATUS, C	;is nv < 0
	goto	ee		;yes, so restore nv 
	incf	tv, f		;no, increment tv
	goto	tens		;

ee	addwf	nv, f		;nv = nv + 100

	movlw	d'10'		;
units	subwf	nv, f		;nv = nv - 10
	btfss	STATUS, C	;is nv < 0
	goto	ff		;yes, so restore nv
	incf	uv, f		;no, increment uv
	goto	units

ff	addwf	nv, f		;nv = nv + 10
			
				
END