![]() |
|
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 |
![]() |
#181 |
Nhập môn đệ tử
Tham gia ngày: Oct 2010
Bài gửi: 8
: |
ko có bác nào giúp em ah. hix
|
![]() |
![]() |
![]() |
#182 | |
Nhập môn đệ tử
Tham gia ngày: Oct 2010
Bài gửi: 3
: |
Trích:
Theo em nghĩ thì đây là một chương trình con. ở trên bác dùng một biến: int16 read_I2C_2byte(int8 slave_address) nên ở dưới nó sẽ dùng biến này! VD như bác điều khiển DS1307 thì địa chỉ của nó là 0b1101000x. (0xD..) như vậy i2c_write(slave_address+1) sẽ là i2c_write(0xD1) ->> đọc thông tin từ DS1307 thân, |
|
![]() |
![]() |
![]() |
#183 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 3
: |
Mình mới học về giao tiếp I2C,mình viết code cho PIC6F877A và DS1307 hiển thị LCD.Mình không sử dụng các hàm có sẵn của CCS.Khi chạy thì nó không thoát ra được khỏi vòng lặp wait_ngắt,tức chờ cho cờ ngắt SSPIF = 1.Code của nó như sau,các bạn giúp mình nhé
#include<16f877a.h> #include<def_877.c> #include<LCD_mod.h> #use delay(clock = 20000000) void wait_ngat(void); unsigned char DECBCD2(unsigned char); void main() { unsigned char s,p,h,d,m,y; TRISB = 0x00; TRISD = 0x00; wrcmd(0x38); wrcmd(0x01); wrcmd(0x0e); SSPCON = 0x38; //ko truyen du lieu vao sspbuf khi che do truyen du lieu chua san sang //ko du lieu dc nhan vao sspbuf khi du lieu cu chua dc doc // cho phep cong giao tiep mssp // che do I2C master mode,cl SCL= Fosc/(4*(SSPADD+1) SSPADD = 0; INTCON7 = 1; //cho phep tat ca ngat INTCON6 = 1; //cho phep ngat ngoai vi PIE13 = 1; // cho phep ngat ssp // bat dau wa trinh truyen nhan du lieu TRISC3 = 0; // cac pin sda va scl TRISC4 = 0; PORTC3 = 1; PORTC4 = 1; SSPCON20 = 1; // sspcon2<0> = 1 thiet lap start wait_ngat(); SSPBUF = 11010000; // address and write PIR13 = 0; wait_ngat(); SSPBUF = 0; PIR13 = 0; wait_ngat(); SSPBUF = 0; PIR13 = 0; wait_ngat(); SSPBUF = 0; PIR13 = 0; wait_ngat(); SSPBUF = 0; PIR13 = 0; wait_ngat(); SSPBUF = 0x01; PIR13 = 0; wait_ngat(); SSPBUF = 0x01; PIR13 = 0; wait_ngat(); SSPBUF = 0x01; PIR13 = 0; wait_ngat(); SSPBUF = 0x11; PIR13 = 0; SSPCON22 = 1; wait_ngat(); PIR13 = 0; //................................ SSPCON20 = 1; wait_ngat(); SSPBUF = 11010000; PIR13 = 0; wait_ngat(); SSPBUF = 0; PIR13 = 0; wait_ngat(); SSPCON22 = 1; PIR13 = 0; wait_ngat(); PIR13 = 0; //..................................... TRISC3 = 1; TRISC4 = 1; SSPCON20 = 1; wait_ngat(); SSPBUF = 11010001; PIR13 = 0; wait_ngat(); PIR13 = 0; wait_ngat(); PIR13 = 0; wait_ngat(); s = SSPBUF; PIR13 = 0; wait_ngat(); PIR13 = 0; wait_ngat(); p = SSPBUF; PIR13 = 0; wait_ngat(); PIR13 = 0; wait_ngat(); h = SSPBUF; PIR13 = 0; wait_ngat(); PIR13 = 0; wait_ngat(); d = SSPBUF; PIR13 = 0; wait_ngat(); PIR13 = 0; wait_ngat(); m = SSPBUF; PIR13 = 0; wait_ngat(); PIR13 = 0; wait_ngat(); y = SSPBUF; PIR13 = 0; SSPCON22 = 1; wait_ngat(); PIR13 = 0; //........................... DECBCD2(s); DECBCD2(p); DECBCD2(h); DECBCD2(d); DECBCD2(m); DECBCD2(y); wrdata(s); wrdata(p); wrdata(h); wrdata(d); wrdata(m); wrdata(y); } //........................ void wait_ngat(void) { while(PIR13 == 0); } //........................ unsigned char DECBCD2(unsigned char BCD) { unsigned char L,H; L = BCD & 0x0f; H = (BCD>>4) *10; return(L+H); } |
![]() |
![]() |
![]() |
#184 |
Đệ tử 1 túi
Tham gia ngày: Nov 2010
Bài gửi: 17
: |
I2C...........slave->master
Đụng lại vấn đề cũ của mấy huynh
Em mô phỏng chuẩn I2C giữa 2 con 18f4431, tình hình là nó chạy rất tào lao( tại người làm chuối quá) Em gửi kèm file mô phỏng, mấy anh xem hộ cho thèn em với Cảm ơn mọi người |
![]() |
![]() |
![]() |
#185 |
Đệ tử 1 túi
Tham gia ngày: Nov 2010
Bài gửi: 17
: |
I2C----->>Master<==>Slave
Chào tất cả mọi nguời, sau 1 khi tìm hiểu về I2C để giải quyết vấn đề mình có đặt ra bên trên thì tạm thời mình mô phỏng được việc truyền nhận dữ liệu 2 chiều Master<==>Slave
Mọi nguời có hứng thì tham khảo và góp ý nhé P/S: 1) Cảm ơn anh Hoanf và tất cả mọi nguời đã đóng góp xây dựng thread này 2) Vấn đề mình thắc mắc ở trên thì vẫn chưa giải quyết ^^, tiếp tục help me nhé ![]() |
![]() |
![]() |
![]() |
#186 |
Nhập môn đệ tử
Tham gia ngày: Nov 2011
Bài gửi: 5
: |
các bác ơi, cho em hỏi chút, có phải I2C là nhất thiết phải dùng ngắt ko ạ?
ko biết là có bác nào từng nghiên cứu vấn đề này chưa, nhưng mình thấy là dùng lệnh while đi kèm lệnh điều kiện thì chức năng cũng có thể gần giống ngắt, ví dụ như chương trình này, (mình làm ko thành công, nên thuật giải cũng ko chắc chắn đúng) <code>//chuong trinh cho slave #include <16f877a.h> #include <def_877a.h> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock= 4000000) #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10) int8 data, state; #define slave 0x10 void main() { data=0; trisd=0; while(1) { state= i2c_isr_state(); switch (state) { case 0x80: { data++; if( data==255 ) { data= 0; } i2c_write(data); break; } case 0x81: i2c_write(slave); break; } portd= data; } }</code> |
![]() |
![]() |
![]() |
#187 |
Đệ tử 1 túi
Tham gia ngày: Nov 2010
Bài gửi: 17
: |
Chào bạn,
Thứ 1, bạn viết chương trình cho Slave mà sao hok có hàm nhận mà chỉ có hàm truyền ko vậy? Thứ 2, nếu bạn dùng ccs thì vào phần help để xem lại lệnh state=i2c_isr_state(); bạn xem thử giá trị state bằng bao nhiêu thì gửi, bao nhiêu thì nhận. Thứ 3, nếu con vđk của bạn còn làm việc khác nữa thì nên xem lặp cách dùng vòng lặp thế này. Chúc bạn thành công. |
![]() |
![]() |
![]() |
#188 |
Nhập môn đệ tử
Tham gia ngày: Nov 2011
Bài gửi: 5
: |
cảm ơn bạn, đây là code con master, cái này thực ra ko phải mình viết
<code> // chuong trinh cho master #include <16f877a.h> #include <def_877a.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock= 4000000) #use i2c(master, SDA=PIN_C4, SCL=PIN_C3) int8 data, bo, i; #define slave 0x10 void doc_i2c() { i= 0; while( i!=2) { i++; i2c_start(); i2c_write( slave+1); //nhan du lieu tu Slave switch ( i) { case 1: data= i2c_read( 1); break; case 2: bo= i2c_read( 0); break; } } } void main() { trisd= 0; portd= 0; while(true) { doc_i2c(); portd= data; delay_ms( 100); } } </code> =============================================== còn đây là code cho Slave nguyên mẫu, code slave bên trên do mình chỉnh sửa từ đây <code> // chuong trinh cho master #include <16f877a.h> #include <def_877a.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock= 4000000) #use i2c(master, SDA=PIN_C4, SCL=PIN_C3) int8 data, bo, i; #define slave 0x10 void doc_i2c() { i= 0; while( i!=2) { i++; i2c_start(); i2c_write( slave+1); //nhan du lieu tu Slave switch ( i) { case 1: data= i2c_read( 1); break; case 2: bo= i2c_read( 0); break; } } } void main() { trisd= 0; portd= 0; while(true) { doc_i2c(); portd= data; delay_ms( 100); } } </code> |
![]() |
![]() |
![]() |
#189 |
Nhập môn đệ tử
Tham gia ngày: Jul 2011
Bài gửi: 1
: |
Có bạn nào truyền giữa 1 master với nhiều slave chưa? Không hiểu sao không đúng địa chỉ mà của mình mà slave vần nhảy vào ngắt nhận và đọc giá trị từ buffer về.
Mình truyền cho 5 con slave thì cả 5 lần cả 5 con đều nhảy vào ngắt nhận. Không hiểu tại sao nữa. |
![]() |
![]() |
![]() |
#190 |
Nhập môn đệ tử
Tham gia ngày: Jun 2010
Nơi Cư Ngụ: da nang
Bài gửi: 1
: |
Cần anh chị giúp I2C
Em mới chập chững học i2c nên còn nhiều thắc mắc và nhiều chỗ không hiểu ,anh chị cho em hỏi giả sử bên slave của em có một biến đếm n,cứ sau 1 giây thì n++;bây h em mún gởi giá trị của n qua máter thì code ở mater và slave sẽ được viết như thế nào ạ?
Mong anh chị giúp dỡ ,xin cảm ơn! |
![]() |
![]() |
![]() |
#191 |
Nhập môn đệ tử
Tham gia ngày: Mar 2012
Bài gửi: 2
: |
các anh ơi. e mới học pic. giờ đang phải làm giao tiếp giữa pic và eeprom(truyền dữ liệu cho eeprom) và giao tiếp với ds1307. e kô biết phải làm sao. mong các anh giúp đỡ
|
![]() |
![]() |
![]() |
#192 |
Nhập môn đệ tử
Tham gia ngày: Oct 2010
Bài gửi: 6
: |
có bạn nào làm 1 pic master điều khiển 3 pic slave để điều khiển 12 động cơ step chưa (1pic 4 stepmotor), chia sẽ mình với.
|
![]() |
![]() |
![]() |
#193 |
Nhập môn đệ tử
Tham gia ngày: Mar 2012
Bài gửi: 5
: |
giao tiếp với eeprom ngoài(24c64)
Help!
Các anh(chị) ơi help me em với! Em có nhận bài tập của ông thầy với nội dung đề ra: Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ: Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng) Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok” + nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai” Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)? Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi! Em thank trước nha!!!!!!!!!!!! |
![]() |
![]() |
![]() |
#194 |
Nhập môn đệ tử
Tham gia ngày: Mar 2012
Bài gửi: 5
: |
giaotiếp với eeprom ngoài(24c64)
Help!
Các anh(chị) ơi help me em với! Em có nhận bài tập của ông thầy với nội dung đề ra: Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ: Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng) Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok” + nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai” Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)? Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi! Em thank trước nha!!!!!!!!!!!! mail của em nề: vanquyen1690@gmail.com |
![]() |
![]() |
![]() |
#195 |
Nhập môn đệ tử
Tham gia ngày: Mar 2012
Bài gửi: 5
: |
![]() Help!
Các anh(chị) ơi help me em với! Em có nhận bài tập của ông thầy với nội dung đề ra: Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ: Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng) Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok” + nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai” Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)? Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi! Em thank trước nha!!!!!!!!!!!! mail của em nề: vanquyen1690@gmail.com thay đổi nội dung bởi: quyen bk, 20-05-2012 lúc 11:22 AM. Lý do: thiếu phần file đính kèm |
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|