|
Tài trợ cho PIC Vietnam |
Các dự án mã nguồn mở Nếu bạn không mở mã nguồn, ít nhất là một phần nào đó trong dự án của bạn, xin đừng vào đây. |
|
Ðiều Chỉnh | Xếp Bài |
19-01-2014, 01:34 AM | #1 |
Đệ tử 1 túi
Tham gia ngày: Apr 2010
Bài gửi: 25
: |
Giao Tiếp 1 dây (1-Wire) Dùng PIC16F887 và DS2413
Chào mọi người! Giao tiếp 1 dây với MCU (1-wire) hiện đang được dùng với nhiều thiết bị, đặc biệt là của maxim (chuẩn này do maxim giới thiệu nhé): DS18B20 dùng để đo nhiệt độ, DS2413 switch định địa chỉ... Hôm trước tình cờ cần làm con DS2413 nên có ngâm cứu lại cái này 1 chút, nhưng khi khi ở chế độ multiple devices thì hơi khó chịu vì tìm hoài không thấy code trên mạng. Nên mình xin chia sẻ thư viện này mình viết lại dựa trên nhiều nguồn trên internet (onewire.c, onewire.h) Code này hoàn toàn chạy với các dòng 1-wire của maxim Project này cơ bản là dùng 1 chân của PIC16F887 để điều khiển từng LED riêng biệt thông qua các nút nhấn. File download sẽ bao gồm: - File mô phỏng bằng Proteus - Thư Viện 1-Wire - Code cho DS2413 Những hàm trong thư viện 1-wire: Code:
unsigned char OneWire_Reset(); // Reset void OneWire_WriteBit(char b); // ghi 1 bit dữ liệu void OneWire_WriteByte(char data); // ghi 1 byte dữ liệu unsigned char OneWire_ReadBit(void); //đọc 1 bit dữ liệu char OneWire_FindFirstDevice(); //Tìm thiết bị đầu tiên char OneWire_FindNextDevice(); //tìm thiết bị tiếp theo trên đường truyền int OneWire_ReadByte(); //Đọc 1 byte dữ liệu char OneWire_FindAllDevice(); //Tìm tất cả các thiết bị trên đường truyền void OneWire_PrintAllDeviceROM(void); // Xuất ra thông tin về ROM của tất cả các thiết bị void OneWire_MatchROM(char data[][8],char x); //match ROM of device x Code:
// @Function: Define IO for One-Wire Devices #define TDQ TRISC0 #define DQ RC0 (cho phép mình k dịch ra tiếng việt nhé :O ) Code:
// @Function: Specific define ROM Command for DS2413 #define READ_ROM 0x33 #define RESUME 0xA5 #define OVER_SKIP 0x3C #define OVER_MATCH 0x69 #define READ_CFRM 0xAA //Read confirm status #define PIO_READ 0xF5 //PIO access READ #define PIO_WRITE 0x5A //PIO access WRITE Đầu tiên phải ghi dữ liệu ở chế độ đảo (1st complement) rồi mới ghi dữ liệu mình cần vào (thực chất thì nó hiều dữ liệu mình cần ghi là dữ liệu đảo của nó ), Nên mình dùng lệnh viết đầu tiên là 0xff-data. và phải theo đúng thứ tự thế này nó mới hoạt động nhé: Code:
OneWire_MatchROM(FoundROM,DS); //Match with specific device OneWire_WriteByte(PIO_WRITE); //PIO write access mode OneWire_WriteByte(0xFF-data); //write invert data OneWire_WriteByte(data); //write data OneWire_ReadByte(0xAA); //read confirm status Để điều khiển nhiều thiết bị thì đầu tiên ta phải tìm device đầu tiên, rồi tiếp theo...đến khi không còn device nào nữa thì hàm sẽ trả về giá trị báo lỗi, trong quá trình tìm thì địa chỉ ROM của device sẽ được lưu vào mảng 2 chiều FoundROM[MaxDevice][DataofDevice=8] ROM của 1 device 1-wire là 64bit = 8 bytes nên DataofDevice sẽ là 8, còn MaxDevice sẽ tùy thuộc vào số lượng device trên đường truyền và quan trọng nhất là phụ thuộc vào ram của MCU, ở đây mình dùng PIC16F887 nên mình khai báo 8 devices thôi, khai báo ở define sau: Code:
#define ONEWIRE_DEVICE_ADDRESS_LENGTH 8 Chúc vui!
__________________
Thanh Nguyen, International University, VNU |
|
|