?? vidu4-3.c
字號:
/*******************************************************************************
; Vidu4-3.c la chuong trinh viet bang C30 de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Thiet lap cac tham so cho RTC DS1307 *
; thong qua giao tiep I2C, su dung module I2C cua dsPIC *
;*******************************************************************************
; Tac gia : Nguyen Quang Nam *
; Don vi : PIC Viet Nam *
; Ten tap tin : Vidu4-3.c *
; Ngay : 25/08/2006 *
; Phien ban : 0.01 *
; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.h *
; Cong cu duoc dung: MPLAB 7.31 *
; C30 2.02 SE *
; ASM30 2.14 *
; LNK30 2.14 *
------------------------------------------------------------------------------*/
#include "p30f4012.h"
_FOSC(CSW_FSCM_OFF & FRC_PLL4); //Clock = 32 MHz
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);
//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
#define Fcy 8000000 //Tan so thuc thi lenh
#define baud 100000 //Toc do baud cua giao tiep I2C
//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_I2C(void);
void Send_I2C(unsigned char);
void Wait_I2C(void);
void I2C_Fail(void);
//Cac bien toan cuc
unsigned short temp;
//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
Init_PORTS(); //Khoi tao cac cong I/O
Init_I2C(); //Khoi tao module I2C
//Buoc 1, tao dieu kien START, cho hoat dong I2C hoan tat
_SEN = 1;
Wait_I2C(); //Cho hoat dong I2C hoan tat
//Buoc 2, xuat dia chi cua RTC voi thao tac ghi, cho va kiem tra ACK
Send_I2C(0xD0); //Xuat dia chi cua RTC DS1307, sap ghi vao RTC
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
//Buoc 3, xuat dia chi cua thanh ghi dich (target), cho va kiem tra ACK
Send_I2C(0x00); //Xuat dia chi cua thanh ghi can thao tac
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
//Buoc 4, xuat noi dung cho cac thanh ghi dich (target), cho va kiem tra ACK
Send_I2C(0x00); //Xuat noi dung cua thanh ghi 0x00 (dem giay va bit CH)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Send_I2C(0x00); //Xuat noi dung cua thanh ghi 0x01 (dem phut)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Send_I2C(0x67); //Xuat noi dung cua thanh ghi 0x02 (dem gio va che do)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Send_I2C(0x01); //Xuat noi dung cua thanh ghi 0x03 (dem thu trong tuan)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Send_I2C(0x25); //Xuat noi dung cua thanh ghi 0x04 (dem ngay)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Send_I2C(0x08); //Xuat noi dung cua thanh ghi 0x05 (dem thang)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Send_I2C(0x06); //Xuat noi dung cua thanh ghi 0x06 (dem nam)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
Send_I2C(0x90); //Xuat noi dung cua thanh ghi 0x07 (dieu khien SQW/OUT)
Wait_I2C(); //Cho hoat dong I2C hoan tat
if (_ACKSTAT) I2C_Fail(); //Neu NACK thi dung chuong trinh
//Buoc 5, tao dieu kien STOP, cho hoat dong I2C hoan tat
_PEN = 1; //Tao ra dieu kien STOP
Wait_I2C(); //Cho hoat dong I2C hoan tat
while (1) Nop(); //Vong lap chinh
}
//Chuong trinh con khoi tao cac cong I/O
void Init_PORTS(void) {
LATE = 0xFFFF; //Tat cac LED (anode chung) noi vao cong E
TRISE = 0xFFFE; //LED noi vao RE0
}
//Chuong trinh con khoi tao module I2C
void Init_I2C(void) {
I2CCON = 0x8200; //bit15=I2CEN, bit9=DISSLW (tat Slew Rate
//Control cho cac toc do baud khac 400 kbps)
I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);
}
//Chuong trinh con xuat 1 byte qua module I2C
void Send_I2C(unsigned char d) {
I2CTRN = d;
}
//Chuong trinh con cho hoat dong Master I2C sau cung hoan tat
void Wait_I2C(void) {
while (!_MI2CIF);
_MI2CIF = 0;
}
//Chuong trinh con xu ly khi hoat dong I2C bi loi
void I2C_Fail(void) {
_PEN = 1; //Tao ra dieu kien STOP
Wait_I2C(); //Cho hoat dong I2C hoan tat
LATE &= 0xFFFE; //Bat LED noi vao RE0 de bao loi
while (1); //Dung chuong trinh tai day
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -