PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Các thắc mắc về ASM30, C30 (http://www.picvietnam.com/forum/showthread.php?t=400)

pham_v_quang3i 01-09-2006 11:45 AM

OK, em hiểu rồi.
Nếu ta cấu hình chip như thế này :
_FOSC(CSW_FSCM_OFF & FRC & XT_PLL16);
_FOSC(CSW_FSCM_OFF & FRC & XTL);

Thì trong cả hai trường hợp này XT_PLL16 và XTL là không có ý nghĩa. Trong cả hai trường hợp trên chip đều sử dụng mạch dao động FRC trong, nhưng cấu hình của FPR<3:0> vẫn để ở XT_PLL16 hoặc XTL. Vậy mục đích của việc thiết kế này chỉ là để làm hài lòng người dùng thôi ư, nếu người sử dụng muốn thay đổi nguồn clock việc gì mà không cấu hình lại từ đầu. Hay mục đích của việc này là nhờ vào clock switch để 1 chip có thể chạy nhiều tần số khác nhau ở những khoảng khác nhau . Hi , thấy nó cứ là lạ.

namqn 01-09-2006 06:13 PM

Trích:

Nguyên văn bởi pham_v_quang3i
OK, em hiểu rồi.
Nếu ta cấu hình chip như thế này :
_FOSC(CSW_FSCM_OFF & FRC & XT_PLL16);
_FOSC(CSW_FSCM_OFF & FRC & XTL);

Thì trong cả hai trường hợp này XT_PLL16 và XTL là không có ý nghĩa. Trong cả hai trường hợp trên chip đều sử dụng mạch dao động FRC trong, nhưng cấu hình của FPR<3:0> vẫn để ở XT_PLL16 hoặc XTL. Vậy mục đích của việc thiết kế này chỉ là để làm hài lòng người dùng thôi ư, nếu người sử dụng muốn thay đổi nguồn clock việc gì mà không cấu hình lại từ đầu. Hay mục đích của việc này là nhờ vào clock switch để 1 chip có thể chạy nhiều tần số khác nhau ở những khoảng khác nhau . Hi , thấy nó cứ là lạ.

Mục đích của việc đặt FPR<3:0> chính là cho clock switching, chúng ta cấu hình sẵn primary và chuyển từ FRC sang primary khi cần thiết (thường là cho các hệ thống liên quan đến tiết kiệm năng lượng nhưng vẫn cần năng lực tính toán cao, các hệ portable chẳng hạn). Việc đặt FPR<3:0> chỉ không có ý nghĩa khi chúng ta tắt clock switching, nhưng nên chú ý là chân OSC2 vẫn chịu ảnh hưởng của các thiết lập đó, không cần biết clock switching có bật hay không.

Thân,

alamanda 06-01-2008 11:26 PM

Mong các bác chỉ giúp em phần I2C slave cho dsPIC.
Đây là toàn bộ chương trình cho con slave :
Code:

#include <p30f4011.h>
_FOSC(CSW_FSCM_OFF & FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_27 & PWRT_4 & MCLR_EN & RST_IOPIN);
_FGS(CODE_PROT_OFF);

#include <i2c.h>

void SI2C_init(void);
void slave_reply(unsigned char data);

unsigned char rcv_data,trn_data;
unsigned char data_request;

void _ISR_PSV _SI2CInterrupt(void)
{
        _SI2CIF = 0;
        if(_R_W)        //Read data from Slave
        {
                data_request = 1;
        }else        //Write data to Slave
        {
                if(_D_A) //I2CRSR chua du lieu
                        rcv_data = I2CRCV;//doc du lieu
                else        //I2CRSR chua dia chi
                        Nop();//Khong lam gi ca
        }
}

int main(void)
{
        SI2C_init();
        while(1)
        {
                if(data_request)
                {
                        data_request = 0;
                        trn_data ++;
                        slave_reply(trn_data);
                }
                if(rcv_data)
                {
                        rcv_data = 0;
                }
        }
        return 0;
}
void SI2C_init(void)
{
        I2CADD = 0x10;
        I2CCON = I2C_ON & I2C_IDLE_STOP & I2C_CLK_REL
                        & I2C_IPMI_DIS & I2C_7BIT_ADD
                        & I2C_SLW_DIS & I2C_SM_DIS
                        & I2C_GCALL_DIS & I2C_STR_DIS
                        & I2C_ACK & I2C_ACK_DIS & I2C_RCV_DIS
                        & I2C_STOP_DIS & I2C_RESTART_DIS
                        & I2C_START_DIS;
        IPC3bits.SI2CIP = 1;
        IEC0bits.SI2CIE = 1;
        _SI2CIF = 0;
}
void slave_reply(unsigned char data)
{
        I2CTRN = data;
        _SCLREL = 1;//Giai phong SCL
}

Vấn đề là không biết chương trình trên sai hay thiếu chỗ nào mà I2C master ko nhận được tín hiệu Ack từ slave khi truyền đến slave đó. Bus I2C ở đây chỉ có 2 IC và chương trình I2C Master đã chạy đúng với EEPROM.

alamanda 16-01-2008 10:33 PM

hic,sao kô thấy các cao thủ có cao kiến gì vậy? Chẳng lẽ chưa ai tìm hiểu về I2C Slave trên dsPIC?

namqn 17-01-2008 02:51 AM

Giả sử các hằng số _R_W và _D_A đã được bạn định nghĩa đúng, chương trình bên phía slave của bạn về giải thuật là ổn. Tuy nhiên, chương trình bên phía master của bạn ra sao, phần cứng của bạn thế nào thì bạn chưa nói. Master của bạn làm việc với EEPROM không có nghĩa là nó sẽ làm việc với một slave dsPIC. Bạn có thể cần chỉnh lại phần cứng, có thể cần phải thay đổi chương trình của master (địa chỉ slave mới chẳng hạn), và những vấn đề thực tế khác (thời gian chờ giữa các giai đoạn chẳng hạn, phần này khi giao tiếp với EEPROM thì hardware của EEPROM thực hiện cho bạn, còn khi viết slave thì bạn phải hiện thực nó).

Thân,

alamanda 22-01-2008 11:28 PM

Về phần cứng,ban đầu em dùng 2 điện trở 1.5k kéo lên;sau khi tham khảo datasheet,em đổi sang dùng điện trở 2.2k,kết quả vẫn như nhau.
Về chương trình Master,em viết theo chương trình Tutorial về I2C của anh,kiểm tra bit _Ackstat sau mỗi lần gửi,nếu ko có tín hiệu Ack trả về thì dừng,và báo lỗi qua UART2(do đó,em biết được I2C bị lỗi ở giai đoạn nào).Nếu có tín hiệu Ack trả về,thì tiếp tục truyền (như vậy ko biết em còn phải chờ gì nữa?).Còn về phần địa chỉ, em cũng đã thử thay đổi địa chỉ slave nằm trong vùng địa chỉ cho phép, nhưng cũng ko ăn thua.
Hiện tại em ko biết mình sai ở phần nào,phần cứng hay phần mềm?


Múi giờ GMT. Hiện tại là 12:04 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam