PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 04-11-2012, 03:14 PM   #5
lab.cdt
Đệ tử 1 túi
 
Tham gia ngày: May 2012
Bài gửi: 19
:
Giờ tớ lại có vấn đề tiếp. Tớ đã truyền được từ mater đến slave bao nhiêu byte cũng được. Nhưng để truyền từ slave lên mater thì tớ chỉ truyền được một byte đầu tiên. Ý tớ là nếu tớ truyền 8 byte bất kỳ (có thể nhiều hơn cũng được) chẳng hạn như: { 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00}. Thì tớ chỉ có truyền được 1 byte đầu tiên là : 0xFF. Nguyên lý truyền thì tớ đã nắm được nhưng tớ lại gặp vấn đề về code. Đây là code mẫu của tớ. Các cậu sửa giúp tớ nhé :

//code cho mater

#include <16F877A.H>
#use Delay(Clock=4000000)

#define SLAVE_ADDRESS 0x10
#use i2c(master, sda=PIN_C4, scl=PIN_C3)

/////////////////////////////////////////////////////////////////////////////////////////////////
////// doan code co muc dich la con mater ra lenh con slave gui du lieu len cho no///
///// doc gia tri tra ve //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
int8 read_I2C()
{
int8 value;

i2c_start();
i2c_write(SLAVE_ADDRESS + 1);
value = i2c_read();
i2c_stop();
return value;
}

void main()
{
int8 value, i;
/////////////////////////////////////////////////////////////////////////////////////////////////
////// doan code co muc dich la goi ham read_i2c() 8 lan ////////////////////////
////// va xuat gia tri tra ve ra cac pin cua portB ///////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
set_tris_b(0);
for(i = 1; i < 9; i++)
{
value = read_I2C();
output_b(value);
}
}

//code cho slave

#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP

#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
int8 DIGIT[8] = { 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00};
#INT_SSP

//////////////////////////////////////////////////////////////////////////////////////////////////
///// doan code co muc dich la nhan tin hieu dieu khien tu mater /////////////////
//// va truyen 8 byte len mater //////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
void i2c_isr()
{
int8 state;
state = i2c_isr_state();
if(state >= 0x80)
{
i2c_write(DIGIT[state - 0x80]);

}
}

void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
////////////////////////////////////////////////////////////////////////////////////////////
//doan code nay co muc dich kiem tra xem con slave co truyen dung khong////////
////////////////////////////////////////////////////////////////////////////////////////////
set_tris_b(0);
int8 i;
for (i = 1; i < 9; i++)
{
output_b(DIGIT[i - 1]);
delay_ms(100);
}
}

tớ không hiểu là con mater ra lệnh điều khiển 8 lần thì mỗi lần biến trạng thái state = i2c_isr_state() nằm ở chương trình con slave phải tăng lên tuần tự chứ và bắt đầu là 0x80 ( tiếp theo là 0x81, 0x82......). nhưng sao biến state ở chương trình con slave lại không tăng lên nhỉ. Nó cứ nằm ở 0x80 hoài...???? giúp tớ với...thân...

thay đổi nội dung bởi: lab.cdt, 04-11-2012 lúc 03:21 PM.
lab.cdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 10:02 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam