PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

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

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 15-09-2006, 11:02 AM   #1
hoanf
Đệ tử 3 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 51
:
Chào mọi người và Hà.
Mình làm cho nó chạy được rồi.
Mình có một thắc mắc mong Hà và mọi người giải thích dùm. Đó là thông số "FORCE_HW" mà trong phần #use i2c sử dụng
Mình cho rằng thông số này chỉ được áp dụng khi ta quy định chân của I2C đúng theo chân của PIC quy đinh (đối với Pic hỗ trợ I2C). khi mình áp thông số này thì CCS sẽ biên dịch chương trình sao cho phù hơp với cấu hình phần cứng mà PIC hỗ trợ. Còn nếu kô áp thông số này lên thì nó sẽ thực hiện giao thức I2C hoàn toàn bằng phần mềm.

Và còn một lệnh mình chưa rõ đó là : I2C_POLL()

Mong Hà và các bạn góp ý.
Thân
hoanf
hoanf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2006, 12:04 PM   #2
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Trích:
Nguyên văn bởi hoanf View Post
Mình có một thắc mắc mong Hà và mọi người giải thích dùm. Đó là thông số "FORCE_HW" mà trong phần #use i2c sử dụng
Mình cho rằng thông số này chỉ được áp dụng khi ta quy định chân của I2C đúng theo chân của PIC quy đinh (đối với Pic hỗ trợ I2C). khi mình áp thông số này thì CCS sẽ biên dịch chương trình sao cho phù hơp với cấu hình phần cứng mà PIC hỗ trợ. Còn nếu kô áp thông số này lên thì nó sẽ thực hiện giao thức I2C hoàn toàn bằng phần mềm.

Và còn một lệnh mình chưa rõ đó là : I2C_POLL()

Mong Hà và các bạn góp ý.
Thân
hoanf
HW = hardware. Có nghĩa là sử dụng giao tiếp phần cứng. Em hình dung như thế này. Một chuẩn giao tiếp, thực ra chỉ là một quy định và dùng chung, gọi là chuẩn. Thế thì một chuẩn, bao gồm những thứ gì?

Anh chỉ nói đơn giản thế này, nó bao gồm chuẩn về kết nối, có nghĩa là các header em dùng để cắm vào, nôm na là chuẩn cơ khí, chuẩn về đường dây (các loại dây để đảm bảo tín hiệu truyền)..chuẩn cáp, chuẩn thứ ba nôm na là chuẩn về điện là các chuẩn về điện áp, dòng điện, và chuẩn thứ tư là chuẩn logic, chuẩn này ảnh hưởng đến số lượng dây truyền, phương thức truyền nhận, tín hiệu trên các dây... Nói chung, một chuẩn truyền bao gồm các chuẩn như vậy. Anh dùng từ ngữ không chính xác lắm, tụi em có thể tra cứu lại các từ ngữ tiếng Anh, anh chỉ cố gắng giải thích theo nghĩa đơn giản nhất thôi.

Như vậy, bây giờ khi em kết nối về mặt cơ khí (với I2C là hàn vào board, hoặc hai dây cắm vào), chuẩn cable là đường mạch in hoặc dây 3000 đồng/sợi... hehehe... vân vân...

Vậy cái cuối cùng, là chuẩn về logic và điện tử. Em thấy rằng, nếu như bây giờ, mình lấy 2 dây nối bất kỳ, nối vào nhau, dùng con PIC, lập trình một chân tạo xung clk, một chân truyền tín hiệu, đưa vào MAX232, thì lập tức em sẽ có được giao tiếp RS232. Cái này em hoàn toàn lập trình được, đối với bất kỳ chân nào, chỉ cần phỏng theo chuẩn logic của RS232 là em có thể lập trình được. Như vậy, người ta gọi cách làm đó là giao tiếp theo chuẩn RS232 bằng phần mềm. Và thực tế là người ta đã làm như vậy. Còn với giao tiếp I2C, thì em thấy nó có khác gì RS232 đâu, nó cũng có thể làm được như vậy bằng phần mềm, chỉ cần lập trình về mặt logic đảm bảo chuẩn truyền của nó.

