|
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 |
15-06-2008, 05:10 PM | #11 | |
Đệ tử 1 túi
Tham gia ngày: Jul 2007
Bài gửi: 22
: |
Trích:
PICVIETNAM tròn 1 tuổi ! Mình mới viết xong một chương trình I2C dùng 1 Master điều khiển mạng 4 Slave bằng 4 nút ngắt RB, tất cả đều dùng 16f877a, mình xin post lên đây mong các bạn góp ý. Phần cứng: 4 nút nhấn ngắt ngoài rb4 -> rb7 dùng để điều khiển 4 Slave, nhấn nút nào thì Master gọi Slave đó chạy ct Master gửi xuống, còn các Slave khác "ngồi chơi". 2 chân SDA và SCL của các VDK nối nhau kéo lên 4k7, PORTD của 4 Slave quét 8 led... Phần mềm: 4 Slave có địa chỉ lần lượt là 0x10, 0x20, 0x30, 0x40 nên chương trình của 4 Slave hoàn toàn như nhau, chỉ khác cái khai báo ban đầu address là 4 địa chỉ trên. 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... thay đổi nội dung bởi: namqn, 15-06-2008 lúc 07:11 PM. Lý do: xóa thông tin không cần thiết |
|
|
|