Driver UART + bài tập kết hợp I2C, DS1307

Manhdd

Cố Vấn CLB
Staff member
Đây là bài tập trong chương trình học của lớp C5, được chuyển sang mục "Chương trình học và tài liệu" vì có nhiều trao đổi hữu ích.

Qua buổi học thứ bảy tuần rồi, các bạn đã học qua bài I2C. Mọi hướng dẫn liên quan đến chủ đề này, các bạn có thể tìm trong TUT I2C và các link được dẫn trong TUT.

Bài giảng trong clip, các bạn download tại:
Code:
http://www.mediafire.com/?7g4wbp9aamz0d2l
Để giao tiếp với DS1307, các bạn cần phải xem qua datasheet của nó. Datasheet đã dịch có tại:
HTML:
http://www.payitforward.edu.vn/forum/threads/15/
Dù sao, mình cũng khuyên các bạn tự download bản tiếng Anh nhé ;)

Sample code quá trình ghi:
Code:
void clock_write()
{
    /// Input data:
    sec =  0x00    ; // CH=0 (bit7, clock-counting) ; seconds = 00
    min =  0x00    ; // minutes = 00
    hour =  0x15    ; // hour-mode (bit 6) = 0 -> 24-hour ; hours = 10
    day =  0x03    ; // day = tuesday; define sunday = 0x00 or 0x01
    date =  0x20    ; // date = 20
    month = 0x03    ; // month = 03
    year =  0x12    ; // year = 2012
    ///..
 
    /// Writing..
    //Send Start condition
    i2c_start();
    //Send Slave address + WRITE command
    i2c_write((SLAVE_ADD<<1)|WRITE);
    //  ((SLAVE_ADD<<1)| WRITE) = ((0x68<<1)|0) = 0xD0
    //Send register address (register of Slave – the first register need to read data)
    i2c_write(0x00);
 
    //write data
    i2c_write(sec); // write to 0x00
    i2c_write(min); // write to 0x01
    i2c_write(hour); // write to 0x02
    i2c_write(day); // write to 0x03
    i2c_write(date); // write to 0x04
    i2c_write(month); // write to 0x05
    i2c_write(year); // write to 0x06
 
    //Send Stop condition
    i2c_stop();
    ///..
}
Sample code quá trình đọc:
Code:
void clock_read()
{
    //Send Start condition
    i2c_start();
    //Send Slave address + WRITE command
    i2c_write((SLAVE_ADD<<1)|WRITE);
    //  ((SLAVE_ADD<<1)| WRITE) = ((0x68<<1)|0) = 0xD0
    //Send register address (register of Slave – the first register need to read data)
    i2c_write(0x00);
 
    //ReStart condition
    i2c_stop();
    i2c_start();
 
    //Send Slave address + READ command
    i2c_write((SLAVE_ADD<<1)|READ);
    // ((SLAVE_ADD<<1)| READ) = ((0x68<<1)|1) = 0xD1
 
    //read data
    sec = i2c_read(0); //read from 0x00 & ACK
    min = i2c_read(0); //read from 0x01 & ACK
    hour = i2c_read(0); //read from 0x02 & ACK
    day = i2c_read(0); //read from 0x03 & ACK
    date = i2c_read(0); //read from 0x04 & ACK
    month = i2c_read(0); //read from 0x05 & ACK
    year = i2c_read(1); //read from 0x06 & NACK
 
    //Send Stop condition
    i2c_stop();
}
Bài tập cho các bạn:
1. Giao tiếp với DS1307, ghi và đọc và hiển thị thời giac thực lên LCD.
2. Sử dụng Module còn lại của mạch I2C&TRIAC, thực hành kích Triac và đóng cắt tải AC. Có thể kết hợp đóng cắt có hẹn giờ với giờ đọc được từ DS1307. Báo tình trạng tải qua Led hoặc LCD. Các bạn chỉ cần cho chân điều khiển lên 1 là kích được Triac. Xem kĩ schematic để biết chỗ cắm VCC, GND, chân điều khiển, chỗ vào ra của dây nối tải AC.
Note: Các bạn cần cẩn thận khi làm việc trực tiếp với điện AC 220V nha.
3. Bài này nhằm tận dụng thời gian nghỉ khá dài của các bạn ;) (nghe đồn thi một mạch xong nghỉ mà :)) ) . Chúng ta sẽ làm luôn phần UART: sử dụng Terminal làm giao diện trên máy tính, ghi và đọc thời gian từ DS1307 thông qua PIC .

Phần code của UART khá đơn giản, các bạn download 2 file uart.c uart.h đính kèm. Việc giao tiếp với máy tính được thực hiện qua các hàm:
Code:
void uart_init();
void uart_putc(char c);
void uart_puts(const char *s);
char uart_getc(); // Get 1 char from RX, result stored as function's name
void uart_gets(char *s); // Get string from RX
Các hàm này tương tự LCD, chắc cũng không cần giải thích thêm nhé :D

