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 Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc 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 09-11-2008, 01:14 PM   #1
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 ketxanh View Post
tui moi lam xong giao tiep i2c giữa pic8f2550 và pic 18f4550, chương trình chạy ngon lành. anh em nào có hứng thú tui post lên cho
Bạn nên post bài của bạn lên luôn, vì rất nhiều người đã làm vấn đề này, và cần càng nhiều bài tham khảo càng tốt, từ đó người đọc sẽ biết thêm nhiều cách để tối ưu code của mì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 23-11-2008, 11:21 PM   #2
ketxanh
Đệ tử 3 túi
 
ketxanh's Avatar
 
Tham gia ngày: Aug 2008
Bài gửi: 53
:
Talking I2c

Xin lỗi anh em vi minh post hơi chậm.Mong mọi người đóng góp ý kiến nhé
File Kèm Theo
File Type: rar I2C.rar (27.5 KB, 511 lần tải)
ketxanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-12-2008, 08:30 AM   #3
ketxanh
Đệ tử 3 túi
 
ketxanh's Avatar
 
Tham gia ngày: Aug 2008
Bài gửi: 53
:
không biết co ai quan tâm cái i2c của tui không, mà không thấy đóng góp ý kiên gì, hay cái cảm ơn gì hết ta.....buồn wa. không thi mọi ngừoi chê tui cũng được đặng tui còn biết để mà sửa lỗi lầm
__________________
Hãy cho trước khi nhận
ketxanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-12-2008, 10:19 AM   #4
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trích:
Nguyên văn bởi ketxanh View Post
không biết co ai quan tâm cái i2c của tui không, mà không thấy đóng góp ý kiên gì, hay cái cảm ơn gì hết ta.....buồn wa. không thi mọi ngừoi chê tui cũng được đặng tui còn biết để mà sửa lỗi lầm
Có thể bây giờ chưa có bạn nào gặp rắc rối về I2C, tuy nhiên mai mốt, ai đó cần code mẫu về I2C cho cả slave - master viết = CCS chắc chắn sẽ rất cảm ơn code của bạn.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-12-2008, 11:06 PM   #5
dientubk3
Đệ tử 1 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 14
:
Hi các Pro !Em có chương trình viết cho Pic 16f877A,chế độ Mater i2c.Giao tiếp với LCD16x2 chế độ 4bit,giao tiếp với i2c slave và bàn phím 4x4 nữa!Chương trình của em là :
+Khi nhấn một phím 4x4 thì sẽ phát một dữ liệu lên LCD và đồng thời dữ liệu đó cũng được truyền trên I2C Bus tới Slave.Em chỉ mới biết C cho CCS ,còn non quá!Bác nào có thể chỉ giáo em giao tiếp pic 16f877a với bàn phím 4x4 đồng thời hiển thị LCD và truyền I2C như trên được ko ?Thanks các Pro!
dientubk3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2009, 02:30 PM   #6
thientaisodo
Đệ tử 4 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Tĩnh - Hà Nội
Bài gửi: 61
:
Send a message via Yahoo to thientaisodo
Các bạn cho mình hỏi địa chỉ để giao tiếp với ROM (vd:24c64) thì qui định thế nào. Tìm mãi chẳng có bài viết nào nhắc đến cả. Ở đây mình muốn kết nối I2C của 1PIC F877A(master), cùng một PIC 877A (slave) và một ROM 24C64.
Mong được chỉ giáo !
thientaisodo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2009, 05:47 PM   #7
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 thientaisodo View Post
Các bạn cho mình hỏi địa chỉ để giao tiếp với ROM (vd:24c64) thì qui định thế nào. Tìm mãi chẳng có bài viết nào nhắc đến cả. Ở đây mình muốn kết nối I2C của 1PIC F877A(master), cùng một PIC 877A (slave) và một ROM 24C64.
Mong được chỉ giáo !
Bạn tự quyết định địa chỉ của EEPROM bằng cách đặt trạng thái xác định cho các chân địa chỉ của nó (A0, A1, và A2). Địa chỉ của PIC slave cũng cần khác với địa chỉ của EEPROM.

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 18-02-2009, 09:58 AM   #8
thientaisodo
Đệ tử 4 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Tĩnh - Hà Nội
Bài gửi: 61
:
Send a message via Yahoo to thientaisodo
Cảm ơn bạn, mình đã hiểu rồi, vậy là địa chỉ của EEPROM sẽ được định nghĩa từ các chân trên nó và có 8 địa chỉ từ 00 - 07 đúng không bạn ?
thientaisodo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-02-2009, 03:52 PM   #9
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 thientaisodo View Post
Cảm ơn bạn, mình đã hiểu rồi, vậy là địa chỉ của EEPROM sẽ được định nghĩa từ các chân trên nó và có 8 địa chỉ từ 00 - 07 đúng không bạn ?
Đúng vậy.

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 22-04-2009, 12:50 PM   #10
haquang
Nhập môn đệ tử
 
