![]() |
|
Tài trợ cho PIC Vietnam |
Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
các anh giúp em với. em copy bài các bài trên xuống dùng và chạy bình thường. nhưng khi dùng cho 2 con slever thì gặp vấn đề. nếu con 1 chạy thì con 2 không chạy. nếu bỏ đoạn con 1 trong master thì con 2 chạy. nếu dùng cả 2 con thì chỉ có con 1 chạy xong rồi đứng yên. không rỏ nguyên nhân vì sao. mong chỉ giáo
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(); } //============================================== /*void write_I2C2(int8 value, int8 slave_addr1) { i2c_start(); i2c_write(slave_addr1); 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,a; const int8 N = 8; const int8 DIGITS[N] ={ 0b11111111, 0b11111110, 0b11111100, 0b11111000, 0b11110000, 0b11100000, 0b11000000, 0b10000000, }; set_tris_b(0x00); while(1) { // con 1 for(i = 0; i<8; i++) { write_I2C(DIGITS[i], 0x10); delay_ms(500); value_re = read_I2C(0x10); output_b(value_re); } // con 2 for(a = 0; a<8; a++) { write_I2C(DIGITS[a],0x20); delay_ms(500); value_re = read_I2C(0x20); output_b(value_re); } } } con slever1 #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); } } con slever 2 #include <16F877A.H> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(Clock=4000000) #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x20, force_hw) int8 value1 = 0x01; #INT_SSP void i2c_isr() { int8 state; state = i2c_isr_state(); if(state < 0x80) value1 = i2c_read(); if(state == 0x80) { i2c_write(value1); } } void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_SSP); set_tris_b(0x00); while(1) { output_b(value1); } } thay đổi nội dung bởi: falleaf, 14-12-2007 lúc 11:15 AM. |
![]() |
![]() |
![]() |
#2 |
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 14
: |
Em cũng đang gặp vấn đề tương tự với 1 master và nhiều slave.Mong các bác có kinh nghiệm hướng dẫn.
Khi chỉ có 1 slave thì chạy tốt nhưng có nhiều slave thì có triệu chứng như của bạn tungtot_vl ở trên. |
![]() |
![]() |
![]() |
#3 |
Đệ tử 2 túi
Tham gia ngày: Jun 2007
Bài gửi: 44
: |
kbd và I2C
xin lỗi các huynnh cho đệ hỏi 1 câu ngu ngóc .em muốn tìm mua một con pic loại rẻ tiền nhất mà có đáp ứng nhu cầu sau: kết nối với bàn phím 4x3 và truyền thông tin phím nhấn ra bus I2C .em chỉ cần hai tinh năng đó thôi.chú ý là loại nào có giá thấp nhất mà có bán trên thị trường Việt Nam.mong các huynh quan tâm giúp đỡ ,tiểu đệ xin cảm ơn trước.
|
![]() |
![]() |
![]() |
#4 |
Đệ tử 6 túi
|
tài liệu viết Help -CCS tiếng Việt rất hay..
tài liệu này rất chi tiết..các bạn dơn về tham khảo..nếu thấy hay thì "thanks" dùm mình cái nghen...
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 1 túi
Tham gia ngày: Sep 2010
Bài gửi: 21
: |
Cam on stupid tai lieu rat hay va chi tiet
Cam on stupid tai lieu rat hay va chi tiet
![]() |
![]() |
![]() |
![]() |
#6 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 69
: |
bạn có thể tìm con 16f887 giá hình như 48.000vnd bạn có thể liên hệ anh F
|
![]() |
![]() |
![]() |
#7 |
Đệ tử 2 túi
Tham gia ngày: Jun 2007
Bài gửi: 44
: |
bạn tiendungkct oi ! mình vừa xem datasheet of con 16f887 xong thấy nó có nhiều ký hiệu lạ trên các chân quá (trước giờ mình mới làm việc việc với con 16f877a thôi)mình thấy con 16f876/873 chỉ có 28 chân nhưng ko biết giá nó bao nhiêu nhỉ.mình o nha trang nếu mua trên picvietnam thì ko biết nhận thế nào nhỉ,và trả tiền ra sao? a nhân tiện bạn cho mình hỏi mình có thể mua bàn phím 4x3 (loại chế tạo sẵn có vỏ bọc bảo vệ ,chống nước ,vì mình muốn đặt nó ngoài trời để điều khiển mà) ở đâu và bao nhiêu?
|
![]() |
![]() |
![]() |
#8 |
Nhập môn đệ tử
Tham gia ngày: Jan 2008
Bài gửi: 4
: |
Nack
Bạn nào cho mình hỏi muốn gửi xung NACK từ Master --> slave thì làm thế nào.
Thanks |
![]() |
![]() |
![]() |
#9 | |
Trưởng lão PIC bang
|
Trích:
http://namqn.byethost7.com/Commu.php Master gửi ACK/NACK khi nó đọc từ slave, muốn làm việc này thì ở thao tác đọc chỉ cần cho phép ACK/NACK và bật/tắt bit trạng thái ACK/NACK (bật là NACK, tắt là ACK). 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 thay đổi nội dung bởi: namqn, 26-10-2008 lúc 12:31 AM. |
|
![]() |
![]() |
![]() |
#10 |
Nhập môn đệ tử
Tham gia ngày: Jan 2008
Bài gửi: 4
: |
Cam on ban Namqn. Web bạn gửi mình đọc không được. Mình dùng 2 con 16f877a giao tiếp qua i2c và lập trình css C. có phải i2c_read(0) tức là nhận dữ liệu và gửi xung NACK đi không. Mình gửi 5byte dữ liệu liên tiếp từ slave--->master, giờ cho nó dừng lại để làm việc khác nhưng không biết dừng bằng cách nào hết. Bạn cho mình biết rõ hơn về lệnh i2c_isr_state() , giá trị 0x80 và lớn hơn 0x80 khác nhau chỗ nào.
thanks. |
![]() |
![]() |
![]() |
#11 | |
Trưởng lão PIC bang
|
Trích:
Để có thể thực hiện thao tác ACK/NACK với hàm i2c_read(), bạn phải dùng 2 tham số, như trong tài liệu hướng dẫn đã viết. Nếu muốn NACK và bạn chỉ có 1 stream, bạn có thể dùng i2c_read(0, 0). Bạn cũng nên có stream = 0 trong phần dẫn hướng #use i2c. Ý nghĩa của trị trả về của hàm i2c_isr_state() đã được ghi rõ trong tài liệu hướng dẫn, 0x80 là địa chỉ khớp, cần đáp ứng bằng một hàm i2c_write(), còn 0x81 - 0xFF là hoàn thành việc phát dữ liệu, và đã nhận được ACK, cần đáp ứng bằng một hàm i2c_write(). 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 |
|
![]() |
![]() |
![]() |
#12 |
Đệ tử 9 túi
|
- i2c_read(); đọc 1 byte từ bus i2c và tạo xung ACK
- i2c_read(0); đọc 1 byte từ bus i2c và tạo xung NACK, dùng trước khi i2c_stop(); kết thúc đọc dữ liệu. Muốn ghi nhiều byte liên tiếp tới SLAVE: Sau khi gửi địa chỉ, gửi liên tiếp các byte cần ghi, muốn ngừng dùng i2c_stop(); Bạn tham khảo tutorial ở trang 1 của anh F gửi, xem format ghi nhận dữ liệu. Bạn có thể gửi code lên.
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
![]() |
![]() |
![]() |
#13 |
Nhập môn đệ tử
Tham gia ngày: Jan 2008
Bài gửi: 4
: |
master - multi slave
Bạn nào đã làm giao tiếp i2c chế độ một master nhiều slave cho mình hỏi tí.
Mình dùng Css C, sử dụng 3 con pic 16f877a trong đó 1 master và 2 slave có một bàn phím ở master để điều khiển lấy dữ liệu từ slave. không hiểu sao chỉ chạy đúng được một trong 2 con, sau đó luôn gửi về giá trị 255. |
![]() |
![]() |
![]() |
#14 | |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 8
: |
Trích:
- Tiện thể cho mình hỏi một chút: mình dùng Master =18f4550 và slave=16f877a địa chỉ 0x10 thì tốt, khi chuyển sang dùng 2 con đều là 18f4550 khi lại không đc, (vẫn địa chỉ 0x10) Hay ở 18f4550 con slave phải có địa chỉ khác nhỉ. Ai biết chỉ giúp mình với....xin cảm ơn trước. thay đổi nội dung bởi: tam_pascal, 22-04-2008 lúc 06:46 PM. |
|
![]() |
![]() |
![]() |
#15 |
Đệ tử 4 túi
Tham gia ngày: Jul 2006
Nơi Cư Ngụ: Bốn biển là nhà
Bài gửi: 69
: |
Cấu hình cho I2C của pic8F4431 dùng pin_D2 và pin_D3 như sau:
trường hợp 1: Code:
#include <18F4431.h> #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD #use delay(clock=20000000) #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C5, address=0xa0,force_hw,slow) Code:
#include <18F4431.h> #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,SSP_RD #use delay(clock=20000000) #use i2c(SLAVE, SDA=PIN_D2, SCL=PIN_D3, address=0xa0,force_hw,slow) Vậy giải thích hai trường hợp này: do CCS "chuối" hay do người dùng "gà" quá?
__________________
YM: electronicltv thay đổi nội dung bởi: electronicltv, 24-04-2008 lúc 05:28 PM. Lý do: bỏ code vào thẻ code |
![]() |
![]() |
![]() |
|
|