![]() |
|
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 |
![]() |
#121 |
Nhập môn đệ tử
Tham gia ngày: Apr 2008
Bài gửi: 4
: |
chuong trinh ban lam minh co thu ma sao khi chi can nhan rb3 den rb7 deu xay ra ngat dong loat ma minh nho rb3 dau co ngat dau ma sao no cung thanh ngat luon la sao
va khi vao ngat no thuc hien tat ca cac ngat tu rb4 den rb7 khong chua cai nao roi thoat khoi ngat la sao vay?? mong ban giai thich dieu vo ly do. ct của Master: Code:
#include <16f877a.h> #include <def_877a.h> #use delay(clock = 20000000) #fuses HS, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOPROTECT #use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, force_hw) const unsigned int8 dulieu[]={1,2,4,8,16,32,64,128}; const unsigned int8 address_slave[]={0,0x10,0x20,0x30,0x40}; int8 a,i,kytu; void ghi(int8 address,int8 data) { i2c_start(); i2c_write(address); i2c_write(data); i2c_stop(); } #INT_RB void ngat_RB() { if((RBIF)&&(RBIE)) { if(RB4==0) { a=1; i=0; } else if(RB5==0) { a=2; i=0; } else if(RB6==0) { a=3; i=0; } else if(RB7==0) { a=4; i=0; } } RBIF=0; } void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_RB); set_tris_d(0); portd=0; while(TRUE) { kytu=a; delay_ms(100); while(kytu==a) { if(a!=0) { delay_ms(50); ghi(address_slave[a],dulieu[i]); i++; if(i==8) { i=0; } } } } } Code:
#include <16f877a.h> #include <def_877a.h> #use delay(clock = 20000000) #fuses HS, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOPROTECT #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw) int8 dulieu; #INT_SSP void ngat_i2c() { int8 state; state = i2c_isr_state(); if(state < 0x80) { dulieu = i2c_read(); portd = dulieu; delay_ms(50); } } void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_SSP); set_tris_d(0); while(TRUE) { portd = 0; } } Em muốn post sơ đồ mạch lên mà không biết chèn code như thế nào, mong Admin chỉ giùm em cách tải file từ máy...[/QUOTE] |
![]() |
![]() |
![]() |
#122 | |
Trưởng lão PIC bang
|
Trích:
http://www.picvietnam.com/forum/showthread.php?t=3289 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 |
|
![]() |
![]() |
![]() |
#123 |
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 5
: |
lạ
mình làm mạch i2c 1 master+4slaver đều là 16f877a điều khiển 20động cơ bước 2 tuần trước mạch chạy ngon lành lun nạp xuống là chạy!!!!!!
nhưng sau 2tuần không động tới mạch thì hữi ui mạch không chạy lun vẫn mạch đó chương trình đó không đổi 1 cái gì vậy mà không chạy nhục wá bó tay h không bít sao nữa tháng 3 báo cáo đề tài rùi mà không có cái mạch đó cắhc nhảy lầu |
![]() |
![]() |
![]() |
#124 |
Đệ 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 ! |
![]() |
![]() |
![]() |
#125 | |
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 |
|
![]() |
![]() |
![]() |
#126 |
Đệ 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 ?
![]() |
![]() |
![]() |
![]() |
#127 | |
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 |
|
![]() |
![]() |
![]() |
#128 |
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
![]() 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 |
![]() |
![]() |
![]() |
#129 |
Đệ 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; } } |
![]() |
![]() |
![]() |
#130 | |
Đệ tử 1 túi
Tham gia ngày: Sep 2008
Bài gửi: 13
: |
Trích:
Code:
void read_I2C() { int i; i2c_start(); i2c_write(0x11); for (i=0;i<N-1;i++) { value_re = i2c_read(1); data_in[i]=value_re; } value_re = i2c_read(0); data_in[N-1]=value_re; i2c_stop(); } thay đổi nội dung bởi: rien, 23-06-2009 lúc 11:20 AM. |
|
![]() |
![]() |
![]() |
#131 | |
Đệ 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ả. |
|
![]() |
![]() |
![]() |
#132 | |
Đệ tử 4 túi
Tham gia ngày: May 2009
Bài gửi: 74
: |
I2C gặp vấn đề!
Trích:
- khi mater muốn truyền data thì cần phải làm gì? - khi master muốn nhận thì phải làm gì? - khi master đang truyền mà muồn dừng lại để nhận thì làm thế nào? thanks! |
|
![]() |
![]() |
![]() |
#133 |
Đệ 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. |
![]() |
![]() |
![]() |
#134 |
Đệ 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.
|
![]() |
![]() |
![]() |
#135 |
Đệ tử 1 túi
Tham gia ngày: Mar 2008
Bài gửi: 15
: |
Trang này bị khóa rồi mà em không biết, xin lỗi
|
![]() |
![]() |
![]() |
|
|