Tham gia ngày: Sep 2006
Bài gửi: 3
:
Các anh cho em hỏi vấn đề về I2C cái: Em copy chương trình ở thread này và dùng giao tiếp 2 PIC thì có vấn đề như sau: Khi sử dụng để mô phỏng thì chạy bình thường như ý muốn nhưng khi chạy với mạch thật và thêm modul RS232 để đưa lên Terminal trên PC để check thì chỉ thấy có FF được gửi lên. Cao thủ nào từng gặp lỗi này thì gợi ý em cách debug cái many thanks!

Code: Master
Code:
[#include <16F877A.H>
#include <DEFS_16F877A.h>
#include <def_877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=20000000)
#define use_portd_lcd TRUE
#include <lcd.c>
#include <STDLIBM.H>
//#include <toanlcd.c>
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7)
int8 value_re;

unsigned char* data_in;
const int8 N = 20;
//========================================================
 void putch(unsigned char a)
{
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = a;
}
void write_I2C(unsigned char* digit,int8 slave_addr,int n)
{
int i;
i2c_start();
i2c_write(slave_addr);
for (i=0;i<N;i++)
i2c_write(digit[i]);
i2c_start();
i2c_write(slave_addr);
i2c_stop();
}
void read_I2C()
{
int i;
i2c_start();
i2c_write(0x11);
for (i=0;i<N;i++)
{
 value_re = i2c_read();
 data_in[i]=value_re;
}
i2c_start();
i2c_write(0x11);
i2c_stop();
}

void main()
{
int8 value_re=2;
int8 i=10;


char* DIGITS[N] ={ 		   0b11111111,
                           0b11111110,
                           0b11111100,
                           0b11111000,
                           0b11110000,
                           0b11100000,
                           0b10101010,
                           0b01010101,
                          };
const int8 slave_addr = 0x10;
set_tris_b(0x00);
putch('a');
data_in=malloc(50);
//write_I2C(DIGITS,0x10,8);

read_I2C();
for (i=0;i<N;i++)
{
output_b(data_in[i]);
putch(data_in[i]);
delay_ms(1000);
}

}]
Code slave:
Code:
:[#include <16F877A.H>
#include <STDLIBM.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(Clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
char* data;
int8 value = 0x01,valueh=0,valuel=0;
int8 state;
#INT_SSP
void i2c_isr()
{
state = i2c_isr_state();
if(state >=0x80)i2c_write(data[state-0x80]);
else if(state>0)data[state-1]=i2c_read();
}

void main()
{
const int N=20;
int i;
data=malloc(N);
for (i=0;i<N;i++)
data[i]=i;
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
set_tris_b(0x00);
while(1);
}]
thanks

thay đổi nội dung bởi: namqn, 22-04-2009 lúc 04:20 PM. Lý do: định dạng code
haquang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-04-2009, 12:59 AM   #11
nhoczin
Đệ tử 3 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 57
:
Giao tiếp I2C giữa 877a và 88

Em làm giao tiếp I2C giữa 877a ( master ) và 88 ( slave ) : 877a đếm từ 0 >> 255 hiển thị LCD và truyền giá trị đó tới 88, 88 nhận, nếu là chẵn thì rb0 = 1, nếu ko thì rb0 = 0, gặp phải vấn đề sau:

Khi truyền dữ liệu từ 877a đến 88 thì 88 không nhận được, cụ thể là 88 không nhảy vào ngắt, xung I2C vẫn truyền bình thường, khi mô phỏng thì 877a vẫn chạy bình thường, 88 không thấy thay đổi gì. Khi nạp vào mạch thật thì 877a không hoạt động được ( không thể đếm và hiển thị lên LCD ) 88 không thay đổi gì. Em đã kiểm tra nhưng chưa phát hiện được gì. Em hi vọng được sự trợ giúp của mọi người trong 4r.

Code 877a master
Code:
#include <16F877A.h>
#device *=16
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3,force_hw)
#include <def_877a.h>
#include <lcd_4bit.c>

void write_data(int8 n, int8 address)
{
   i2c_start();
   i2c_write(address);
   i2c_write(n);
   i2c_stop();
}

void main()
{
   int8 n = 0;
   trisd = 0x00;
   portd = 0x00;
   trisc = 0xff;
   lcd_init();
   lcd_clear();
   while(true)
   {
      lcd_int8(n,1,2);   // Hiển thị số n ra LCD tại cột 1 hàng 2
      write_data(n,1);
      delay_ms(100);
      n++;
   }
   

}
Code 88 ( slave )
Code:
#include <16F88.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled

#use delay(clock=20000000)
#use i2c(Slave,Fast,sda=PIN_B1,scl=PIN_B4,force_hw,address=0x01)
#include <def_88.h>

int8 value = 0, address;
int1 count = 0;

#int_SSP
void  SSP_isr(void) 
{
   int8 byte_in, state;
   state = i2c_isr_state();
   byte_in = i2c_read();
   if(state == 0)
      address = byte_in;
   else if(state < 0x80)
         value = byte_in;
   count++;                      // Nếu có vào ngắt thì biến count thay đổi và hiển thị trên RA0
}



void main()
{
   trisb0 = 0;
   trisa0 = 0;
   trisb1 = 1;
   trisb4 = 1;
   
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   
   while(true)
   {
      ra0 = count;
      if(value%2 == 0) rb0 =1;
      else rb0 = 0;
   }

}
Em hỏi việc sử dụng biến address, khai báo ở biến toàn cục là có tác dụng gì vậy, và cách gán nó bằng biến byte_in trong chương trình ngắt. Theo em hiểu là nó sẽ đọc địa chỉ khi con master gửi, nhưng em không thấy chỗ nào tương tác với biến address cả, chỉ thấy trên phần khai bảo của con slave có chỗ address.
Hình Kèm Theo
File Type: jpg i2c.JPG (147.7 KB, 33 lần tải)
nhoczin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-06-2009, 11:27 AM   #12
rien
Đệ tử 1 túi
 
Tham gia ngày: Sep 2008
Bài gửi: 13
:
Trích:
Nguyên văn bởi nhoczin View Post
Em làm giao tiếp I2C giữa 877a ( master ) và 88 ( slave ) : 877a đếm từ 0 >> 255 hiển thị LCD và truyền giá trị đó tới 88, 88 nhận, nếu là chẵn thì rb0 = 1, nếu ko thì rb0 = 0, gặp phải vấn đề sau:

