PIC Vietnam

Go Back   PIC Vietnam > Các Đề Tài > Các dự án mã nguồn mở

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

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
Prev Previous Post   Next Post Next
Old 19-01-2014, 01:34 AM   #1
caddish12
Đệ tử 1 túi
 
caddish12's Avatar
 
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
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ó ), 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é

Để đ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!
File Kèm Theo
File Type: rar PIC16F887 DS2413 Multiple Device[OK].rar (1.47 MB, 176 lần tải)
__________________
Thanh Nguyen,
International University, VNU
caddish12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Ðiều Chỉnh
Xếp Bài

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:33 AM.


Đượ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