View Single Post
Old 21-07-2008, 05:18 PM   #10
dark_electron
Đệ tử 2 túi
 
Tham gia ngày: Feb 2008
Bài gửi: 27
:
Giao tiếp với DS1307

Hix, xong phần ngắt quét LED rồi giờ chuyển qua viết giao tiếp với DS1307 bằng ASM cực quá là cực. PIC16F628A ko hỗ trợ I2C hardware mà phải code bằng phần mềm. Em copy luôn cái phần I2C protocol của Nigel, sửa lại vài chỗ mà nó ko chịu chạy. Lạ một điều là em chỉ mới có khởi tạo cho con DS1307 mà chip nó không thèm chạy luôn:
Code:
	movlw   	0x00              
	movwf   	Adr_Lo
	movlw		0x00			;set CH bit to Zero
	call    	   Write_RTC         	;reset SECOND register to zero
phần subroutine Write_RTC em code như sau:
Code:
Write_RTC					; write W register to address Adr_Lo
	movwf		DAT_VAL		    ; save W
	call		   I2C_Start
	call		   I2C_Set_Write
	
	call		   I2C_Lo_Adr
	movf		 DAT_VAL, W	    ; send the actual data
	movwf		OutputByte
	
	call		   I2C_Out
	call		   I2C_NAK
	call		   I2C_Stop 
	call		   WaitForWrite
	return
các subroutine còn lại em copy y nguyên như tut6.5 của Nigel, chỉ bỏ phần báo lỗi lên LCD mà thôi. Về lý thuyết, nếu giao tiếp với RTC không được thì Interrupt của chip vẫn phải chạy và vẫn phải quét LED cho em. Nhưng đây khi em viết đoạn mã ở trên vào thì nó im như cái nhíp luôn, còn bỏ đoạn mã giao tiếp I2C đó ra khỏi chương trình thì timer0 interrupt chạy mượt, quét LED ngon lành. Thế là thế nào nhỉ???
Em thiết kế phần cứng như sau: portB gửi data ra LED, portA chân RA0 đến RA3 quét 4 LED, chân RA6 làm SDA và chân RA7 làm SCL, kéo lên bằng điện trở 10k. Sử dụng dao động nội 4MHz.
Các bác cho em hỏi nguyên nhân làm chip bị đơ khi giao tiếp với DS1307? Có phải do giá trị điện trở kéo lên quá lớn so với giá trị recommended? Cái thứ 2 nữa là em có thể sử dụng chân RA5 (MCLR) như là một chân I/O bình thường được ko, vì chân này bị nối với con trở 10k làm mạch reset rồi? Thanks.
dark_electron vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn