![]() |
|
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 |
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> |
![]() |
![]() |
![]() |
#2 |
Đệ 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. |
![]() |
![]() |
![]() |
#3 |
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> |
![]() |
![]() |
![]() |
#4 |
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. |
![]() |
![]() |
![]() |
#5 |
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 đỡ
|
![]() |
![]() |
![]() |
#6 |
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.
|
![]() |
![]() |
![]() |
#7 |
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!!!!!!!!!!!! |
![]() |
![]() |
![]() |
#8 |
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 |
![]() |
![]() |
![]() |
#9 |
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 |
![]() |
![]() |
![]() |
#10 |
Đệ tử 5 túi
Tham gia ngày: Sep 2010
Bài gửi: 107
: |
Có ai viết vòng lặp đọc dữ liệu 2 Slave về Master chạy ok rồi không ạ ? Cho mình tham khảo với
|
![]() |
![]() |
![]() |
#11 |
Nhập môn đệ tử
Tham gia ngày: Mar 2012
Bài gửi: 3
: |
Mấy anh ơi, cho em hỏi: Chương trình của em tự viết không nói. em đưa y nguyên ct của đồng chí hoanf vào CCS 4.038 rùi mà PIN RC3 và RC4 cứ nhấp nháy hoài. master không nhận được dữ liệu từ slave. Mong các bác sớm chỉ rõ cho e. (nói thật vì cái đồ án, e mất ngủ cả đêm nay rùi mà vẫn chưa tìm ra lỗi tại sao. Có khi viết lại toàn bộ asm mà cũng chung một kết quả _ thi thoảng truyền được địa chỉ nhận về được ack nhưng đến lượt đọc thì im lim)
đây là code của master: #include <16F877A.H> #fuses XT,NOWDT,NOPROTECT,NOLVP #use Delay(Clock=4000000) #define SLAVE_ADDRESS 0x10 #use i2c(master, sda=PIN_C4, scl=PIN_C3) BOOLEAN ext_eeprom_ready() { int1 ack; i2c_start(); ack = i2c_write(SLAVE_ADDRESS); i2c_stop(); return !ack; } //********************************************** int8 read_I2C() { int8 value; while(!ext_eeprom_ready()); // code thêm vào i2c_start(); i2c_write(SLAVE_ADDRESS + 1); value = i2c_read(); i2c_stop(); return (value); } void main() { int8 value; value = 0x00; set_tris_b(0x00); while(1){ value = read_I2C(); output_b(value); //LCD_gotoxy(1,1); //printf(LCD_putc,"gtri: %3u",value); delay_ms(500); } } đây là code của slave: #include <16F877A.H> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(Clock=4000000) #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10) int8 value = 0x01; #INT_SSP void i2c_isr() { int8 state; int8 address; state = i2c_isr_state(); if(state >= 0x80){ i2c_write(value); //value; } } void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_SSP); set_tris_b(0x00); while(1){ output_b(value); } } NÓ không chạy, em bắt đầu tin vào ma quỷ rùi đây. Sao máy các anh chạy máy em lại không? hay tại trình biên dịch nhỉ. |
![]() |
![]() |
![]() |
#12 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Bạn kiểm tra xem 2 con điện trở kéo lên của các chân SDA , SCL có bị lỏng không
|
![]() |
![]() |
![]() |
#13 |
Nhập môn đệ tử
Tham gia ngày: Mar 2012
Bài gửi: 3
: |
Em đang mô phỏng bằng protues thôi anh ah. Có tin được thằng PROTUES k anh nhị.
|
![]() |
![]() |
![]() |
#14 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
|
![]() |
![]() |
![]() |
#15 |
Nhập môn đệ tử
Tham gia ngày: Mar 2012
Bài gửi: 3
: |
thanks u ! ko mô phỏng trên phần mềm dùng phần cứng thì hơi đau phần cứng do các lỗi.
![]() |
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|