개요: 일부 Dallas Semiconductor의 제품은 1-Wire? 통신 인터페이스를 포함하고 있으며 다양한 애플리케이션에서 사용된다. Microchip의 대중적인 PICmicros? (PICs)에 대한 인터페이싱도 이러한 애플리케이션에 포함될 수 있다. 1-Wire 소자와 PIC 마이크로컨트롤러 간의 손쉬운 인터페이스를 위해 이 애플리케이션 노트에서는 PIC 마이크로컨트롤러에 대한 일반적인 1-Wire 소프트웨어 루틴을 제시하고 타이밍 및 관련 세부사항에 대해 설명한다. 이 애플리케이션 노트에서는 또한 모든 1-Wire 루틴을 다루는 포함 파일을 제공한다. 또한 PIC16F628이 DS2761 고정밀 Li+ 배터리 모니터로부터 읽기를 수행할 수 있도록 특별히 작성된 어셈블리 코드 샘플도 포함되어 있다.
개요
Microchip의 PICmicro 마이크로컨트롤러 소자 (PIC)는 저전력 및 저가 시스템 솔루션을 위한 대중적인 설계 선택으로 자리잡았다. 이 마이크로컨트롤러는 다수의 범용 입/출력 (GPIO) 핀을 가지고 있으며 Dallas Semiconductor의 1-Wire 프로토콜을 구현하도록 쉽게 구성될 수 있다. 1-Wire 프로토콜은 배터리 및 열 관리, 메모리, iButtons? 등을 포함한 많은 Dallas Semiconductor 부품과의 상호 작용을 허용한다.
이 애플리케이션 노트에서는 PIC16F628의 일반적인 1-Wire 루틴을 제시하고 타이밍 및 관련 세부사항을 설명한다. 단순성을 기하기 위해 제시되는 모든 자료에 대해 4MHz 클록을 가정하고, 이 주파수는 여러 PIC에서 내부 클록으로 사용될 수 있다. 이 문서의 부록 A에는 모든 1-Wire 루틴을 갖춘 포함 파일이 있다. 부록 B는 PIC16F628이 DS2761 고정밀 Li+ 배터리 모니터로부터 판독하도록 설계된 어셈블리 코드 프로그램 샘플을 제시한다. 이 애플리케이션 노트는 보통 속도 1-Wire 통신의 범위로 제한된다.
일반적인 매크로
1-Wire 프로토콜을 마스터로서 전송하려면 단 2개의 GPIO 상태, 즉 하이 임피던스와 로직 로우가 필요하다. 다음 PIC 어셈블리 코드 스니펫은 이러한 2가지 상태를 달성한다. PIC16F628은 2개의 GPIO 포트인 PORTA와 PORTB를 가진다. 1-Wire 통신을 위해 둘 중 하나의 포트가 설정될 수 있지만 이 예에서는 PORTB가 사용된다. 또한 다음 코드는 PORTB에 있는 어느 비트가 1-Wire 핀이 될 것인지를 나타내기 위해 상수 DQ가 어셈블리 코드에서 구성되었다고 가정한다. 코드 전체에서 이 비트 숫자를 DQ라 한다. 외부적으로 이 핀은 풀업 저항을 통해 전원에 연결되어야 한다.
OW_HIZ:MACRO
;Force the DQ line into a high impedance state.
BSF STATUS,RP0 ; Select Bank 1 of data memory
BSF TRISB, DQ ; Make DQ pin High Z
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
OW_LO:MACRO
;Force the DQ line to a logic low.
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF PORTB, DQ ; Clear the DQ bit
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISB, DQ ; Make DQ pin an output
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
이 2개의 코드 스니펫은 모두 매크로로서 작성된다. 코드를 매크로로 작성함으로써, 이것은 단일 매크로 호출을 사용하여 어셈블리 소스 코드로 자동으로 삽입된다. 이것은 코드가 재작성되어야 하는 횟수를 제한한다. 첫 번째 매크로인 OW_HIZ는 DQ 라인을 하이 임피던스 상태로 포싱한다. 첫 단계는 TRISB 레지스터가 뱅크 1에 위치하기 때문에 데이터 메모리의 뱅크 1을 선택하는 것이다. 그 다음, DQ 출력 드라이버는 TRISB 레지스터에서 DQ 비트를 설정함으로써 하이 임피던스로 변경된다. 코드의 마지막 라인은 다시 데이터 메모리의 뱅크 0으로 변경된다. 마지막 라인은 불필요하지만 모든 매크로 및 함수 호출이 데이터 메모리를 알 수 없는 상태로 남겨두도록 사용된다.
두 번째 매크로인 OW_LO는 DQ 라인을 로직 로우로 포싱한다. 먼저, 데이터 메모리의 뱅크 0이 선택되고, 따라서 PORTB 레지스터에 액세스할 수 있다. PORTB 레지스터는 데이터 레지스터이고 출력으로 구성될 경우 TRISB 핀으로 포스될 값을 포함하고 있다.
PORTB의 DQ 비트는 라인이 로우로 포스되도록 소거된다. 끝으로 데이터 메모리의 뱅크 1이 선택되고, TRISB 레지스터의 DQ 비트가 소거되어 이 비트는 출력 드라이버가 된다. 언제나 그렇듯이 매크로는 데이터 메모리의 뱅크 0을 선택하여 종료된다.
WAIT로 명명된 최종 매크로는 1-Wire 신호 발생을 위한 지연을 생성하기 위해 포함된다. WAIT는 5µs의 배수 후 지연을 발생시키는 데 사용된다. 매크로는 마이크로초로 표시되는 TIME 값을 사용하여 호출되고, 해당 지연 시간이 발생된다. 매크로는 5µs 지연이 필요한 횟수를 계산한 다음 WAIT5U 이내에 루핑한다. 루틴 WAIT5U는 다음 절에서 다루어진다. WAIT 이내에서의 각 명령에 대해 처리 시간은 지연이 달성되는 방식을 이해할 수 있도록 주석으로 제공된다.
WAIT:MACRO TIME
;Delay for TIME µs.
;Variable time must be in multiples of 5µs.
MOVLW (TIME/5) - 1 ;1µs to process
MOVWF TMP0 ;1µs to process
CALL WAIT5U ;2µs to process
ENDM
일반적인 1-Wire 루틴
1-Wire 타이밍 프로토콜은 성공적인 통신을 달성하기 위해 따라야 하는 특정 타이밍 제약조건을 갖는다. 특정 타이밍 지연을 생성하는 데 도움을 주기 위해 루틴 WAIT5U가 5µs 지연을 발생시키도록 사용된다. 이 루틴은 다음과 같다.
WAIT5U:
;This takes 5µs to complete
NOP ;1µs to process
NOP ;1µs to process
DECFSZ TMP0,F ;1µs if not zero or 2µs if zero
GOTO WAIT5U ;2µs to process
RETLW 0 ;2µs to process
WAIT 매크로와 조합하여 사용될 경우, 간단한 타이밍 지연이 발생될 수 있다. 예를 들어, 40µs 지연이 필요할 경우, WAIT 0.40이 호출될 것이다. 이것은 WAIT 내의 처음 3개 라인이 실행되도록 만들어 4µs의 결과를 가져온다. 그 다음, WAIT5U의 코드의 처음 4개 라인은 5µs만에 실행되고 6회 루핑하여 총30µs가 된다. WAIT5U의 최종 루프는 6µs를 취한 다음 다시 WAIT 매크로로 복귀한다. 따라서 처리할 총 시간은 4 + 30 + 6 = 40µs가 된다.
표 1. 일반 속도 1-Wire 인터페이스 타이밍
2.5V < VDD< 5.5V, TA = -20°C to 70°C
Parameter
Symbol
Min
Typ
Max
Units
Time Slot
tSLOT
60
120
µs
Recovery Time
tREC
1
µs
Write 0 Low Time
tLOW0
60
120
µs
Write 1 Low Time
tLOW1
1
15
µs
Read Data Valid
tRDV
15
µs
Reset Time High
tRSTH
480
µs
Reset Time Low
tRSTL
480
960
µs
Presence Detect High
tPDH
15
60
µs
Presence Detect Low
tPDL
60
240
µs
모든 1-Wire 트랜잭션의 시작은 마스터 소자로부터 나오는 리셋 펄스 다음에 슬레이브 소자로부터 나오는 존재 탐지 펄스로 시작한다. 그림 1은 이 트랜잭션을 나타낸 것이다. 이 초기화 시퀀스는 PIC를 통해 쉽게 전송될 수 있으며 어셈블리 코드는 아래의 그림 1과 같다. 초기화, 읽기 및 쓰기를 위한 1-Wire 타이밍 규격은 표 1과 같다. 이 매개변수들은 이 문서의 나머지에서 참조된다.
그림 1. 1-Wire 초기화 시퀀스.
OW_RESET:
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500µs
OW_HIZ
WAIT .70 ; Release line and wait 70µs for PD Pulse
BTFSS PORTB,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
WAIT .430 ; Wait 430µs after PD Pulse
RETLW 0
OW_RESET 루틴은 DQ 핀이 하이 임피던스 상태에 있음으로써 풀업 저항에 의해 하이로 풀될 수 있도록 보장함으로써 시작된다. 그 다음, 이 루틴은 PDBYTE 레지스터가 다음 번 존재 탐지 펄스를 검증할 준비를 갖추도록 이 레지스터를 소거한다. 그 다음, DQ 핀은 500µs동안 로우로 구동된다. 이것은 표 1의 tRSTL 매개변수를 충족하고, 따라서 20µs 추가 버퍼를 제공한다. 핀을 로우로 구동한 후, 핀은 하이 임피던스 상태로 놓여지고 존재 탐지 펄스를 읽기 전에 70µs의 지연이 추가된다. 70µs의 사용은 PIC가 tPDL 및 tPDH의 조합을 위한 유효 시간에 샘플링되도록 보장한다. 일단 존재 탐지 펄스가 읽히면, PDBYTE 레지스터는 로직 레벨 읽기를 보여주기 위해 조정된다. 그러면 DQ 핀은 tRSTH 시간이 충족되었음을 보장하기 위해 추가적으로 430µs 동안 하이 임피던스 상태로 남겨지고 20µs 추가 버퍼를 포함한다.
1-Wire 통신을 위해 필요한 다음 번 루틴은 DSTXBYTE이며, 이것은 데이터를 1-Wire 슬레이브 소자로 전송하는 데 사용된다. 이 루틴을 위한 PIC 코드는 그림 2와 같다. 이 루틴은 WREG 레지스터로 전송될 데이터에 의해 호출되며, IOBYTE 레지스터로 즉시 이동된다. 그 다음, DQ 라인을 벗어나 전송된 비트의 수를 계산하기 위해 COUNT 레지스터는 8로 초기화된다. DSTXLP에서 시작하여 PIC는 데이터를 전송하기 시작한다. 먼저 DQ 핀은 전송되는 로직 레벨에 상관없이 3µs 동안 로우로 구동된다. 이것은 tLOW1 시간이 충족되도록 보장한다. 그 다음 IOBYTE의 lsb가 CARRY 비트로 천이된 다음 1 또는 0에 대해 테스트된다. CARRY가 1이면, PORTB의 DQ 비트가 설정되고 이것이 핀을 하이 임피던스 상태로 변경하며 라인은 풀업 저항에 의해 하이로 연결된다. CARRY가 0이면 라인은 로우로 유지된다. 그 다음 최소 tLOW0 시간을 허용하기 위해 60µs 지연이 추가된다. 60µs 대기 후, 핀은 하이 임피던스 상태로 변경된 다음, 추가적인 2µs가 풀업 저항 복구를 위해 추가된다. 끝으로 COUNT 레지스터는 감소된다. COUNT 레지스터가 0일 경우, 8개 비트가 모두 전송된 것이며 루틴이 수행된다. COUNT 레지스터가 0이 아닐 경우 DSTXLP에서 시작하여 또 다른 비트가 전송된다. 0 쓰기의 시각적 해석과 0 쓰기 절차는 그림 2와 같다.
그림 2. 1-Wire 쓰기 타임 슬롯.
DSTXBYTE: ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP:
OW_LO
NOP
NOP
NOP ; Drive the line low for 3µs
RRF IOBYTE,F
BSF STATUS,RP0 ; Select Bank 1 of data memory
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF TRISB,DQ ; HiZ the line if LSB is 1
BCF STATUS,RP0 ; Select Bank 0 of data memory
WAIT .60 ; Continue driving line for 60µs
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2µs
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0
1-Wire 통신을 위한 최종 루틴은 PIC가 슬레이브 소자로부터 정보를 수신할 수 있게 해주는 DSRXBYTE이다. 코드는 그림 3과 같다. COUNT 레지스터는 DQ 활동이 시작되기 전에 8로 초기화되고, 이 기능은 수신된 비트의 수를 계산하는 것이다. DSRXLP는 PIC가 데이터를 수신할 준비가 되어 있다는 것을 슬레이브 소자에 알려주기 위해 DQ 핀을 로우로 구동함으로써 시작한다. 라인은 6µs, 동안 로우로 구동된 다음 DQ 핀을 하이 임피던스 상태로 놓아 풀린다. 그 다음, PIC는 4µs를 더 기다린 후 데이터 라인을 샘플링한다. 라인이 로우로 구동된 후 OW_LO에는 1개 라인의 코드가 있으며, OW_HIZ 내에는 3개 라인의 코드가 있다. 각 라인을 프로세스하려면 1µs의 시간이 걸린다. 모든 시간을 더하면 1 + 6 + 3 + 4 = 14µs 이며, 이것은 tRDV 규격인 15µs 바로 아래 값이다. PORTB 레지스터가 읽힌 후 DQ 비트는 마스킹 오프된 다음, 레지스터는 CARRY 비트를 DQ 비트를 미러링하도록 포싱하기 255에 추가된다. 그러면 CARRY 비트는 착신 바이트가 저장되는 IOBYTE로 천이된다. 일단 바이트가 지연되면 tSLOT이 충족되도록 보장하기 위해 50µs의 지연이 추가된다. 최종 점검은 COUNT 레지스터가 0인지 여부를 결정하는 것이다. 값이 0이면, 8개 비트가 판독된 것이며 루틴이 종료된다. 그렇지 않을 경우, DSRXLP에서 루프가 반복된다. 0 읽기 및 1 읽기 트랜잭션은 그림 3과 같다.
그림 3. 1-Wire 읽기 타임 슬롯.
DSRXBYTE: ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6µs
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4µs
MOVF PORTB,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C = 1 if DQ = 1: C = 0 if DQ = 0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50µs to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0
요약
Dallas Semiconductor의 1-Wire 통신 프로토콜은 Microchip의 PICmicro 마이크로컨트롤러 제품군에서 쉽게 구현될 수 있다. 1-Wire 트랜잭션을 완료하기 위해서는 2개의 GPIO 상태만이 필요하며 PIC에 있는 다수의 GPIO는 이 작업을 위해 쉽게 구성된다. 1-Wire 통신을 위해 필요한 3가지 기본 루틴은 초기화, 바이트 읽기 및 바이트 쓰기이다. 이 3가지 루틴이 제시되었고 정확한 1-Wire 정규 속도 통신을 제공하기 위해 자세히 설명되었다. 따라서 PIC는 많은 Dallas Semiconductor 1-Wire 소자와 인터페이스할 수 있다. 본 문서의 부록 A는 편리한 포함 파일에 3가지 루틴을 포함하고 있다. 부록 B는 PIC16F628이 DS2761 고정밀 Li+ 배터리 모니터에 인터페이스하도록 마련된 소형 어셈블리 프로그램을 포함하고 있다.
부록 A: 1-Wire 포함 파일 (1W_16F6X.INC)
; *******************************************************
;
; Dallas 1-Wire Support for PIC16F628
;
; Processor has 4MHz clock and 1µs per instruction cycle.
;
; *******************************************************
; *******************************************************
; Dallas Semiconductor 1-Wire MACROS
; *******************************************************
OW_HIZ:MACRO
BSF STATUS,RP0 ; Select Bank 1 of data memory
BSF TRISB, DQ ; Make DQ pin High Z
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
OW_LO:MACRO
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF PORTB, DQ ; Clear the DQ bit
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISB, DQ ; Make DQ pin an output
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
WAIT:MACRO TIME
;Delay for TIME µs.
;Variable time must be in multiples of 5µs.
MOVLW (TIME/5)-1 ;1µs
MOVWF TMP0 ;1µs
CALL WAIT5U ;2µs
ENDM
; *******************************************************
; Dallas Semiconductor 1-Wire ROUTINES
; *******************************************************
WAIT5U:
;This takes 5µS to complete
NOP ;1µs
NOP ;1µs
DECFSZ TMP0,F ;1µs or 2µs
GOTO WAIT5U ;2µs
RETLW 0 ;2µs
; --------------------------------------------------------
OW_RESET:
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500µs
OW_HIZ
WAIT .70 ; Release line and wait 70µs for PD Pulse
BTFSS PORTB,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
WAIT .400 ; Wait 400µs after PD Pulse
RETLW 0
; --------------------------------------------------------
DSRXBYTE: ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6µs
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4µs
MOVF PORTB,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C=1 if DQ=1: C=0 if DQ=0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50µs to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0
; --------------------------------------------------------
DSTXBYTE: ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP:
OW_LO
NOP
NOP
NOP ; Drive the line low for 3µs
RRF IOBYTE,F
BSF STATUS,RP0 ; Select Bank 1 of data memory
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF TRISB,DQ ; HiZ the line if LSB is 1
BCF STATUS,RP0 ; Select Bank 0 of data memory
WAIT .60 ; Continue driving line for 60µs
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2µs
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0
; --------------------------------------------------------
부록 B: PIC16F628 - DS2761 어셈블리 코드 (PIC_2_1W.ASM)
; *******************************************
;
; Dallas Semiconductor PIC code
;
; This code will interface a PIC16F628 microcontroller to
; a DS2761 High-Precision Li+ Battery Monitor
;
; *******************************************;
;
; VCC
; ^
; |
; |
; /
; \ Rpup
; /
; \
; |
; 16F628 | DS2761
; RB1 (pin 7) ------------------------------ DQ (pin 7)
;
; *******************************************;
;---------------------------------------------------------
; List your processor here.
list p=16F628
; Include the processor header file here.
#include
;---------------------------------------------------------
; Assign the PORTB with Constants
constant DQ=1 ; Use RB1 (pin7) for 1-Wire
;--------------------------------------------------------
; These constants are standard 1-Wire ROM commands
constant SRCHROM=0xF0
constant RDROM=0x33
constant MTCHROM=0x55
constant SKPROM=0xCC
;---------------------------------------------------------
; These constants are used throughout the code
cblock 0x20
IOBYTE
TMP0 ; Address 0x23
COUNT ; Keep track of bits
PICMSB ; Store the MSB
PICLSB ; Store the LSB
PDBYTE ; Presence Detect Pulse
endc
;---------------------------------------------------------
; Setup your configuration word by using __config.
; For the 16F628, the bits are:
; CP1,CP0,CP1,CP0,N/A, CPD, LVP, BODEN, MCLRE, FOSC2, PWRTE, WDTE, FOSC1, FOSC0
; CP1 and CP0 are the Code Protection bits
; CPD: is the Data Code Protection Bit
; LVP is the Low Voltage Programming Enable bit
; PWRTE is the power-up Timer enable bit
; WDTE is the Watchdog timer enable bit
; FOSC2, FOSC1 and FOSC0 are the oscillator selection bits.
; CP disabled, LVP disabled, BOD disabled, MCLR enabled, PWRT disabled, WDT disabled, INTRC I/O oscillator
; 11111100111000
__config 0x3F38
;---------------------------------------------------------
; Set the program origin for subsequent code.
org 0x00
GOTO SETUP
NOP
NOP
NOP
GOTO INTERRUPT ; PC 0x04...INTERRUPT VECTOR!
;---------------------------------------------------------
INTERRUPT:
SLEEP
;---------------------------------------------------------
; Option Register bits
; ____
; RBPU,INTEDG,TOCS,TOSE,PSA,PS2,PS1,PS0
; 7=PORTB Pullup Enable, 6=Interrupt Edge Select, 5=TMR0 Source,
; 4=TMR0 Source Edge, 3=Prescaler Assign, 2-0=Prescaler Rate Select
; 11010111
; PORTB pullups disabled,rising edge,internal,hightolow,TMR0,1:256
SETUP:
BCF STATUS,RP1
BSF STATUS,RP0 ; Select Bank 1 of data memory
MOVLW 0xD7
MOVWF OPTION_REG
BCF STATUS,RP0 ; Select Bank 0 of data memory
;---------------------------------------------------------
BCF INTCON,7 ; Disable all interrupts.
;---------------------------------------------------------
GOTO START
;---------------------------------------------------------
; Include the 1-Wire communication routines and macros
#INCLUDE 1w_16f6x.inc
;---------------------------------------------------------
START:
;---------------------------------------------------------
GET_TEMP:
CALL OW_RESET ; Send Reset Pulse and read for Presence Detect Pulse
BTFSS PDBYTE,0 ; 1 = Presence Detect Detected
GOTO NOPDPULSE
MOVLW SKPROM
CALL DSTXBYTE ; Send Skip ROM Command (0xCC)
MOVLW 0x69
CALL DSTXBYTE ; Send Read Data Command (0x69)
MOVLW 0x0E
CALL DSTXBYTE ; Send the DS2761 Current Register MSB address (0x0E)
CALL DSRXBYTE ; Read the DS2761 Current Register MSB
MOVF IOBYTE,W
MOVWF PICMSB ; Put the Current MSB into file PICMSB
CALL DSRXBYTE ; Read the DS2761 Current Register LSB
MOVF IOBYTE,W
MOVWF PICLSB ; Put the Current LSB into file PICLSB
CALL OW_RESET
NOPDPULSE: ; Add some error processing here!
SLEEP ; Put PIC to sleep
;---------------------------------------------------------
end