Với con PIC bất kỳ, không hỗ trợ I2C, em hoàn toàn có thể thực hiện giao tiếp I2C bằng phần mềm theo cách trên. Với các con PIC hỗ trợ I2C, em có 2 cách để thực hiện giao tiếp I2C là phần cứng và phần mềm. Thế thì phần cứng, thực ra là người ta thêm vào đó một khối module phần cứng, thay cho cái việc mình viết một đoạn chương trình để chạy, thì cái module đó nó làm thay mình, và nó được đóng gói theo đúng chuẩn.

CCS C hỗ trợ hai dạng lập trình. Một dạng là lập trình vài dòng để kích hoạt cái module phần cứng của PIC và chạy giao tiếp bằng phần cứng. Một dạng khác, là nó sẽ tạo ra code để thực hiện cái chuẩn giao tiép đó, gọi là phần mềm.

Như vậy, nếu em dùng module phần cứng, bắt buộc, em phải dùng đúng cái chân của nó, vì cái chân đó nó gắn vào module phần cứng I2C của PIC, còn nếu em dùng phần mềm, thì như anh nói, em có thể dùng bất kỳ chân I/O nào, và em chỉ cần định nghĩa nó là chân I/O là xong, em hoàn toàn có thể tự làm chuyện này.

Hôm nào rảnh, anh sẽ tìm lại code I2C viết bằng phần mềm để tụi em tham khảo. Anh viết lâu rồi, nên phải tìm lại, không hứa trước sẽ nhanh.

Trong khi chờ đợi, cho anh cái hình mạch nguyên lý lên đây đi, coi như là đánh đổi nhé

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2006, 12:35 PM   #3
hoanf
Đệ tử 3 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 51
:
Cám ơn anh Falleaf!!
Thực ra mô hình của bạn Hà mới phức tạp nên cần sơ đồ.
Chứ mô hình của em chỉ có 2 con PIC 16F877A nối với nhau qua các chân I2C chứ chả có gì nên em kô post lên.
Nay thấy anh nói vậy thì để em ngồi vẽ post sơ đồ lên.
Còn về chương trình em chưa gửi lên được vì đang tiến hành Optimize. Sẽ post cùng sơ đồ luôn .

Thân
hoanf
hoanf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2006, 02:47 PM   #4
hoanf
Đệ tử 3 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 51
:
Chào các bạn!!
Cho mình post sơ đồ và code của minh lên đây cho các bạn coi và có gì góp ý cho mình nha.

Đây là đoạn code Master: Master truyền một mảng cho Slave và nhận về mảng mà đã chuyển cho Slave để hiển thị lên port_b(kiểm tra hihi...) giống echo.

Code:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)

#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)

void write_I2C(int8 value, int8 slave_addr)
{
   i2c_start();
   i2c_write(slave_addr);
   i2c_write(value);
   i2c_stop();
}

int8 read_I2C(int8 slave_addr)
{
   int8 value_re;
   i2c_start();
   i2c_write(slave_addr + 1);
   value_re = i2c_read(0);
   i2c_stop();
   return value_re;
}

void main()
{
   int8 value_re;
   int8 i;
   const int8 N = 8;
   const int8 DIGITS[N] ={ 0b11111111,
                           0b11111110,
                           0b11111100,
                           0b11111000,
                           0b11110000,
                           0b11100000,
                           0b11000000,
                           0b10000000,
                          };
   const int8 slave_addr = 0x10;

   set_tris_b(0x00);
   while(1){
      for(i = 0; i<8; i++){
         write_I2C(DIGITS[i], slave_addr);
         delay_ms(500);
         value_re = read_I2C(slave_addr);
         output_b(value_re);
      }
   }
}
Còn đây là đoạn code Slave:

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

#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)

int8 value = 0x01;

#INT_SSP
void i2c_isr()
{
   int8 state;

   state = i2c_isr_state();
   if(state < 0x80)
      value = i2c_read();
   if(state == 0x80){
      i2c_write(value);
   }
}

void main()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   set_tris_b(0x00);
   while(1){
      output_b(value);
   }
}
Hình Kèm Theo
File Type: jpg sodo.JPG (124.8 KB, 1026 lần tải)
hoanf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2006, 03:35 PM   #5
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Đơn giản vậy thôi, các em vừa làm xong một bài hướng dẫn I2C khá đầy đủ rồi

Thanks muchie
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2006, 05:04 PM   #6
hoanf
Đệ tử 3 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 51
:
Trích:
Nguyên văn bởi falleaf View Post
Đơn giản vậy thôi, các em vừa làm xong một bài hướng dẫn I2C khá đầy đủ rồi

