![]() |
|
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
: |
i2c
chào các bác mình đang làm giao tiếp i2c với 24c64.
mình coppy trong file hell của ccs ra và chạy thử cho 1 byte. khi hàm ghi và đọc được dùng ở ngoài vòng lặp white() thì chương trình đọc đúng giá trị ghi vào. nhưng khi bỏ hàm ghi và đọc và vòng lặp white() thì chương trình chỉ đọc đúng lần đầu tiên. khi lặp lại vòng lặp thì bị sai. hoặc nếu ghi và đọc nhiều lần cho từng byte thì data dọc ra cũng bị sai. mình không rỏ vì sao mong các bạn chỉ giúp. #include<18f4680.h> #fuses NOLVP,NOWDT,PUT,hs,NOPROTECT,NOBROWNOUT #device 18f4680*=16 ADC=10 // high_ints=true #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #use fast_io(c) #use fast_io(d) #use fast_io(e) int k; //////////////////////////////////////////////////////////////////////// #ifndef EEPROM_SDA #define EEPROM_SDA PIN_b1 //b1 #define EEPROM_SCL PIN_b0//b0 #endif #use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL) #define EEPROM_ADDRESS long int #define EEPROM_SIZE 8192 void init_ext_eeprom() { output_FLOAT(EEPROM_SCL); output_FLOAT(EEPROM_SDA); } void write_ext_eeprom(long int address, BYTE data) { short int status; i2c_start(); i2c_write(0xa0); i2c_write((address>>8)&0x1f); i2c_write(address); i2c_write(data); i2c_stop(); status=i2c_write(0xa0); while(status==1) { i2c_start(); status=i2c_write(0xa0); } } BYTE read_ext_eeprom(long int address) { BYTE data; i2c_start(); i2c_write(0xa0); i2c_write((address>>8)&0x1f); i2c_write(address); i2c_start(); i2c_write(0xa1); data=i2c_read(0); i2c_stop(); output_d(data); return(data); } void main() { set_tris_A(0x00); set_tris_b(0x00); set_tris_C(0x00); set_tris_D(0x00); set_tris_E(0x00); ///////////////////////// write_ext_eeprom(10,8); read_ext_eeprom(10); while(1) { delay_ms(1000); } } ///////////////////////////////////////////////// nếu bỏ các hàm vào vòng lặp thì chỉ chạy đúng lần đầu tiên. các lần còn lại là sai while(1) { write_ext_eeprom(10,8); read_ext_eeprom(10); delay_ms(1000); } ////////////////////////////// ghi và đọc nhiều lần cũng bị sai data while(1) { write_ext_eeprom(10,8); read_ext_eeprom(10); delay_ms(1000); write_ext_eeprom(12,6); read_ext_eeprom(12); delay_ms(1000); } |
|
|
|
|
|
#2 |
|
Đệ tử 3 túi
Tham gia ngày: Aug 2008
Bài gửi: 53
: |
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
|
|
|
|
|
|
#3 | |
|
PIC Bang chủ
|
Trích:
Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
|
|
#4 |
|
Đệ tử 3 túi
Tham gia ngày: Aug 2008
Bài gửi: 53
: |
Xin lỗi anh em vi minh post hơi chậm.Mong mọi người đóng góp ý kiến nhé
|
|
|
|
|
|
#5 |
|
Đệ tử 3 túi
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 |
|
|
|
|
|
#6 | |
|
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Trích:
![]() |
|
|
|
|
|
|
#7 |
|
Đệ 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! |
|
|
|
|
|
#8 |
|
Đệ tử 4 túi
|
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 ! |
|
|
|
|
|
#9 | |
|
Trưởng lão PIC bang
|
Trích:
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 |
|
|
|
|
|
|
#10 |
|
Đệ tử 4 túi
|
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 ?
![]() |
|
|
|
|
|
#11 | |
|
Trưởng lão PIC bang
|
Trích:
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 |
|
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:
:[#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);
}]
thay đổi nội dung bởi: namqn, 22-04-2009 lúc 04:20 PM. Lý do: định dạng code |
|
|
|
|
|
#13 |
|
Đệ 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:
#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;
}
}
|
|
|
|
|
|
#14 | |
|
Đệ tử 1 túi
Tham gia ngày: Sep 2008
Bài gửi: 13
: |
Trích:
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ả. |
|
|
|
|
|
|
#15 |
|
Đệ 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. |
|
|
|
![]() |
| Ðiều Chỉnh | |
| Xếp Bài | |
|
|