Chào các bạn ở bài viết này mình muốn đề cập đến sử dụng I2C trong F88
+ I2C là chuẩn giao tiếp của hang Philp và hiện đang đựoc sử dụng rất rộng rãi, ưu điểm tốc độ truyền nhanh, chỉ cần 2 dây SDA, SCL nhưng chỉ truyền trong phạm vi ngắn , Tốc độ đường truyền vào khoảng 100Kb => 400Kb ……
Các bạn có thể tham khảo tại :
http://users.pandora.be/educypedia/electronics/I2C.htm
http://www.semiconductors.philips.co...protocols/i2c/
+ Trong 16F88 có hỗ trợ I2C nhưng chỉ hỗ trợ các chế độ Slave Mode, do đó để có thể giao tiếp với các IC như DS1307 ( hoạt động ở chế dộ Slave mode ) ta phải tự xây dựng các giao tiếp chế độ Master Mode
+ Về tài liệu giao tiếp I2C trong PIC các bạn có thể tham khảo vidu của Ngài Nigel ( VD6 ) Project dưới đây tôi cũng dựa theo VD đó
+ Để các bạn hình dung được hơn về I2C mình Up lên cho các bạn Project mình vừa mới hoàn thành xong. Giao tiếp DS1307 với 16F88..
Các đặc điểm của chương trình:
Dây nối SDA, SCL được nối với RB1,RB4 của RTC, SQW/OUT của RTC được nối với RB0 ( chân này được sử dụng để tạo ngắt.ngoài )
Cơ chế hoạt động: cho RTC hoạt động với mức tạo xung ra ở chân SQW 1Hz, xung tín hiêu được đưa vào RB0 tạo ngăt, cứ mỗi khi có ngắt xảy ra thì Pic sẽ đọc dữ liệu từ RTC đưa ra màn hình LCD.
Trong chương trình ko sử dụng nut bắm để điều chinh thời gian , ko hiển thị ngày tháng năm, các bạn hoàn toàn có thể đưa vào để nâng cấp chương trình. Rât mong được nhận các chương trình từ các bạn
Phan 1
PHP Code:
;**********************************************************************
; *
; Filename: DS1307.asm *
; Date: 20-10-2005 *
; File Version: V1.0 *
; *
; Author: MAFD_47A *
; Company: BACHKHOA *
; *
; *
;**********************************************************************
; *
; Files required: Hien thi thoi gian dung DS1307 *
; Ket noi va hien thi dung LCD *
; Su dung ngat ngoai de thuc hien bao thoi diem *
; Nhap du lieu *
; *
;**********************************************************************
; *
; Notes: EN noi voi chan 7 *
; RS noi voi chan 6 *
; RW noi voi chan 3 *
; Data noi tu 3,2,1,0 (portA) voi D7,D6,D5,D4 cua LCD *
; Su dung thach anh 4MH *
; Chan SDA, SCL cua DS1307 ket noi voi SDA, SCL cua VDK *
; Chan PTout duoc noi voi chan RB0 ( tao ngat) *
; *
;**********************************************************************
; *
; Upgrade: HIEN THI GIO, PHUT, GIAY LEN MAN HINH LCD *
; SU DUNG NGAT DE NHAN BIET THOI GIAN (dung ngat RB0) *
; *
; *
;**********************************************************************
list p=16f88 ; list directive to define processor
#include <p16F88.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file & _WRT_ENABLE_OFF
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;***** VARIABLE DEFINITIONS
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving
ACC EQU 0x74
MODE EQU 0x75
RO EQU 0x78
R1 EQU 0x79
R2 EQU 0x7A
R3 EQU 0x7B
R4 EQU 0x7C
R5 EQU 0x7D
R6 EQU 0x7E
R7 EQU 0x7F
EN EQU H'0007'
RS EQU H'0006'
RW EQU H'0003'
P7 EQU H'0007'
START_RAM EQU 0x60
PORT_DAT EQU PORTA
TRIS_DAT EQU TRISA
PORT_CON EQU PORTB
TRIS_CON EQU TRISB
SCL EQU 0x04
SDA EQU 0x01
I2C_PORT Equ PORTB
I2C_TRIS Equ TRISB
CBLOCK 0x20 ;start of general purpose registers
count
Flags
Flags2
Adr_Lo ; RTC memory address to be accessed
Adr_Hi
DAT_VAL
_N
InputByte ; byte read from RTC is stored in this register
OutputByte ; used for holding byte to be output to RTC
I2Cflags ; flag bit register
RAM_SEC
RAM_MIN
RAM_HOU
RAM_DAY
RAM_DAT
RAM_MON
RAM_YEA
endc
ErrFlag Equ 0x00
StartFlag Equ 0x01 ;flags used for received bit
One Equ 0x02
Zero Equ 0x03
Chip_Read Equ 0xD1 ;RTC address values
Chip_Write Equ 0xD0
ORG 0x0000
goto MAIN
ORG 0x0004
movwf w_temp ; save off current W register contents
movf STATUS,w ; move STATUS register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,W ; move PCLATH register into W register
movwf pclath_temp ; save off contents of PCLATH register
;==============================================================================
CLRF Adr_Lo
CALL Read_RTC
MOVWF RAM_SEC
INCF Adr_Lo
CALL Read_RTC
MOVWF RAM_MIN
INCF Adr_Lo
CALL Read_RTC
MOVWF RAM_HOU
CALL CONVERT
CALL WRITE_TIMER_LCD
BCF INTCON,1
;==============================================================================
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
MAIN
BANKSEL ANSEL
CLRF ANSEL
BANKSEL PORTA
CALL INIT_LCD
; Kiem tra trang thai ban dau co nen nhap so lieu hay ko
MOVLW 0x07
MOVWF Adr_Lo
CALL Read_RTC
SUBLW 0x10
BTFSC STATUS,Z
GOTO NEXT_MAIN
; Ham INIT Timer
MOVLW 0x00
MOVWF Adr_Lo
CALL Write_RTC
MOVLW 0x07
MOVWF Adr_Lo
MOVLW 0x10
CALL Write_RTC
MOVLW 0x01
MOVWF Adr_Lo
MOVLW 0x25
CALL Write_RTC
MOVLW 0x02
MOVWF Adr_Lo
MOVLW 0x00
CALL Write_RTC
NEXT_MAIN
BANKSEL TRISB
BSF TRISB,0
BANKSEL PORTB
MOVLW B'11010000'
MOVWF INTCON
goto $