Thanks muchie
Hay quá ha. Nhưng nếu mà có chương trình nào tự viết bằng C mà kô lấy các hàm của CCS hỗ trợ sãn cho I2c thì hay biết mấy .
Vậy chắc phải đợi bài hướng dẫn I2C nâng cao của anh Falleaf qua'.
Tui em đang đợi chương trình của anh đây.
Thân
hoanf
hoanf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2006, 10:17 PM   #7
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Trích:
Nguyên văn bởi hoanf View Post
Hay quá ha. Nhưng nếu mà có chương trình nào tự viết bằng C mà kô lấy các hàm của CCS hỗ trợ sãn cho I2c thì hay biết mấy .
Vậy chắc phải đợi bài hướng dẫn I2C nâng cao của anh Falleaf qua'.
Tui em đang đợi chương trình của anh đây.
Thân
hoanf
Anh không cho chương trình trực tiếp, nhưng anh cho một gợi ý, không biết như vậy có được không nhỉ?

Con PIC16F84A hình như không có tích hợp chức năng I2C? Nếu như anh không nhớ lầm?!

Bắc thang lên hỏi ông trời, ông mà không biết tui mời ông ggô

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-09-2006, 11:56 PM   #8
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi hoanf View Post
Hay quá ha. Nhưng nếu mà có chương trình nào tự viết bằng C mà kô lấy các hàm của CCS hỗ trợ sãn cho I2c thì hay biết mấy .
Vậy chắc phải đợi bài hướng dẫn I2C nâng cao của anh Falleaf qua'.
Tui em đang đợi chương trình của anh đây.
Thân
hoanf
Tôi đang viết tutorial cho module I2C của dsPIC, tự viết các chương trình con, nhưng còn viết hướng dẫn nữa nên chưa post lên được. Các bạn có thể tham khảo ở đó sau vài ngày nữa.

Ngoài ra còn có chương trình cho PIC18 viết trong C18, dùng kỹ thuật bit-banging, đã thử nghiệm rồi.

Các bạn có thể tìm được nhiều ví dụ tương tự trên net.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-10-2006, 06:05 PM   #9
Encoder
Nhập môn đệ tử
 
Encoder's Avatar
 
Tham gia ngày: Aug 2005
Nơi Cư Ngụ: Ha Noi
Bài gửi: 4
:
Send a message via Yahoo to Encoder
Trích:
Nguyên văn bởi falleaf View Post
Đơn giản vậy thôi, các em vừa làm xong một bài hướng dẫn I2C khá đầy đủ rồi
Chưa đâu bác. Còn viết I2C trên HTPIC thì sao. Bác đã viết chương trình nào chưa, cho em xin tí code.
Encoder vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-01-2007, 12:51 AM   #10
zero_OR_one
Nhập môn đệ tử
 
Tham gia ngày: Oct 2005
Bài gửi: 5
:
Trích:
Nguyên văn bởi hoanf View Post
Chào các bạn!!
Cho mình post sơ đồ và code của minh lên đây cho các bạn coi và có gì góp ý cho mình nha.

Đây là đoạn code Master: Master truyền một mảng cho Slave và nhận về mảng mà đã chuyển cho Slave để hiển thị lên port_b(kiểm tra hihi...) giống echo.

Code:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)

#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)

void write_I2C(int8 value, int8 slave_addr)
{
   i2c_start();
   i2c_write(slave_addr);
   i2c_write(value);
   i2c_stop();
}

int8 read_I2C(int8 slave_addr)
{
   int8 value_re;
   i2c_start();
   i2c_write(slave_addr + 1);
   value_re = i2c_read(0);
   i2c_stop();
   return value_re;
}

void main()
{
   int8 value_re;
   int8 i;
   const int8 N = 8;
   const int8 DIGITS[N] ={ 0b11111111,
                           0b11111110,
                           0b11111100,
                           0b11111000,
                           0b11110000,
                           0b11100000,
                           0b11000000,
                           0b10000000,
                          };
   const int8 slave_addr = 0x10;

   set_tris_b(0x00);
   while(1){
      for(i = 0; i<8; i++){
         write_I2C(DIGITS[i], slave_addr);
         delay_ms(500);
         value_re = read_I2C(slave_addr);
         output_b(value_re);
      }
   }
}
Còn đây là đoạn code Slave:

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

