PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các dự án mã nguồn mở (http://www.picvietnam.com/forum/forumdisplay.php?f=73)
-   -   Giao Tiếp 1 dây (1-Wire) Dùng PIC16F887 và DS2413 (http://www.picvietnam.com/forum/showthread.php?t=33308)

caddish12 19-01-2014 01:34 AM

Giao Tiếp 1 dây (1-Wire) Dùng PIC16F887 và DS2413
 
1 Attachment(s)
http://i1142.photobucket.com/albums/...ps6af8c7b5.png

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

Các bạn chú ý khai báo chân MCU cho thư viện 1-wire nhé:
Code:

// @Function: Define IO for One-Wire Devices
#define TDQ TRISC0
#define DQ        RC0

Với mỗi device khác nhau của maxim, các bạn tìm đọc datasheet để biết các thanh ghi điều khiển hoạt động, ví dụ như con DS2413 này thì các thanh ghi điều khiển thế này:
(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

Một điều các bạn nên để ý ở con DS2413 này là cách để điều khiên IO của nó,
Đầ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ó :D), 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

Code cho DS2314 mình chỉ viết có hàm ghi thôi, còn hàm đọc các bạn tự phát triển nhé :D

Để đ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
Vậy là sau khi dùng hàm OneWire_FindAllDevice() thì ta đã có địa chỉ cụ thể của từng device, việc còn lại phải làm đơn giản chỉ là gửi đi đúng địa chỉ ROM đó thì ta sẽ điều khiển dc thiết bị tương ứng, device khác sẽ chỉ hoạt động sau khi ta tạo 1 lệnh reset thôi nhé.

Chúc vui!


Múi giờ GMT. Hiện tại là 12:33 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam