![]() |
|
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 | |
|
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? |
|
|
|
|
|
|
#2 |
|
Đệ 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é
|
|
|
|
|
|
#3 |
|
Đệ 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 |
|
|
|
|
|
#4 | |
|
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Trích:
![]() |
|
|
|
|
|
|
#5 |
|
Đệ 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! |
|
|
|
|
|
#6 |
|
Đệ 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 ! |
|
|
|
|
|
#7 | |
|
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 |
|
|
|
|
|
|
#8 |
|
Đệ 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 ?
![]() |
|
|
|
|
|
#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 |
|
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 |
|
|
|
|
|
#11 |
|
Đệ 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;
}
}
|
|
|
|
|
|
#12 | |
|
Đệ 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ả. |
|
|
|
|
|
|
#13 |
|
Đệ 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. |
|
|
|
|
|
#14 |
|
Đệ 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.
|
|
|
|
|
|
#15 |
|
Đệ tử 3 túi
Tham gia ngày: Feb 2009
Bài gửi: 47
: |
|
|
|
|
![]() |
| Ðiều Chỉnh | |
| Xếp Bài | |
|
|