PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 15-06-2008, 05:10 PM   #11
cuong86vt
Đệ tử 1 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 22
:
Trích:
Nguyên văn bởi toanck86 View Post
Chào mọi người!
Cho mình hỏi về ví dụ của bạn Hoanf (ví dụ có kèm hình sơ đồ nguyên lý), mình mô phỏng bằng protues thì chạy đúng như yêu cầu bài toán, nhưng lắp mạch thật thì không chạy được. Có cẩn phải chú ý gì từ sơ đồ đó không!
Thằng Toàn làm được mạch I2C chạy ngon lành luôn rồi cũng không thèm Post lên diễn đàn cho mọi người cùng học hỏi gì cả ! Đề nghị Admin tước level "1 túi" của nó !

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;
                           }
                     }
               }            
           
         }
   }
ct của 4 Slave, chỉ khác nhau 4 address:
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;
         }
   }
Mạch mình chạy mô phỏng bằng Proteus thấy có đặc điểm: nếu chỉ nối 1 M và 1 S thì quét led đúng thời gian delay 50ms, còn nối 4 S vào thì dường như led quét rất chậm không đúng 50 ms nữa, nhưng mình nghĩ Proteus chỉ mô phỏng thời gian thực, còn nếu là phần cứng thật thì sẽ chạy đúng yêu cầu như trong code...

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...
Hình Kèm Theo
File Type: jpg MACH_I2C_PROTEUS.JPG (166.9 KB, 203 lần tải)

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
cuong86vt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 04:24 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam