PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   Giao tiếp I2C (http://www.picvietnam.com/forum/showthread.php?t=611)

thanhctdt07 29-09-2009 12:29 AM

Mình cần một người giúp mình viết và giải thích dùm một chương trình quét led ma trận và có thêm phần hiển thị lên led ma trận từ bàn phím có (6x6) 36 nút nhấn các ký tự ABC
Vd: ta nhập tên “thanh” thì chử sẽ được hiển thị lên led ma trận 8led ma trận 8x8 và nhấn thêm một phím nữa dể chử vừa nhập “thanh” chay theo lập trình ./.
Giá cả không thành vấn đề có thể thương lượng sau,ai giúp được thì liên lạc số đt :0937567594 gặp Đạt hoặc 01226688701 gặp Phương Duy
Cần gấp !!!!!!!!!!minh` ở TP HCM bạn nào ở HCM thì càng tốt

bebungbu 30-09-2009 01:30 AM

Trích:

Nguyên văn bởi vagabond (Post 6710)
Hi mọi người,

Các bạn có thể sử dụng IC 74LVXC4245 để chuyển đổi mức điện áp 3.3-5V. IC này cũng cho phép xác định chiều vào/ra của tín hiệu. IC này sẽ được cấp 2 nguồn áp tham chiếu là 5V và 3.3V. Chú ý: theo sơ đồ dưới đây, ta cần phải có thêm 2 tín hiệu để điều khiển chiều ra/vào của tín hiệu ở các ngõ A và B.

Cho mình hỏi IC để chuyển điện áp này có thể mua ở đâu vậy ?

nhuhuan86 30-09-2009 12:25 PM

em mới vào tìm hiểu vì i2c có chỗ này ko hiểu lắm mong các bác giúp đỡ:vấn đề là em giao tiếp 2 con chip 16f877a.Con master gui yêu cầu xuống slave đọc adc.con slave khi đọc dữ liệu, rồi gửi dữ liệu adc đó qua i2c tới con Master.vậy em phải làm thế nào?mong các bác cho ý cao kiến.Thanks

nhamdtk4 30-09-2009 07:51 PM

Trích:

Nguyên văn bởi inventor_bk (Post 29862)
Theo em biết địa chỉ slave là từ datasheet

Điều này đúng với các linh kiện mà bạn ko thể lập trình cho nó (chỉ ghi đọc dữ liệu) còn VĐK thì khác bạn có thể gán cho nó một địa chỉ bất kỳ mà modul I2C có thể hỗ trợ.

inventor_bk 01-10-2009 04:51 PM

Cảm ơn bạn nhé.

TRTien 16-10-2009 09:41 PM

Trích:

Nguyên văn bởi hoanf (Post 4955)
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ả.

thevinhbk3i 17-10-2009 07:32 PM

các bác ! em đang làm đồ án môn học thcn về giao thức can ! các bác có biết thì chỉ bảo giùm em với

suphuhocdoi89 17-10-2009 07:56 PM

anh pic bang chủ ơi!
anh add dùm nickname của em vào box 09.em đăng nhập vào diễn đàn nhưng ko thấy hộp box 09.anh kiểm tra lại giúp em với.
username :suphuhocdoi89

success.tl 28-10-2009 08:08 AM

Vấn đề ngắt i2c trong chip SLAVE
 
Mình có viết chương trình ngắt cho SLAVE như sau:
//////////////////////////////////////////////////////////
#INT_SSP
void i2c_isr()
{
state = i2c_isr_state();
if(state >=0x80)
i2c_write(mang_truyen[state-0x80]);
else if(state>0) mang_nhan[state-1]=i2c_read();
}
//////////////////////////////////////////////////////////
mang_truyen gán sẵn giá trị, mang-truyen và mang_nhan riêng biệt.
Trong chip MASTER, mình viết vòng lặp để ghi và đọc dữ liệu với SLAVE:
//////////////////////////
while (1)
{
write_I2C(1,2,3,4,5,6);
delay_ms(10);
read_I2C();
...
}
/////////////////////////
Nhưng dữ liệu nhận được từ SLAVE khi hiển thị ra LCD thì chỉ đúng trong lần read_I2C() đầu tiên. Còn khi vòng lặp while(1){...} lặp lại lần thứ 2, 3,... thì thu được dữ liệu là các số 255. không đúng theo yêu cầu.
Hiện tượng trên lặp lại khi mình Reset chip SLAVE.
Còn nếu Reset chip MASTER thì luôn thu được các số 255.
************************************************** ****************
Các bạn giúp mình với.
Cảm ơn nhiều.

success.tl 28-10-2009 08:32 AM

À, mình sửa được rồi các bạn ạ!
Bên MASTER đọc liên tiếp 6 bytes, bên SLAVE mình chỉ khai báo mảng truyền 6 phần tử nên mới có hiện tượng này. Mình khai báo lại mảng truyền >6 phần tử thì lại hoạt động đúng.
Như vậy là vì sao nhỉ? Mình mới lập trình nên chưa hiểu lắm!

thanhluanbk 10-11-2009 07:07 AM

Em đang chuẩn bị làm về kết nối hai vi điều khiển là 16F và dsPIC33FJMC202. Các bác cho em biết cần lưu ý điều gì, vì hai vi điều khiển nào thuộc 2 họ khác nhau, có xung nhịp khác nhau.

Cảm ơn các bác!

rikimaru87 11-11-2009 12:09 AM

i2c
 
Mọi người cho em hỏi tí:
em thiết kế mạch gồm : 4 con eeprom 24c256 và 1 mạch ds1307 giao tiếp i2c. vậy em phải chọn address cho từng thiết bị như thế nào khi giao tiếp ạ :
cụ thể biến address trong hàm dưới này chọn ntn ạ
void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xa0);
i2c_write(address>>8);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
i2c_stop();
}

rikimaru87 11-11-2009 12:12 AM

chân A0 A1 của 4 con 24c256 nối lần lượt là 00 01 10 11.
ds1307 nối bình thường .

rikimaru87 11-11-2009 07:42 AM

hi. chào mọi người . em giải quyết đc rùi . tại chưa đọc kĩ datasheet. :D

vinasheva 04-12-2009 11:00 PM

Có ai có mẫu dùng I2C bằng phần mềm cho các loại PIC k có sẵn module I2C?


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

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