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.