Khi truyền dữ liệu từ 877a đến 88 thì 88 không nhận được, cụ thể là 88 không nhảy vào ngắt, xung I2C vẫn truyền bình thường, khi mô phỏng thì 877a vẫn chạy bình thường, 88 không thấy thay đổi gì. Khi nạp vào mạch thật thì 877a không hoạt động được ( không thể đếm và hiển thị lên LCD ) 88 không thay đổi gì. Em đã kiểm tra nhưng chưa phát hiện được gì. Em hi vọng được sự trợ giúp của mọi người trong 4r.
Bạn sửa địa chỉ của slave thành 0x10.
Nếu bạn đặt địa chỉ của slave là 0x01 thì khi mater ghi dữ liệu xuống slave, Slave sẽ hiểu nhầm là master cần đọc dữ liệu. Khi đó biến State >=0x80 và hàm ngắt của bạn không làm gì cả.
rien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-07-2009, 11:12 PM   #13
nguyenhung1811
Đệ tử 3 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 48
:
chuong trinh minh viet co j sai ko ha cac ban? sao minh viet mai ma` no' chi thuc hien duoc 1 lan ghi, sau cau lenh i2c_stop() thi no' khong the doc ghi duoc nua?
-----------------------------------------------------------------------------------
#include <16f877a.h>
#include <def_16f877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG,

NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use I2C(master,sda=PIN_C4,scl=PIN_C3) // dung i2c =

phan cung
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD

void write(int8 value, int8 add)
{
i2c_start();
i2c_write(0xD0);
i2c_write(add);
i2c_write(value);
i2c_stop();
delay_us(3);
}

int8 read(int8 add)
{
int8 value_re;
i2c_start();
i2c_write(0xD0);
i2c_write(add);
i2c_start();
i2c_write(0xD1);
value_re = i2c_read();
i2c_stop();
delay_us(3);
return(value_re);
}
void khoitao(){
i2c_start();
i2c_write(0xD0); //den dia chi

ds1307.
i2c_write(0x00); //den dia chi

thanh ghi 00H.
i2c_write(0x00); //s
i2c_write(0x00); //m
i2c_write(0x52); //h
i2c_write(0x02); //day
i2c_write(0x03); //date
i2c_write(0x04); //mth
i2c_write(0x05); //y
i2c_write(0x10); //tao xung vuong

1Hz.
i2c_stop();
delay_us(3);
}

int h,m,s,day,date,month,year,con;

void main()
{
int value;
set_tris_b(0x00);

write(0x90,0x07);// o day tao xung 1hz
delay_ms(2000); //
write(0x00,0x07);// ket thuc qua trinh tao xung. nhung mo phong thi no khong the tat chan SWQ duoc?????
}
-----------------------------------------------------------------------------
o tren, minh chi ghi duoc giu lieu duoc 1 lan, sau cau lenh i2c_stop() thi minh khong the dung cac ham write() va read() duoc, co' phai do chuong trinh dich bi loi hay sao? minh dung CCS 4.057.
nguyenhung1811 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-09-2009, 11:48 PM   #14
inventor_bk
Đệ tử 1 túi
 
Tham gia ngày: Mar 2008
Bài gửi: 15
:
Nhờ các anh chị giúp em này chút: Em định làm giao tiếp I2C giữa 2 Pic 18F4331, em tìm hiểu kĩ phần này, nhưng em vẫn thắc mắc 1 điều là địa chỉ slave, lấy từ đâu. Theo em biết địa chỉ slave là từ datasheet, mà em đọc mà chẳng biết con 18f4331 có địa chỉ bao nhiêu. Mà hầu hết các Pic em đều thấy lấy địa chỉ là 0x10. Vậy em có dùng lại địa chỉ này không. Cảm ơn các anh chị nhiều.
inventor_bk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-09-2009, 07:51 PM   #15
nhamdtk4
Đệ tử 3 túi
 
nhamdtk4's Avatar
 
Tham gia ngày: Feb 2009
Bài gửi: 47
:
Trích:
Nguyên văn bởi inventor_bk View Post
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ợ.
nhamdtk4 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bà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à 05:08 PM.


Đượ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