Như vậy, phần code UART không khó, cái khó chính là mạch phần cứng giao tiếp. Các bạn đọc kĩ bài này nhé:
http://www.payitforward.edu.vn/forum/threads/49/
Có nhiều giải pháp cho các bạn, mình đề xuất là nếu dùng PL2303 thì tự làm mạch, nếu dùng FT232 thì đi mua cho khỏe nhé.

Có mạch rồi, kết nối như thế nào thì còn tùy phần cứng của bạn. Phía PIC thì cần 2 chân TX (C6), RX (C7) (main có module UART đó), qua mạch giao tiếp vào máy tính. Máy tính sẽ nhận mạch giao tiếp của bạn như một cổng COM, các bạn vào Run >> devmgmt.msc để biết là COM số mấy (cắm vô rút ra là biết). Nhớ cài driver cho chip giao tiếp nhé :D

Phía máy tính, ta dùng Terminal để giao tiếp. Bản mới nhất, các bạn có thể tìm ở:
Code:
http://www.virtualserialport.com/products/serial-port-terminal/
Hoặc download bản cũ mình đang dùng:
Code:
http://www.mediafire.com/?xd6gnf15b7765ox
Thiết đặt cho Terminal (phù hợp với uart.h & uart.c) như sau:
Code:
Port: COMx // xem trong [I]Run >> devmgmt.msc[/I]
Baudrate: 19200
Data bits: 8
Parity: None
Stopbits: 1
Flow control: None
Rồi, kết thúc "hướng dẫn BT3" :p . Các bạn làm bài, xong thì nén hết folder projects lại rồi nộp tới email: pif.picc5@gmail.com với cú pháp sau ở chủ đề thư:
[C5] [BT10] [N.] _Họ tên_ ...​
Nhớ đổi N. thành N1, N2, N3 ,... .Giữ nhóm như cũng nhé :o

À, xin nhắc lại, lớp mình vẫn điểm danh theo bài tập, các bạn nhớ làm bài đầy đủ. Danh sách chia nhóm và theo dõi bài tập, các bạn download ở:
Code:
http://www.mediafire.com/?cmf7229cwsd4hvy
Trong quá trình làm bài, có gì thắc mắc các bạn cứ lên forum hỏi. Ở đây luôn có những thành viên nhiệt tình trả lời cho các bạn :D

Cuối cùng, chúc các bạn thi giữa kì vui vẻ và may mắn! :))
 

Attachments

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Hôm trước có đưa cho bạn cena và 1 bạn K09 con sensor nhiệt độ đọc về I2C của TI. Datasheet nó đây: http://www.ti.com/product/tmp100-ep
Các bạn cố gắng đọc và làm tốt nhé. Hiện nay trên thị trường cũng có rất nhiều IC, module sensor đọc về bằng I2C, bạn nào thích có thể mua về để tìm hiểu thêm
 

nguyenhongduc_nc

Thành Viên PIF
Em có 3 câu hỏi mong được sự giúp đỡ:
1.Em xài laptop win 7 mà không có cổng COM .EM đã thử gõ devmgmt.msc nhưng nó lại hiện ra cái bảng Device Manager
Capture.jpg
--> Vậy bước tiếp theo em sẽ vô phần nào ..Có phải vì máy em không có cổng COM nên không cần phải xem cổng COM là số mấy đúng ko
Nếu vậy thì mọi người cho em cách giải quyết vấn đề này vì trong Terminal có hỏi
Port: COMx // xem trong Run >> devmgmt.msc
2.KHông biết mọi người có crack của Termial này không vậy:D
Nó nói là xài được có 14 ngày thôi//E download bản mới mà Mạnh gửi link
3.Cái driver cài cho chip mà Mạnh có nhắc tới là sao vậy? Nếu vậy thì ai có link download cái driver này không
EM xin cám ơn
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
Giải thích thế này cho e dễ hiểu nhé:
- Laptop của e ko có cổng COM nên sẽ có 1 IC làm nhiệm vụ chuyển từ USB sang COM (tạo ra một cổng COM ảo). các IC hay dùng như PL2303, FT232...
- Để máy tính nhận đc cổng COM ảo thì e cần cài driver tương ứng với loại IC mà e dùng. E lên trang web của nhà sản xuất để down driver. google.com
 

light

Thành Viên PIF
mạch i2c của e lạ quá, nối dây hết rồi, xoắn SDA SCL lại luôn rồi mà cắm điện zô hiện toàn dấu chấm hỏi, hic. E lấy tụ 22p nối GND chích zô SCL thì lại chạy, thả ra lại bị ??, hic
 

2death

Cố Vấn CLB
Staff member
mạch i2c của e lạ quá, nối dây hết rồi, xoắn SDA SCL lại luôn rồi mà cắm điện zô hiện toàn dấu chấm hỏi, hic. E lấy tụ 22p nối GND chích zô SCL thì lại chạy, thả ra lại bị ??, hic
Vậy thì cứ chích 22p vô :D
 

light

Thành Viên PIF
hic hic, bệnh mới, con thạch anh của e mà đụng zô GND là đồng hồ đứng luôn, thật là lạ
 

cowboyhere

Cố Vấn CLB
Staff member
thế thì khỏi mass cho nó, nhưng mà t nhớ thạch anh ngya từ đầu đã hàn xuống mass rồi mà
 

light

Thành Viên PIF
hôm bữa t xài con thạch anh loại bự bự thì thấy nó bị vậy, hôm qua bức quá tháo ra, gắn con bé bé vô thì lại hết, hehe
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Các bạn C5 chú ý về D.I.D contest 2012 nhé. Hãy nhanh chóng tham gia để có 1 thử thách thật sự cho bản thân ~^o^~~^o^~~^o^~ và có cơ hội nhận kit LaunchPad. Các bạn sẽ được học thêm về 1 con VDK mới (tất nhiên là mạnh hơn PIC 887). Cuộc thi có thêm các đội ngoài khoa điện và ngoài trường bk, vì thế hứa hẹn sẽ mang đến nhiều hấp dẫn với các ý tưởng độc đáo. Nhanh tay đăng kí từ bây giờ, chỉ còn vài slot nữa thôi:(fight):(fight):(fight)
 

bigboy061293

Thành Viên PIF
cho em hỏi cái kit launchpad, nếu mình tháo con msp430 ra rồi gỡ phần jumper tx và rx ra thì có xài nó như một module uart được không mấy anh ?
 

bigboy061293

Thành Viên PIF
nếu vậy thì khuyên các bạn ai chưa mua module uart ở thiên minh thì có thể nên khỏi mua mà tậu luôn 1 cái launchpad về là quá hợp lí rồi :)
 

Manhdd

Cố Vấn CLB
Staff member
Uhm. Mình có "nghe đồn" là được nhưng chưa thử. Để mai thử xem. Cần chú ý ở 2 chuẩn điện áp 3.3V trên launch pad và 5V trên main PIC nữa nha bạn!
 

bigboy061293

Thành Viên PIF
ngày mai chắc em không đi học được. Nếu anh Mạnh mò được cái này, anh post lên cho mọi người tham khảo nhe anh :)
 

Manhdd

Cố Vấn CLB
Staff member
Việc dùng phần trên Kit Lauch Pad thay cho FT232 về cơ bản là được :o
- Khi cắm lauch pad, chúng ta sẽ được 1 cổng com: MSP430 Application UART
- Trong Lab7 của tài liệu Getting Started with the MSP430 LaunchPad, có chỉ code software UART truyền vào chân TXD. Bạn dùng code đó đổ vào chip MSP430. Dùng Terminal mở cổng COM với baud 2400 thì sẽ nhận được kí tự báo nhiệt độ tương đối.
- UART truyền qua đường này có tốc độ khá thấp, tối đa cỡ 9600. Tham khảo bài này:
HTML:
http://www.msp430launchpad.com/2010/07/launchpads-example-project-ripped-open.html
Thực tế thử nghiệm thì khi nối TX với RX, chúng ta có thể truyền nhận nhưng khá chậm. Chọn 9600 thì còn được chứ chọn 19200 thì Terminal tự nhiên "lờ đờ" luôn :)) . Còn nữa, thỉnh thoảng lại đụng thông báo The selected port is being used by another software :(

Mình còn phải làm project khác nên chưa thử gắn PIC vô. Bạn nào làm tiếp nhé ~^o^~ Chọn tốc độ baud của PIC xuống 2400, cấp nguồn 3.3V từ lanch pad cho main PIC luôn :o . Nạp PIC xong mới cắm 3.3V vô nhé :))
 

bigboy061293

Thành Viên PIF
khi xài terminal (bản mới nhất) cho launchpad, em cũng gặp thông báo này "The selected port is being used by another software". Em nghĩ là do thằng debuger của iar chọi với terminal, nên thường em cho thằng terminal chạy trước rồi mới cho debuger của iar chạy, với lại phải đóng cổng com trước khi chọn close season trong terminal. Em nghĩ là vậy, hông biết đúng hông nữa :)
 

Manhdd

Cố Vấn CLB
Staff member
Ban đầu mình cũng nghĩ nó đụng với CCS (debugger). Nhưng chiều mình test truyền từ TX sang RX của nó thôi, đâu mở CCS đâu :))
 

bigboy061293

Thành Viên PIF
anh Mạnh đừng gọi "mình - bạn" nữa, nghe mắc cỡ quá :)
nếu vậy em nghĩ do bản mới, em đang xài trial, không biết bản cũ thì sao em chưa thử
 
Top