#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)

int8 value = 0x01;

#INT_SSP
void i2c_isr()
{
   int8 state;

   state = i2c_isr_state();
   if(state < 0x80)
      value = i2c_read();
   if(state == 0x80){
      i2c_write(value);
   }
}

void main()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   set_tris_b(0x00);
   while(1){
      output_b(value);
   }
}
Bác Hoàn cho em hỏi tý,em thử mô phỏng chương trình của bác(có sửa một tý) với proteus thì thấy kết quả slave hiện đúng,master sai(ví dụ value cho là 0x7f thì master là 0x87,sửa value khác thì master vẫn thế---ở đây value của em có vai trò như 1 thành phần của mảng của bác thôi) .Cũng ko hiểu sao ở slave bác lại cho int8 value = 0x01;,đã thay lại mỗi khai báo int8 value thôi,mô phỏng vẫn thế.Không hiểu do phần mềm hay sao???Thông cảm vì em chưa có điều kiện làm vì ko có đủ 2 con chip.
zero_OR_one vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-05-2007, 10:34 PM   #11
loveall
Đệ tử 1 túi
 
Tham gia ngày: May 2007
Bài gửi: 15
:
hình bạn post mờ quá!!
loveall vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-07-2009, 04:41 PM   #12
dung h
Đệ tử 4 túi
 
Tham gia ngày: May 2009
Bài gửi: 74
:
I2C gặp vấn đề!

Trích:
Nguyên văn bởi hoanf View Post
Chào các bạn!!
Cho mình post sơ đồ và code của minh lên đây cho các bạn coi và có gì góp ý cho mình nha.

Đây là đoạn code Master: Master truyền một mảng cho Slave và nhận về mảng mà đã chuyển cho Slave để hiển thị lên port_b(kiểm tra hihi...) giống echo.

Code:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)

#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)

void write_I2C(int8 value, int8 slave_addr)
{
   i2c_start();
   i2c_write(slave_addr);
   i2c_write(value);
   i2c_stop();
}

int8 read_I2C(int8 slave_addr)
{
   int8 value_re;
   i2c_start();
   i2c_write(slave_addr + 1);
   value_re = i2c_read(0);
   i2c_stop();
   return value_re;
}

void main()
{
   int8 value_re;
   int8 i;
   const int8 N = 8;
   const int8 DIGITS[N] ={ 0b11111111,
                           0b11111110,
                           0b11111100,
                           0b11111000,
                           0b11110000,
                           0b11100000,
                           0b11000000,
                           0b10000000,
                          };
   const int8 slave_addr = 0x10;

   set_tris_b(0x00);
   while(1){
      for(i = 0; i<8; i++){
         write_I2C(DIGITS[i], slave_addr);
         delay_ms(500);
         value_re = read_I2C(slave_addr);
         output_b(value_re);
      }
   }
}
Còn đây là đoạn code Slave:

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

#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)

int8 value = 0x01;

#INT_SSP
void i2c_isr()
{
   int8 state;

   state = i2c_isr_state();
   if(state < 0x80)
      value = i2c_read();
   if(state == 0x80){
      i2c_write(value);
   }
}

void main()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   set_tris_b(0x00);
   while(1){
      output_b(value);
   }
}
sao mình viết vd của bạn mà o thấy chạy gì cả? ai có thể giải thích giúp mình chưong trình trên và vài vấn đề sau:
- khi mater muốn truyền data thì cần phải làm gì?
- khi master muốn nhận thì phải làm gì?
- khi master đang truyền mà muồn dừng lại để nhận thì làm thế nào?
thanks!
dung h vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-10-2009, 09:41 PM   #13
TRTien
Nhập môn đệ tử
 
Tham gia ngày: Jul 2008
Bài gửi: 8
:
Trích:
Nguyên văn bởi hoanf View Post
Chào các bạn!!
Cho mình post sơ đồ và code của minh lên đây cho các bạn coi và có gì góp ý cho mình nha.

Đây là đoạn code Master: Master truyền một mảng cho Slave và nhận về mảng mà đã chuyển cho Slave để hiển thị lên port_b(kiểm tra hihi...) giống echo.

Code:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)

#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)

void write_I2C(int8 value, int8 slave_addr)
{
   i2c_start();
   i2c_write(slave_addr);
   i2c_write(value);
   i2c_stop();
}

int8 read_I2C(int8 slave_addr)
{
   int8 value_re;
   i2c_start();
   i2c_write(slave_addr + 1);
   value_re = i2c_read(0);
   i2c_stop();
   return value_re;
}

void main()
{
   int8 value_re;
   int8 i;
   const int8 N = 8;
   const int8 DIGITS[N] ={ 0b11111111,
                           0b11111110,
                           0b11111100,
                           0b11111000,
                           0b11110000,
                           0b11100000,
                           0b11000000,
                           0b10000000,
                          };
   const int8 slave_addr = 0x10;

   set_tris_b(0x00);
   while(1){
      for(i = 0; i<8; i++){
         write_I2C(DIGITS[i], slave_addr);
         delay_ms(500);
         value_re = read_I2C(slave_addr);
         output_b(value_re);
      }
   }
}
Còn đây là đoạn code Slave:

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

#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)

int8 value = 0x01;

#INT_SSP
void i2c_isr()
{
   int8 state;

   state = i2c_isr_state();
   if(state < 0x80)
      value = i2c_read();
   if(state == 0x80){
      i2c_write(value);
   }
}

void main()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   set_tris_b(0x00);
   while(1){
      output_b(value);
   }
}
Cho mình hỏi với, sao mình mô phỏng trên proteus theo chương trình này thì không chạy gì cả vậy?
Có ai mô phỏng rồi thì bảo mình với, mới học PIC + I2C nên mình chưa biết gì cả.
TRTien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-10-2012, 08:44 AM   #14
nguyenthangcdt
Đệ tử 1 túi
 
Tham gia ngày: Apr 2012
Bài gửi: 16
:
Trích:
Nguyên văn bởi hoanf View Post
Chào các bạn!!
Cho mình post sơ đồ và code của minh lên đây cho các bạn coi và có gì góp ý cho mình nha.

Đây là đoạn code Master: Master truyền một mảng cho Slave và nhận về mảng mà đã chuyển cho Slave để hiển thị lên port_b(kiểm tra hihi...) giống echo.

Code:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)

#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)

void write_I2C(int8 value, int8 slave_addr)
{
   i2c_start();
   i2c_write(slave_addr);
   i2c_write(value);
   i2c_stop();
}

int8 read_I2C(int8 slave_addr)
{
   int8 value_re;
   i2c_start();
   i2c_write(slave_addr + 1);
   value_re = i2c_read(0);
   i2c_stop();
   return value_re;
}

void main()
{
   int8 value_re;
   int8 i;
   const int8 N = 8;
   const int8 DIGITS[N] ={ 0b11111111,
                           0b11111110,
                           0b11111100,
                           0b11111000,
                           0b11110000,
                           0b11100000,
                           0b11000000,
                           0b10000000,
                          };
   const int8 slave_addr = 0x10;

   set_tris_b(0x00);
   while(1){
      for(i = 0; i<8; i++){
         write_I2C(DIGITS[i], slave_addr);
         delay_ms(500);
         value_re = read_I2C(slave_addr);
         output_b(value_re);
      }
   }
}
Còn đây là đoạn code Slave:

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

#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)

int8 value = 0x01;

#INT_SSP
void i2c_isr()
{
   int8 state;

   state = i2c_isr_state();
   if(state < 0x80)
      value = i2c_read();
   if(state == 0x80){
      i2c_write(value);
   }
}

void main()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   set_tris_b(0x00);
   while(1){
      output_b(value);
   }
}
minhf copy rooif paste vao nhuwng khoong chayj banj ah
nguyenthangcdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2012, 11:22 AM   #15
vangtranglanh
Nhập môn đệ tử
 
Tham gia ngày: Jun 2010
Nơi Cư Ngụ: da nang
Bài gửi: 1
:
Cần anh chị giúp I2C

Em mới chập chững học i2c nên còn nhiều thắc mắc và nhiều chỗ không hiểu ,anh chị cho em hỏi giả sử bên slave của em có một biến đếm n,cứ sau 1 giây thì n++;bây h em mún gởi giá trị của n qua máter thì code ở mater và slave sẽ được viết như thế nào ạ?
Mong anh chị giúp dỡ ,xin cảm ơn!
vangtranglanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


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à 09:01 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