View Single Post
Old 11-04-2013, 12:30 PM   #1
duc thang
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 11
:
16F887 giao tiếp với 18B20 (one_wire)

Chạy mô phỏng với Protues, kết quả nhận được toàn là FFH (Low) FFH (high).
Không biết sai chổ nào, các giúp đở .
Pic 16F887, thạch anh 4MHz. như vậy mỗi chu kỳ lệnh = 1us.
Khả năng sai là ở WRITE_TIME_SLOT và READ_TIME_SLOT; thay đổi tới lui cũng không được. Nhờ giúp đở.
;==============================
Code Main:
MAIN
call RESET_18B20
movlw 0CCH
movwf TEMP
call WRITE_18B20 ;SKIP ROM command
movlw 44H
movwf TEMP
call WRITE_18B20 ;temperature convert command
;====
call delay_750ms
;====
call RESET_18B20
movlw 0CCH
movwf TEMP
call WRITE_18B20 ;SKIP ROM command
movlw 0BEH
movwf TEMP
call WRITE_18B20 ;READ temperature command
call READ_18B20 ;READ temperature low byte
movfw TEMP
movwf PORTC
movwf TEMP1 ;keep in TEMP1
call READ_18B20 ;READ temperature high byte
movfw TEMP
movwf PORTD
movwf TEMP2 ;keep in TEMP2
goto MAIN

;==========
RESET_18B20
banksel TRISB
bcf Tris_DQ
banksel PORTB
bcf DQ
movlw 0A4H ;500us
movwf COUNT
decfsz COUNT,1
goto $-1
banksel TRISB
bsf Tris_DQ
banksel PORTB
movlw 0F4H
movwf COUNT
loop_reset_18B20
btfss DQ
goto OK_RESET_18B20
decfsz COUNT,1
goto loop_reset_18B20 ;otherwise continue reset
bsf DQ
nop
nop
goto RESET_18B20
OK_RESET_18B20
btfss DQ
goto $-1
banksel TRISA
bcf Tris_DQ
banksel PORTB
bsf DQ
return
;===========
WRITE_18B20
movlw 08H
movwf COUNT1
WRITE_18B20_1
rrf TEMP,1
call WRITE_TIME_SLOT
decfsz COUNT1,1 ;if finish 8 bit data
goto WRITE_18B20_1
movlw 23H ;106us
movwf COUNT
decfsz COUNT,1
goto $-1
return
;=============
WRITE_TIME_SLOT ;viet 1 bit
bcf DQ
nop
nop
bsf DQ ;3us
movlw 04H ;17us
movwf COUNT
decfsz COUNT,1
goto $-1
btfss STATUS,C ;judge the write data is 0 or 1
goto WRITE_END
bsf DQ
WRITE_END
movlw 13H ;58us
movwf COUNT
decfsz COUNT,1
goto $-1
bsf DQ
nop
return
;================
READ_18B20
movlw 08H
movwf COUNT1
READ_18B20_1
call READ_TIME_SLOT
decfsz COUNT1,1 ;if finish reading 8 bit
goto READ_18B20_1
movlw 1FH
movwf COUNT
decfsz COUNT,1
goto $-1
return
;==================
READ_TIME_SLOT
bcf DQ
nop
nop
bsf DQ ;3us
banksel TRISA
bsf Tris_DQ
banksel PORTA
movlw 04H ;16us
movwf COUNT ;
decfsz COUNT,1
goto $-1
bsf STATUS,C
btfss DQ
bcf STATUS,C
rrf TEMP,1
movlw 11H
movwf COUNT ;
decfsz COUNT,1
goto $-1 ;pull low 56us
banksel TRISA
bcf DQ
banksel PORTA
bsf DQ
nop
nop
return
;==================
delay_750ms
movlw 04H
movwf DQ_DELAY3
DELAY_750MS_3
movlw 0FFH
movwf DQ_DELAY2
DELAY_750MS_2
movlw 0FFH
movwf DQ_DELAY1
DELAY_750MS_1
decfsz DQ_DELAY1,1
goto DELAY_750MS_1
decfsz DQ_DELAY2,1
goto DELAY_750MS_2
decfsz DQ_DELAY3,1
goto DELAY_750MS_3
return
;=============

thay đổi nội dung bởi: duc thang, 11-04-2013 lúc 04:00 PM.
duc thang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn