Luận văn Giao tiếp giữa máy tính và vi xử lý trong hệ thông Scada

Như chúng ta đã biết trong điều kiện khoa học kỹ thuật và kinh tế phát triển như hiện nay thì qui trình tự động hóa trong công nghiệp và sản xuất hầu như không thể thiếu được . Nó đóng một vai tró hết sức quan trọng trong việc giúp tăng năng suất , tăng độ chính xác và do đó tăng hiệu quả sản xuất . Trong đó một vai trò không thể không nhắc đến của qui trình tự động hóa là thu thập dữ liệu và điều khiển từ xa . Để kiểm tra tình hình sản xuất cũng như trạng thái hoạt động của từng phân xưởng ta không thể cứ cho người đến tận nơi , kiểm soát từng hoạt động và quay về báo cáo nếu có sự cố xảy ra mà nhất thiết phải có một hệ thống thu thập dữ liệu từ xa . Khi đó, người kỹ sư vận hành chỉ cần ngồi tại bàn điều khiển và quan sát những trạng thái được cập nhật về liên tục để có thể xử lý kịp thời những tình huống xảy ra thông qua quá trình liên kết dữ liệu, mà không phải mất thời gian đi đến nơi có xảy ra sự cố . Không dừng ở đó , việc thu thập dữ liệu và điều khiển từ xa còn là một nhân tố quản lý, một yếu tố tất yếu cho sự phát triển của tất cả các ngành nghề , các lĩnh vực khác như giao thông vận tải ( theo dõi các trạm giao thông đường bộ, hàng hải , hàng không ) , điện lực , y tế . . . Biết được ý nghĩa và tầm quan trọng của nó nên chúng em quyết định nghiên cứu và hy vọng có cơ hội mở rộng đề tài này . Tổng quan về công việc thực hiện như sau : - Xây dựng một tập lệnh trong giao tiếp giữa Máy tính và micro-controller. - Xây dựng một giao thức truyền nhận thông tin (Protocol). - Sử dụng tập lệnh theo yêu cầu mong muốn . - Xây dựng một chương trình demo như một ứng dụng cụ thể của đề tài .

doc93 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2496 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Luận văn Giao tiếp giữa máy tính và vi xử lý trong hệ thông Scada, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
EN khi baét ñaàu chöông trình ñeå khôûi ñoäng port noái tieáp, roài xoùa RI ñeå baét ñaàu hoaït ñoäng nhaäp döõ lieäu. Khi RI bò xoùa, caùc xung nhòp ñöôïc ñöa ra ñöôøng TXD, baét ñaàu chu kyø maùy keá tieáp, vaø döõ lieäu theo xung nhòp ôû ñöôøng RXD. Laáy xung nhòp cho döõ lieäu vaøo port noái tieáp xaûy ra ôû caïnh döông cuûa TXD. Clock dòch (TXD) ALE Moät chu kyø maùy D0 D0 D0 D0 D0 D0 D0 D0 Döõ lieäu nhaäp (RXD) Giaûn ñoà thôøi gian port noái tieáp thu ôû cheá ñoä 0. Moät öùng duïng cuûa cheá ñoä thanh ghi dòch laø môû roäng khaû naêng xuaát cuûa 8051/8031. IC thanh ghi dòch noái tieáp ra song song coù theå ñöôïc noái vaøo caùc ñöôøng TXD vaø RXD cuûa 8051/8031 ñeå cung caáp theâm 8 ñöôøng ra. Coù theå noái xaâu chuoãi theâm caùc thanh ghi dòch ñeå môû roäng theâm. Clock Thanh ghi Döõ lieäu dòch TXD (P3.1) RXD (P3.0) 8051 Theâm 8 ngoõ ra Cheá ñoä thanh ghi dòch cuûa port noái tieáp. UART 8 bit vôùi toác ñoä baud thay ñoåi ñöôïc (cheá ñoä 1). ÔÛ cheá ñoä 1, port noái tieáp cuûa 8051/8031 laøm vieäc nhö moät UART 8 bit vôùi toác ñoä baud thay ñoåi ñöôïc. Moät UART (Universal Asynchronous Receiver/Transmitter : Boä thu/phaùt baát ñoàng boä vaïn naêng) laø moät duïng cuï thu vaø phaùt döõ lieäu noái tieáp vôùi moãi kyù töï döõ lieäu ñi tröôùc laø bit start ôû möùc thaáp vaø theo sau laø bit stop ôû möùc cao. Ñoâi khi xen theâm bit kieåm tra chaün leû giöõa bit döõ lieäu cuoái cuøng vaø bit stop. Hoaït ñoäng chuû yeáu cuûa UART laø chuyeån ñoåi song song sang noái tieáp vôùi döõ lieäu xuaát vaø chuyeån ñoåi noái tieáp sang song song vôùi döõ lieäu nhaäp. ÔÛ cheá ñoä 1, 10 bit ñöôïc phaùt treân TXD hoaëc thu treân RXD. Nhöõng bit ñoù laø : 1 bit start (luoân luoân laø 0), 8 bit döõ lieäu (LSB ñaàu tieân) vaø 1 bit stop (luoân luoân laø 1) . Vôùi hoaït ñoäng thu, bit stop ñöôïc ñöa vaøo RB8 trong SCON. Trong 8051/8031 cheá doä baud ñöôïc ñaët baèng toác ñoä baùo traøn cuûa Timer 1. Taïo xung nhòp vaø ñoàng boä hoùa caùc thanh ghi dòch cuûa port noái tieáp trong caùc cheá ñoä 1, 2 vaø 3 ñöôïc thieát laäp baèng boä ñeám 4 bit chia cho 16, ngoõ ra laø xung nhòp toác ñoä baud. Ngoõ vaøo cuûa boä ñeám naøy ñöôïc choïn qua phaàn meàm Xung nhòp toác ñoä baud Thanh ghi dòch port noái tieáp ¸ 16 16 ´ toác ñoä baud Taïo xung nhòp port noái tieáp. Truyeàn döõ lieäu (phaùt) ñöôïc khôûi ñoäng baèng caùch ghi vaøo SBUF, nhöng vaãn chöa thaät söï baét ñaàu chaïy cho ñeán khi söï thay theá keá tieáp cuûa boä ñeám chia cho 16 cung caáp toác ñoä baud coång noái tieáp. Döõ lieäu ñöôïc dòch ra ngoaøi treân ñöôøng TXD baét ñaàu baèng bit start, theo sau laø 8 bit döõ lieäu vaø sau cuøng laø bit stop. Ñoä roäng (theo thôøi gian cuûa moãi bit) laø nghòch ñaûo cuûa toác ñoä baud ñöôïc laäp trình trong timer. Côø ngaét phaùt (TI) ñöôïc ñaët leân 1 khi xuaát hieän bit stop treân TXD. bit start bit stop D0 D1 D2 D3 D4 D5 D6 D7 TXD 1 toác ñoä baud TI (SCON.1) Ngaét phaùt (chuaån bò cho döõ lieäu) Ñaët côø TI port noái tieáp. Vieäc thu döõ lieäu ñöôïc khôûi ñoäng baèng moät chuyeån traïng thaùi töø 1 xuoáng 0 treân RXD. Boä ñeám 16 töùc thôøi ñöôïc xoùa ñeå ñoàng boä soá ñeám vôùi luoàng bit ñeán. Luoàng bit ñeán ñöôïc laáy maãu giöõa 16 laàn ñeám. Boä thu seõ phaùt hieän ñöôïc bit start sai baèng caùch yeâu caàu traïng thaùi 0 ôû (bit start) ôû laàn ñeám thöù 8 sau khi coù chuyeån traïng thaùi töø 1 xuoáng 0 ñaàu tieân. Neáu ñieàu naøy khoâng xaûy ra, ngöôøi ta giaû söû laø boä thu ñöôïc kích bôûi nhieãu chöù khoâng phaûi do moät kyù töï hôïp leä. Boä thu ñöôïc reset vaø quay veà traïng thaùi nghæ (idle), tìm kieám (ñôïi) chuyeån traïng thaùi töø 1 xuoáng 0 keá. Giaû söû ñaõ phaùt hieän ñöôïc bit start hôïp leä, thì tieáp tuïc thu kyù töï. Bit start ñöôïc boû qua vaø 8 bit döõ lieäu ñöôïc ñöa vaøo thanh ghi dòch coång noái tieáp theo xung nhòp. Khi ñaõ coù ñöôïc taát caû 8 bit, ñieàu sau ñaây xaûy ra : 1. Bit thöù 9 (bit stop) ñöôïc choát vaøo RB8 trong SCON. 2. SBUF ñöôïc naïp vôùi 8 bit döõ lieäu. 3. Côø ngaét boä thu (RI) ñöôïc ñaët leân 1. Tuy nhieân, nhöõng ñieàu naøy chæ xaûy ra neáu ñaõ coù nhöõng ñieàu kieän sau : 1. RI = 0 2. SM2 = 1 vaø bit stop thu ñöôïc laø 1, hoaëc SM2 = 0. Ñoøi hoûi RI = 0 ñeå baûo ñaûm laø phaàn meàm ñaõ ñoïc kyù töï tröôùc (vaø RI ñöôïc xoùa). Ñieàu kieän thöù hai hôi phöùc taïp nhöng chæ aùp duïng trong cheá ñoä truyeàn thoâng ña xöû lyù. Ñieàu ñoù haøm yù laø “khoâng ñaët RI leân 1 trong cheá ñoä truyeàn thoâng ña xöû lyù khi bit döõ lieäu thöù 9 laø 0). UART 9 bit vôùi toác ñoä baud coá ñònh (cheá ñoä 2): Khi SM1 = 1 vaø SM0 = 0, coång noái tieáp laøm vieäc ôû cheá ñoä 2, nhö moät UART 9 bit coù toác ñoä baud coá ñònh. 11 bit seõ ñöôïc phaùt hoaëc thu : 1 bit start, 8 bit döõ lieäu, bit döõ lieäu thöù 9 coù theå laäp trình ñöôïc vaø 1 bit stop. Khi phaùt, bit thöù 9 laø baát cöù gì ñaõ ñöôïc ñöa vaøo TB8 trong SCON (coù theå laø bit parity). Khi thu, bit thöù 9 thu ñöôïc seõ ôû trong RB8. Toác ñoä baud ôû cheá ñoä 2 laø 1/32 hoaëc 1/16 taàn soá dao ñoäng treân chip. UART 9 bit vôùi toác ñoä baud thay ñoåi ñöôïc. Cheá ñoä naøy gioáng nhö cheá ñoä 2 ngoaïi tröø toác ñoä baud coù theå laäp trình ñöôïc vaø ñöôïc cung caáp bôûi timer. Thaät ra, caùc cheá ñoä 1,2 vaø 3 raát gioáng nhau. Caùc khaùc bieät laø ôû toác ñoä baud (coù ñònh trong cheá ñoä 2, thay ñoåi trong caùc cheá ñoä 1 vaø 3) vaø ôû soá bit döõ lieäu (8 trong cheá ñoä 1, 9 trong caùc cheá ñoä 2 vaø 3). Khôûi ñoäng vaø truy xuaát caùc thanh ghi coång noái tieáp: Cho pheùp thu: Bit cho pheùp boä thu (REN = Receiver Enable) trong SCON phaûi ñöôïc ñaët leân 1 baèng phaàn meàm ñeå cho pheùp thu caùc kyù töï. Thoâng thöôøng thöïc hieän vieäc naøy ôû ñaàu chöông trình khi khôûi ñoäng coång noái tieáp, timer, ... Coù theå thöïc hieän vieäc naøy theo hai caùch. Leänh SETB REN seõ ñaët REN leân 1, hoaëc leänh MOV SCON, #xxx1xxxxB seõ ñaët REN leân 1 vaø ñaët hoaëc xoùa caùc bit khaùc trong SCON khi caàn (Caùc x phaûi laø 0 hoaëc 2 ñeå ñaët cheá ñoä laøm vieäc). Bit döõ lieäu thöù 9: Bit döõ lieäu thöù 9 caàn phaùt trong caùc cheá ñoä 2 vaø 3 phaûi ñöôïc naïp vaøo trong TB8 baèng phaàn meàm. Bit döõ lieäu döõ lieäu thöù 9 thu ñöôïc ñaët ôû RB8. Phaàn meàm coù theå caàn hoaëc khoâng caàn bit döõ lieäu thöù 9, phuï thuoäc vaøo ñaëc tính kyõ thuaät cuûa thieát bò noái tieáp söû duïng. (Bit döõ lieäu thöù 9 cuõng ñoùng moät vai troø quan troïng trong truyeàn thoâng ña xöû lyù). Theâm 1 bit parity: Thöôøng söû duïng bit döõ lieäu thöù 9 ñeå theâm parity vaøo kyù töï. Nhö ñaõ xeùt ôû caùc chöông tröôùc, bit P trong töø traïng thaùi chöông trình (PSW) ñöôïc ñaët leân 1 hoaëc bò xoùa moãi chu kyø maùy ñeå thieát laäp kieåm tra chaün vôùi 8 bit trong thanh ghi tích luõy. Ví duï, neáu truyeàn thoâng caàn 8 bit döõ lieäu coäng theâm kieåm tra chaün, coù theå söû duïng caùc leänh sau ñeå phaùt 8 bit trong thanh ghi tích luõy vôùi kieåm tra chaün theâm vaøo bit thöù 9 : MOV C, P ; Ñaët bit parity chaün vaøo TB8 MOV TB8, C ; noù trôû thaønh bit döõ lieäu thöù 9 MOV SBUF, A ; Chuyeån 8 bit töø ACC vaøo SBUF. Neáu caàn parity leû thì söûa caùc leänh laïi nhö sau : MOV C, P ; Ñaët bit parity chaün vaøo côø C CPL C ; Ñoåi sang parity leû MOV TB8, C MOV SBUF, A Dó nhieân, vieäc söû duïng parity khoâng bò giôùi haïn ôû caùc cheá ñoä 2 vaø 3. ÔÛ cheá ñoä 1, 8 bit döõ lieäu ñöôïc truyeàn ñi coù theå bao goàm 7 bit döõ lieäu coäng theâm bit parity. Ñeå truyeàn maõ ASCII 7 bit vôùi parity chaün ôû bit 8, coù theå söû duïng caùc leänh sau : CLR ACC.7 ; baûo ñaûm MSB ñöôïc xoùa PMOV C, P ; parity chaün ôû trong MOV ACC.7, C ; Ñaët parity chaün vaøo MSB MOV SBUF, A ; Gôûi kyù töï ñi 7 bit döõ lieäu coäng prity chaün. Caùc côø ngaét: Hai côø ngaét thu vaø phaùt (RI vaø TI) trong SCON ñoùng moät vai troø quan troïng trong truyeàn thoâng noái tieáp duøng 8051/8031. Caû hai bit ñöôïc ñaët leân 1 baèng phaàn cöùng, nhöng phaûi ñöôïc xoùa baèng phaàn meàm. Ví duï, thöôøng RI ñöôïc ñaët leân 1 khi keát thuùc vieäc thu kyù töï vaø baùo “boä ñeäm thu traøn”. Ñieàu kieän naøy coù theå ñöôïc kieåm tra trong phaàn meàm hoaëc coù theå ñöôïc laäp trình ñeå gaây ra moät ngaét. Neáu phaàn meàm muoán nhaäp moät kyù töï töø thieát bò ñöôïc noái vaøo coång noái tieáp (coù theå laø thieát bò ñaàu cuoái hieån thò video), noù phaûi ñôïi cho ñeán khi RI ñöôïc ñaët leân 1, roài xoùa RI vaø ñoïc kyù töï töø SBUF. Chöông trình nhö sau : WAIT : JNB RI, WAIT ; Kieåm tra RI cho ñeán khi noù = 1 CLR RI ; Xoùa RI MOV A, SBUF ; Ñoïc kyù töï TI ñöôïc ñaët leân 1 ôû cuoái luùc phaùt kyù töï vaø baùo “ boä ñeäm phaùt troáng”. Neáu phaàn meàm muoán göûi moät kyù töï ñeán moät thieát bò ñöôïc noái vaøo coång noái tieáp, tröôùc heát noù phaûi kieåm tra xem coång noái tieáp saün saøng chöa. Noùi caùch khaùc, neáu kyù töï tröôùc ñaõ ñöôïc gôûi ñi, ñôïi cho ñeán khi vieäc truyeàn döõ lieäu hoaøn taát tröôùc khi göûi kyù töï keá. Caùc leänh sau seõ truyeàn kyù töï trong thanh ghi tích luõy: WAIT : JNB TI, WAIT ; Kieåm tra TI cho ñeán khi noù baèng 1 CLR TI ; Xoùa TI MOV SBUF, A ; Gôûi kyù töï ñi. Caùc ñoaïn chöông trình treân laø moät phaàn cuûa caùc haøm nhaäp vaø xuaát kyù töï chuaån. Toác ñoä baud port noái tieáp: Nhö ñaõ noùi, toác ñoä baud coá ñònh ôû caùc cheá ñoä 0 vaø 2. Trong cheá ñoä 0, noù luoân luoân laø taàn soá dao ñoäng treân chip ñöôïc chia cho 12. Thoâng thöôøng thaïch anh aán ñònh taàn soá dao ñoäng treân chip cuûa 8051/8031, nhöng cuõng coù theå söû duïng nguoàn xung nhòp khaùc. Giaû söû vôùi taàn soá dao ñoäng danh ñònh laø 12 MHz, thì toác ñoä baud cheá ñoä 0 laø 1 MHz. ¸ 12 xung nhòp toác ñoä baud dao ñoäng treân chip a) cheá ñoä 0 ¸ 64 xung nhòp toác ñoä baud dao ñoäng treân chip b) cheá ñoä 2 ¸ 32 SMOD = 0 SMOD = 1 ¸ 32 xung nhòp toác ñoä baud dao ñoäng treân chip c) caùc cheá ñoä 1 vaø 3. ¸ 16 SMOD = 0 SMOD = 1 Caùc nguoàn taïo xung nhòp cho port noái tieáp. Maëc nhieân sau khi reset heä thoáng, toác ñoä baud cheá ñoä 2 laø taàn soá boä dao ñoäng chia cho 64. Toác ñoä baud cuõng bò aûnh höôûng bôûi moät bit trong thanh ghi ñieàu khieån nguoàn cung caáp (PCON). Bit 7 cuûa PCON laø bit SMOD. Ñaët bit SMOD leân 1 laøm gaáp ñoâi toác ñoä baud trong caùc cheá ñoä 1, 2 vaø 3. Trong cheá ñoä 2, toác ñoä baud coù theå bò gaáp ñoâi töø giaù trò maëc nhieân cuûa 1/64 taàn soá dao ñoäng (SMOD = 0) ñeán 1/32 taàn soá dao ñoäng (SMOD = 1). Vì PCON khoâng ñöôïc ñònh ñòa chæ theo bit, neân ñeå ñaët bit SMOD leân 1 caàn phaûi theo caùc leänh sau : MOV A, PCON ; Laáy giaù trò hieän thôøi cuûa PCON SETB ACC.7 ; Ñaët bit 7 (SMOD) leân 1 MOV PCON, A ; Ghi giaù trò ngöôïc veà PCON. Caùc toác ñoä baud trong caùc cheá ñoä 1 vaø 3 ñöôïc xaùc ñònh baèng toác ñoä traøn cuûa Timer 1. Vì timer hoaït ñoäng ôû taàn soá töông ñoái cao, traøn timer ñöôïc chia theâm cho 32 (16 neáu SMOD = 1) tröôùc khi cung caáp xung nhòp toác ñoä baudcho port noái tieáp. * Söû duïng Timer 1 laøm xung nhòp toác ñoä baud Xeùt 8051, caùch thoâng duïng ñeå taïo toác ñoä baud laø khôûi ñoäng TMOD cho cheá ñoä 8 bit töï ñoäng naïp laïi (cheá ñoä 2) vaø ñaët giaù trò naïp laïi ñuùng vaøo TH1 ñeå cho toác ñoä traøn ñuùng vôùi toác ñoä baud. TMOD ñöôïc khôûi ñoäng nhö sau : MOV TMOD, #0010xxxxB Caùc x laø caùc bit 1 hoaëc 0 caàn cho timer. Cuõng coù theå ñaït ñöôïc caùc toác ñoä baud thaáp baèng caùch söû duïng timer cheá ñoä 1 vôùi TMOD = 0001xxxxB. Tuy nhieân, toán theâm phaàn meàm vì caùc thanh ghi TH1/TL1 phaûi ñöôïc khôûi ñoäng laïi sau moãi laàn traøn. Vieäc naøy seõ ñöôïc thöïc hieän trong chöông trình phuïc vuï ngaét. Moät choïn löïa khaùc laø caáp xung nhòp cho Timer 1 töø ngoaøi duøng T1(P3.5). Vaø luoân luoân toác ñoä baud laø toác ñoä traøn cuûa Timer 1 ñöôïc chia cho 32 (hoaëc cho 16, neáu SMOD = 1). Coâng thöùc toång quaùt ñeå xaùc ñònh toác ñoä baud trong caùc cheá ñoä 1 vaø 3 laø : Toác ñoä baud = Toác ñoä traøn cuûa Timer 1 ¸ 32. Ví duï, muoán laøm vieäc vôùi toác ñoä baud laø 1200 baud, thì toác ñoä traøn cuûa Timer 1 phaûi laø : 1200 ´ 32 = 38.4 KHz. Neáu duøng thaïch anh 12 MHz, Timer 1 ñöôïc caáp xung nhòp 1 MHz hay 1000 KHz. Vì toác ñoä traøn cuûa Timer 1 laø 38.4 KHz vaø timer ñöôïc caáp xung hòp 1000 KHz, thì caàn traøn sau 1000 ¸ 38.4 = 26.04 xung nhòp (laøm troøn laø 26). Vì timer ñeám leân vaø traøn xaûy ra khi coù söï thay ñoåi töø FFH xuoáng 00H ôû soá ñeám. Nhö vaäy giaù trò ñuùng caàn naïp vaøo TH1 laø –26. Caùch deã nhaát ñeå ñaët giaù trò naïp laïi vaøo TH1 laø : MOV TH1, # –26 Trình hôïp dòch seõ thöïc hieän chuyeån ñoåi caàn thieát. Trong tröôøng hôïp naøy –26 ñöôïc chuyeån thaønh 0E6H. Nhö vaäy, leänh treân hoaøn toaøn gioáng vôùi leänh : MOV TH1, # 0E6H Do vieäc laøm troøn neân coù sai soá nhoû trong toác ñoä baud. Toång quaùt thì cho pheùp dung sai 5% trong truyeàn thoâng baát ñoàng boä (start/stop). Coù theå coù ñöôïc toác ñoä baud chính xaùc neáu duøng thaïch anh 11.059 MHz. Baûng sau ñaây toùm taét caùc giaù trò naïp laïi cho caùc toác ñoä baud thoâng duïng nhaát, duøng thaïch anh 12 MHZ hoaëc 11.059 MHz : Toác ñoä baud 9600 12.000 MHz 1 –7 (F9H) 8923 7% 2400 12.000 MHz 0 –13 (F3H) 2404 0.16% 1200 12.000 MHz 0 –26 (E6H) 1202 0.16% 19200 11.059 MHz 1 –3 (FDH) 19200 0 9600 11.059 MHz 0 –3 (FDH) 9600 0 2400 11.059 MHz 0 –12 (F4H) 2400 0 1200 11.059 MHz 0 –24 (E8H) 1200 0 Taàn soá thaïch anh SMOD Giaù trò naïp laïi vaøo TH1 Toác ñoä baud thaät Sai soá Baûng toùm taét toác ñoä baud. Chöông 3: RTX51 TINY GIÔÙI THIEÄU: Ñeå taêng hieäu quaû laøm vieäc cuõng nhö yeâu caàu nhaát thieát cuûa chöông trình laø phaûi thöïc hieän ñoàng thôøi nhieàu coâng vieäc hoaëc nhieàu taùc vuï. Vì theá chöông trình naøy ñöôïc vieát theo heä ñieàu haønh thôøi gian thöïc (real_time operating system) cho pheùp saép xeáp danh muïc ñoàng thôøi nhieàu taùc vuï trong heä thoáng nguoàn söû duïng chöông trình RTX-Tiny(RTX51) cuûa phaàn meàm Keil. Öu ñieåm cuûa vieäc xaây döïng chöông trình theo kieåu naøy laø hoaït ñoäng cuûa caùc coâng vieäc khaùc nhau trong chöông trình coù theå hoaït ñoäng ñoäc laäp, khoâng gaây aûnh höôûng vôùi nhau veà maët thôøi gian xöû lyù. Neáu vì moät lyù do khoâng mong muoán naøo ñoù maø moät taùc vuï trong heä thoáng chöông trình khoâng thöïc hieän ñöôïc hoaëc thôøi gian thöïc hieän quaù lôùn, hoaëc coù moät vaøi voøng laëp voâ taän trong chöông trình thì heä thoáng khoâng bò “treo” maø caùc taùc vuï khaùc vaãn coù theå hoaït ñoäng bình thöôøng. Giôùi thieäu phaàn meàm Keil: Khoâng nhö caùc chöông trình vieát cho vi xöû lyù tröôùc ñaây, chöông trình trong luaän vaên naøy khoâng duøng ngoân ngöõ hôïp ngöõ (assemler) maø ñöôïc vieát baèng ngoân ngöõ laäp trình C vaø lieân keát vôùi chöông trình C51-compile cuûa phaàn meàm Keil ñeå dòch sang ngoân ngöõ maùy. Ñaây laø phaàn meàm chuyeân duøng söû duïng ngoân ngöõ laäp trình C ñeå laäp trình cho caùc loaïi vi xöû lyù ñöôïc saûn xuaát bôûi nhieàu haõng khaùc nhau treân theá giôùi, chöông trình naøy chöùa taát caû caùc haøm C môû roäng caàn thieát cho vi ñieàu khieån ñöôïc söû duïng. Tieän ích cuûa caùch vieát naøy laø ngoân ngöõ laäp trình C laø ngoân ngöõ laäp trình caáp cao hôn vaø gaàn guûi vôùi ngöôøi söû duïng hôn ngoân ngöõ maùy tính assembler. Ngoaøi ra, caáu truùc chöông trình vieát baèng C cuõng goïn hôn vaø deã quaûn lyù hôn vôùi caùc caâu leänh vaø voøng laëp ñôn giaûn, ñieàu naøy thaät söï coù lôïi khi ta muoán naâng caáp hay môû roäng chöông trình. Song song vôùi nhöõng tieän ích treân, chöông trình C51 cuûa phaàn meàm Keil coøn hoå trôï cho ta moät soá haøm cô baûn nhö caùc haøm vaøo/ ra (ví duï nhö: haøm xuaát nhaäp kyù töï ñôn getchar(),putchar(); haøm xuaát nhaäp chuoãi kyù töï gets(), puts()), caùc haøm thôøi gian thöïc cuûa chöông trình RTX51 Tiny … vaø moät soá haøm khaùc giuùp heä thoáng hoaït ñoäng hoaøn haûo hôn. Beân caïnh ñoù, chöông trình bieân dòch vaø chöông trình chaïy moâ phoûng treân maùy tính (chöông trình Debug) cuûa phaàn meàm Keil laø moät thuaän lôïi raát lôùn. Noù giuùp cho ngöôøi laäp trình coù theå quan saùt chöông trình moät caùch chính xaùc vôùi caùc böôùc thöïc hieän vaø töøng leänh chaïy trong chöông trình, coù caû maõ chöông trình vieát baèng ngoân ngöõ C vaø chöông trình dòch sang maõ Assembler töông öùng do chöông trình C51-compiler thöïc hieän. Ngoaøi ra, vôùi phaàn meàm naøy ta coøn coù theå theo doõi ñöôïc söï thay ñoåi giaù trò cuûa caùc bieán caàn quan saùt, caùc haøm ngaét, caùc giaù trò vaøo/ra taïi caùc chaân Port, caùc giaù trò döõ lieäu truyeàn qua SBUF vaø caû caùc giaù trò timer v.v.. Giôùi thieäu chöông trình tuaàn hoaøn theo thôøi gian bieåu cuûa TRX51 tiny: RTX51 cuûa phaàn meàm Keil ñöôïc vieát theo heä ñieàu haønh thôøi gian thöïc giuùp chöông trình coù theå thöïc hieän ña nhieäm (multi-tasking), cho pheùp moät vaøi taùc vuï hoaëc vaøi voøng laëp voâ taän ñöôïc thöïc hieän gaàn nhö song song nhau trong chöông trình . Tuy nhieân caùc taùc vuï trong chöông trình naøy khoâng xaûy ra ñoàng thôøi maø do vieäc saép xeáp caùc taùc vuï theo caùc muùi thôøi gian ñöôïc chia nhoû, töùc taïi moät thôøi ñieåm chæ moät coâng vieäc ñöôïc thöïc hieän maø thoâi. Ñoàng hoà cuûa CPU coù theå ñöôïc chia thaønh nhieàu muùi thôøi gian vaø chöông trình seõ tuaàn töï saép xeáp moãi muùi thôøi gian cho moät taùc vuï. Moãi taùc vuï ñöôïc pheùp thöïc hieän trong khoaûng thôøi gian toái ña ñònh tröôùc vaø sau ñoù chöông trình seõ chuyeån sang moät taùc vuï khaùc ñaõ saün saøng thöïc hieän, chöông trình cöù theá laëp laïi tuaàn töï. Vì moãi muùi thôøi gian ñöôïc chia raát nhoû, thöôøng chæ vaøi mili giaây hoaëc nhoû hôn neân chöông trình luoân ñöôïc queùt qua lieân tuïc vaø vì theá caùc taùc vuï döôøng nhö xaûy ra ñoàng thôøi. Neáu taïi moät thôøi ñieåm naøo ñoù maø khoâng coù moät taùc vuï naøo thöïc hieän thì taùc vuï ñöôïc khôûi ñoäng keá tieáp seõ ôû traïng thaùi saün saøng (ready) hoaëc trang thaùi nghæ (time-out). RTX51 söû duïng caùc thuû tuïc thôøi gian ñöôïc ngaét bôûi phaàn cöùng cuûa timer 8051. Chu kyø ngaét ñöôïc xaây döïng vaø söû duïng theo ñoàng hoà cuûa RTX51. RTX51 khoâng yeâu caàu coù moät haøm Main trong chöông trình. Noù seõ töï ñoäng goïi vaø thöïc hieän chöông trình baét ñaàu töø taùc vuï 0. Neáu ta söû duïng haøm Main trong chöông trình, ta phaûi khôûi ñoäng RTX51 söû duïng haøm os_create_task vaø haøm os_start_system trong RTX51. Khi rôi vaøo traïng thaùi nghæ (timer out), thay vì taïm döøng thöïc hieän moät taùc vuï vaø ñöùng chôø moät laàn queùt khaùc, ta coù theå söû duïng haøm os_wait ñeå tín hieäu RTX51coù theå baét ñaàu chuyeån sang thöïc hieän moät taùc vuï khaùc. Haøm naøy thöïc hieän vieäc trì hoaõn taùc vuï hieän haønh vaø ñôïi cho ñeán khi coù moät söï kieän ñöôïc ñònh tröôùc xaûy ñeán. Trong khoaûng thôøi gian nghæ naøy baát cöù moät taùc vuï naøo khaùc cuõng coù theå ñöôïc thöïc hieän. Söû duïng thôøi gian nghæ (time-out) vôùi RTX51: Moät söï kieän ñôn giaûn nhaát maø ta coù theå ñôïi vôùi haøm os_wait laø khoaûng thôøi gian nghæ theo nhòp ñoàng hoà cuûa RTX51. Söï kieän naøy coù theå ñöôïc söû duïng trong nhöõng taùc vuï maø coù yeâu caàu delay. Trong vaøi tröôøng hôïp noù ñöôïc söû duïng nhö moät switch, maø switch naøy chæ caàn ñöôïc kieåm tra sau nhöõng khoaûng thôøi gian nhaát ñònh. Ñieàu ñöôïc minh hoïa trong ví duï sau: #include int counter0; int counter1; void job0 (void) _task_ 0 { os_create ( 1 ) ; while ( 1 ) { counter0 ++; os_wait (K_TMO, 3,0); } } void job1 (void) _task_ 1 { while (1) { counter1++; os_wait (K_TMO, 5, 0); } } trong ví duï treân, job0 coù theå thöïc hieän tröôùc job1. Nhöng hieän taïi, sau khi taêng counter0, job0 goïi haøm os_wait ñeå taïm döøng 3khoaûng chia thôøi gian. Ngay luùc naøy, RTX51 chuyeån sang taùc vuï keá tieáp, cuï theå laø job1,sau khi job1 taêng counter1, noù cuõng goïi haøm os_wait ñeå taïm döøng 5 khoaûng chia thôøi gian. Luùc naøy, RTX51 khoâng coù taùc vuï naøo khaùc ñeå thöïc hieän, vì theá noù rôi vaøo traïng thaùi khoâng laøm gì caû vaø ñôïi heát 3 khoaûng chia thôøi gian troâi qua tröôùc khi tieáp tuïc thöïc hieän job1. Keát quaû cuûa ví duï naøy laø counter0 cöù taêng sau moãi 3 khoaûng thôøi gian vaø counter1 cöù taêng sau moãi 5 khoaûng chia thôøi gian. Söû duïng tín hieäu vôùi RTX51: Ta coù theå duøng haøm os-wait ñeå taïm döøng moät taùc vuï trong khi ñôïi moät tín hieäu töø moät taùc vuï khaùc. Ñieàu naøy coù theå söû duïng cho hai hay nhieàu taùc vuï ngang baèng nhau. Ñôïi moät tín hieäu laøm vieäc coù nghóa laø: Neáu moät taùc vuï ñang ñôïi moät tín hieäu ,vaø côø tín hieäu laø 0, taùc vuï naøy seõ ñöôïc trì hoaõn cho ñeán khi coù tín hieäu gôûi ñeán. Neáu côø tín hieäu ñaõ leân 1 khi 1 taùc vuï hoûi, côø naøy seõ ñöôïc xoaù, vaø taùc vuï ñoù laïi tieáp tuïc thöïc hieän. Ñieàu naøy ñöôïc minh hoaï trong ví duï sau: #include int counter0; int counter1; void job0 (void) _task_ 0 { os_create ( 1 ) ; while ( 1 ) { if ( ++counter0 == 0 ) os_send_signal ( 1 ) ; } } void job1 (void) _task_ 1 { while (1) { os_wait (K_SIG, 0, 0); counter1++; } } Trong ví duï treân, job1 seõ ñôïi cho ñeán khi noù nhaän ñöôïc tín hieäu töø moät hoaëc vaøi taùc vuï khaùc gôûi ñeán. Khi nhaän ñöôïc tín hieäu, noù seõ taêng counter1 vaø laïi ñôïi moät tín hieäu khaùc. job0 lieân tuïc taêng counter0 noù traøn ñeán 0. Khi ñieàu ñoù xaûy ra, job 0 gôûi moät tín hieäu ñeán job1 vaø chöông trình RTX51 ñaùnh daáu job1 laø saün saøng thöïc hieän. Tuy nhieân, job1 seõ khoâng ñöôïc thöïc hieän trong suoát thôøi gian RTX51 nhaän noù cho ñeán khi chuyeån sang moät muùi thôøi gian keá tieáp. Söï öu tieân vaø quyeàn öu tieân: Moät baát lôïi cuûa chöông trình ví duï treân laø job1 khoâng ñöôïc baét ñaàu ngay khi nhaän ñöôïc tín hieäu töø job0 . Trong moät soá tröôøng hôïp ñieàu naøy khoâng ñöôïc chaáp nhaän vì lí do thôøi gian . RTX51 cho pheùp ta xaùc ñònh möùc öu tieân cho töøng taùc vuï . Moät taùc vuï vôùi möùc öu tieân cao hôn seõ ñöôïc ngaét hoaëc ñöôïc quyeàn öu tieân hôn ñoái vôùi moät taùc vuï coù möùc öu tieân thaáp hôn baát cöù khi naøo noù caàn ñöôïc thöïc hieän. Trong ví duï treân, ta coù theå thay ñoåi caùch khai baùo cho job1 nhaän möùc öu tieân cao hôn job0. Theo maëc ñònh, taát caû caùc taùc vuï ñöôïc ñònh möùc öu tieân laø 0, laø möùc öu tieân thaáp nhaát. Caùc möùc öu tieân cho pheùp laø töø 0 ñeán 3. Trong ví duï treân ta, coù theå ñònh nghóa job1 vôùi möùc öu tieân caáp 1 nhö sau: Void job1 (void) _ task_ 1 _priority_ 1 {While (1) { Os_wait (K_SIG, 0, 0 ); Counter1++; } } Vôùi caùch khai baùo naøy, baát cöù khi naøo job0 gôûi tín hieäu ñeán job1, job1 seõ baét ñaàu thöïc hieän ngay. Moät soá yeâu caàu vaø ñònh nghóa ñoái vôùi chöông trình RTX51 Tiny: Ñieàu khieån ngaét: RTX51 Tiny coù theå hoaït ñoäng song song vôùi caùc haøm ngaét. Töông töï nhö caùc öùng duïng khaùc cuûa 8051, nguoàn ngaét phaûi ñöôïc cho pheùp bôûi caùc thanh ghi phaàn cöùng cuûa 8051 ñeå taïo ra moät ngaét. RTX51 Tiny khoâng chöùa baát cöù moät söï ñieàu khieån naøo cho caùc ngaét; vì lyù do ñoù, moät cho pheùp ngaét cuï theå laø ñuû ñeå xöû lyù ngaét.RTX51 Tiny söû duïng timer 0 vaø ngaét timer0 cuûa 8051 cho heä thôøi gian thöïc. Ngoaïi tröø caùc caáu truùc khaùc cuûa 8051, ñeå traùnh söï truøng laëp trong xöû lyù ngaét timer0 khoâng neân ñöôïc söû duïng trong chöông trình. Registerbanks: RTX51 tiny qui taát caû caùc taùc vuï vaøo registerbank 0. Vì lyù do ñoù, taát caû caùc haøm taùc vuï phaûi ñöôïc chuyeån töø ngoân ngöõ caáp cao sang ngoân ngöõ caáp thaáp theo ñònh nghóa cuûa chöông trình C51. Caùc haøm ngaét coù theå söû duïng caùc registerbank coøn laïi. Tuy nhieân, RTX51 yeâu caàu 6 byte coá ñònh trong khoâng gian registerbank. Caùc registerbank ñöôïc söû duïng bôûi RTX51 Tiny coù theå ñöôïc ñònh nghóa theo bieán caáu hình INT_REGBANK trong thö vieän haøm cuûa chöông trình C51. Ñònh nghóa taùc vuï: Chöông trình thôøi gian thöïc hay ña nhieäm (multitasking) ñöôïc bieân soaïn vôùi moät hoaëc vaøi taùc vuï thöïc hieän rieâng bieät. RTX51 cho pheùp thöïc hieän leân ñeán 16 taùc vuï. Caùc taùc vuï laø nhöõng haøm ñôn cuûa chöông trình C coù giaù trò traû veà daïng void vaø danh saùch caùc ñoái soá daïng void ñöôïc khai baùo thuoäc tính haøm nhö sau: void func (void) _task_ num {…} vôùi num laø soá ID cuûa taùc vuï ñöôïc ñaùnh soá lieân tuïc töø 0 ñeán 15. Caùc haøm thö vieän cuûa RTX51-tiny : Haøm Moâ taû Os-create-task Ghi moät taùc vuï vaøo danh saùch thöïc hieän Os-delete_task Xoùa moät taùc vuï khoûi danh saùch thöïc hieän Os_send_signal Gôûi tín hieäu ñeán moät taùc vuï khaùc töø moät ngaét Os- clear_signal Xoùa tín hieäu ñaõ ñuôïc gôûi Os_running_task_id Trôû veà taùc vuï thöù ID töø taùc vuï hieän haønh Os-wait Taïm döøng taùc vuï hieän haønh vaø ñôïi moät hoaëc vaøi söï kieän nhö: 1 khoaûng thôøi gian qui ñònh, khoaûng thôøi gian nghæ hoaëc tín hieäu töø moät taùc vuï khaùc hay moät ngaét. Os-wait1 Taïm döøng taùc vuï hieän haønh vaø ñôïi moät söï kieän laø tín hieäu töø moät taùc vuï khaùc. Os-wait2 Taïm döøng taùc vuï hieän haønh vaø ñôïi moät hoaëc vaøi söï kieän nhö : 1khoaûng thôøi gian qui ñònh, khoaûng thôøi gian nghæ hoaëc tín hieäu töø moät taùc vuï khaùc hay moät ngaét. Caùc thoâng soá haøm: Haøm os_create_task: #include char os_create_task (unsigned char task_id) /*taùc vuï thöù id*/ Haøm Os-delete_task: #include char os_delete_task (insigned char task_id) Haøm Os_send_signal #include char os_send_signal (insigned char task_id) Haøm Os- clear_signal: #include char os_clear_signal (insigned char task_id) Haøm Os_running_task_id: #include char os_running_task_id (void) Haøm Os-wait: #include char os_wait (unsigned char event_sel, /*event: söï kieän chôø*/ unsigned char ticks, /*khoaûng thôøi gian chôø*/ unsigned int dummy); /*unused argument*/ caùc haèng soá söï kieân laø: K_IVL ñôïi moät khoaûng thôøi gian qui ñònh K_SIG ñôïi moät tín hieäu K_TMO ñôïi moät khoaûng thôøi gian nghæ Os-wait1: #include char os_wait1 (unsigned char event_sel); /*event: söï kieän chôø*/ Haèng soá söï kieän chæ laø K_SIG (ñôïi moät tín hieäu) Os-wait2: char os_wait (unsigned char event_sel, /*event: söï kieän chôø*/ unsigned char ticks); /*khoaûng thôøi gian chôø*/ caùc haèng soá söï kieân laø: K_IVL ñôïi moät khoaûng thôøi gian qui ñònh K_SIG ñôïi moät tín hieäu K_TMO ñôïi moät khoaûng thôøi gian nghæ Chöông 4: BOARD DEMO_KIT Demo_kit laø moät öùng duïng nhoû cuûa chöông trình nhaèm moâ taû moät soá hoaït ñoäng cuûa caùc leänh trong taäp leänh vaø caùc thuû tuïc Protocol ñöôïc xaây döïng trong chöông trình. Board maïch thöïc hieän cho chöông trình Demo_kit goàm caùc khoái sau: Sô ñoà khoái board Demo-Kit KHOÁI XÖÛ LYÙ TRUNG TAÂM (mP) KHOÁI RS-232 KHOÁI INPUT KHOÁI A/D KHOÁI D/A KHOÁI HIEÅN THÒ KHOÁI OUTPUT KHOÁI HIEÅN THÒ: Khoái hieån thò bao goàm 9 led 7ñoaïn ( loaïi catod chung ) xeáp thaønh 3 daõy (moät daõy 3 con) ñeå hieån thò caùc thoâng soá caàn quan saùt. IC choát 74573 xuaát caùc giaù trò caàn hieån thò cho caû 9 led. IC naøy giao tieáp vôùi vi xöû lyù qua port 0, nhoùm ñieän trôû RN1 caàn thieát vì port 0 coù ngoõ ra cöïc thu hôû. IC 4094 ñöôïc söû duïng vôùi muïc ñích choïn led hieån thò. Ñaây laø IC vôùi chöùc naêng laø thanh ghi dòch 8 bit (chuyeån ñoåi döõ lieäu töø noái tieáp sang song song). Lyù do chính cho vieäc söû duïng IC 4094 trong tröôøng hôïp naøy laø tieát kieäm caùc chaân giao tieáp vôùi vi xöû lyù. Ñeå xaùc laäp möùc tích cöïc cho led caàn hieån thò ta laàn löôït dòch vaøo caùc bit 0 hay 1, trong tröôøng hôïp söû duïng led laø catod chung (nhö treân hình veõ ) ñeå choïn led saùng ta dòch vaøo bit 0 (tích cöïc möùc thaáp ). Baûng söï thaät cuûa thanh ghi dòch 8 bit 4094: Inputs Parallel out Serial out CLK OE STR D Q1 … Q8 QS /QS ­ 0 X X HiZ … HiZ Q7n nc ¯ 0 X X HiZ … HiZ nc Q8n ­ 1 0 X nc … nc Q7n nc ­ 1 1 0 0 … Q7n Q7n nc ­ 1 1 1 1 … Q7n Q7n nc ¯ 1 1 1 nc … nc nc Q8n Q7n: traïng thaùi cuûa Q7  tröôùc khi coù xung clock nc: no connect IC ULN2803 duøng ñeå ñeäm doøng. KHOÁI GIAO TIEÁP A/D VAØ D/A: KHOÁI A/D: Khoái giao tieáp A/D coù nhieäm vuï ñoïc veà töø ngoõ input caùc giaù trò analog ño ñaït ñöôïc töø caùc ñoái töôïng ñieàu khieån beân ngoaøi (tín hieäu töø caûm bieán, giaù trò ñieän aùp...) ñöôïc chuyeån ñoåi thaønh soá digital ñeå ñöa vaøo caùc thanh ghi cuûa vi xöû lyù. Giôùi thieäu ADC0809 : ADC 0809 laø thieát bò chuyeån ñoåi analog sang digital 8 bit, multiplex 8 keânh vaø töông thích vôùi boä vi xöû lyù. ADC0809 söû duïng kyõ thuaät chuyeån ñoåi A/D xaáp xæ lieân tieáp. Khaû naêng Giao tieáp deã daøng vôùi taát caû caùc boä vi xöû lyù . Hoaït ñoäng vôùi thang ño tyû leä vôùi 5VDC hoaëc ñieän aùp chuaån coù theå ñieàu chænh . Khoâng caàn chænh khoâng hay toaøn thang . Multiplex 8 keânh vôùi ñòa chæ logic . Taàm ñieän aùp vaøo 0-5V vôùi nguoàn cung caáp ñôn 5V. Ngoõ ra phuø hôïp voùi möùc ñieän aùp TTL. Ñoä phaân giaûi : 8 bit. Sai soá khoâng ñieàu chænh ñöôïc toång coäng : ± 1 LSB Nguoàn cung caáp ñôn : 5VDC. Coâng suaát thaáp : 15mW. Thôøi gian chuyeån ñoåi : 100ms Ñaëc tính kyõ thuaät: Kyù hieäu Thoâng soá Ñieàu kieän Toái thieåu Ñieån hình Toái ña Ñôn vò VREF+ Ñieän aùp cao nhaát cuûa thang ño VCC VCC+0.1 V VREF- Ñieän aùp thaáp nhaát cuûa thang ño -0.1 0 V IIN Doøng vaøo fCLK=640KHz -2 ±0.5 2 mA VIN(1) Ñieän aùp vaøo logic 1 VCC -1.5 V VIN(0) Ñieän aùp vaøo logic 0 1.5 V VOUT(1) Ñieän aùp ra logic 1 IOUT=-360uA VCC -0.4 V VOUT(0) Ñieän aùp ra logic 0 IOUT= 1.6mA 0.45 V fCLK Taàn soá xung clock 10 640 1280 KHz tEOC Thôøi gian delay EOC (Xem giaûn ñoà xung) 0 8 +2ms Chu kyø clock tC Thôøi gian bieán ñoåi FCLK=640KHz 90 100 116 ms tWS Ñoä roäng xung Start toái thieåu (Xem giaûn ñoà thôøi gian) 100 200 Ns tALE Ñoä roäng xung ALE toái thieåu (Xem giaûn ñoà thôøi gian) 100 200 ns Moâ taû chöùc naêng Maïch choïn keânh(multiplexer) Moãi keânh ngoõ vaøo rieâng bieät ñöôïc choïn baèng caùch giaûi maõ ñòa chæ theo baûng sau: Keânh analog ñöôïc choïn Ñòa chæ A2 A1 A0 IN0 0 0 0 IN1 0 0 1 … IN7 1 1 1 Ñòa chæ ñöôïc choát vaøo boä giaûi maõ beân trong taïi caïnh leân cuûa xung choát ñòa chæ (ALE). Ñaëc tính chuyeån ñoåi: Thanh ghi xaáp xæ lieân tieáp cuûa boä bieán ñoåi A/D ñöôïc reset taïi caïnh leân cuûa xung start (baét ñaàu chuyeån ñoåi). Söï cguyeån ñoåi ñöôïc baét ñaàu taïi caïnh xuoáng cuûa xung start. Quaù trình chuyeån ñoåi seõ bò ngaét neáu nhaän moät xung start môùi. Söï chuyeån ñoåi lieân tieáp coù theå ñöôïc thöïc hieän baèng caùch noái ngoõ ra EOC (End Of Convert – Keát thuùc chuyeån ñoåi) vaøo ngoõ start. Neáu söû duïng cheá ñoä naøy, moät xung start beân ngoaøi phaûi ñöôïc cung caáp sau khi baät nguoàn. Xung EOC seõ xuoáng möùc thaáp sau khi caïnh leân cuûa xung start töø 0 ñeán 8 xung clock vaø leân möùc cao khi vieäc chuyeån ñoåi ñaõ xong. Bieåu thöùc chuyeån ñoåi: Data ngoõ ra laø moät soá nguyeân N naèm trong taàm: VIN - VREF (-) VREF(+) - VREF (-) N= x 256 ± ñoä chính xaùc tuyeät ñoái Maïch taïo dao ñoäng cho ADC0809: Bieát taàn soá xung clock cuûa ADC0809 naèm trong khoaûng töø 10KHz ñeán 1280 KHz, neân taàn soá xung clock trong maïch ñöôïc laáy töø taàn soá dao ñoäng chuaån cuûa thaïch anh, ñöa qua IC ñeám 74393 vôùi coâng duïng laø IC chia taàn soá. Caùc ngoõ ra QA, QB, QC, QD laàn löôït chia taàn soá xung clock vaøo vôùi 2, 4, 8, 16. Vaäy taàn soá ra 74393 (vaøo xung clock ADC 0809) laø: 691.2KHz 11.0592MHz 16 = KHOÁI D/A: Khoái D/A giao tieáp vôùi vi xöû lyù vôùi nhieäm vuï chuyeån ñoåi caùc giaù trò digital trong caùc thanh ghi cuûa vi xöû lyù thaønh caùc giaù trò analog vaø xuaát ra caùc ñoái töôïng ñieàu khieån beân ngoaøi. Hoï DAC0808 (DAC0808/ DAC0807/ DAC0806) laø boä bieán ñoåi digital sang analog 8 bit, coù thôøi gian xöû lyù doøng ra toaøn thang laø 150ns, coâng thöùc tieâu thuï chæ 33mw vôùi nguoàn ±5V. Hoï DAC0808 giao tieáp tröïc tieáp vôùi caùc möùc logic thoâng duïng nhö TTL, DTL hoaëc CMOS. Khaû naêng Ñoä chính xaùc töông ñoái :±0.19% (8 bit) vôùi DAC0808 Ñoä chính xaùc 6-bit vaø 7-bit vôùi DAC0806 vaø DAC0807 Thôøi gian xöû lyù nhanh : 150 ns Ngoõ vaøo digital khoâng ñaûo töông thích TTL vaø CMOS Toác ñoä queùt cao : 8 mA/ms Taàm ñieän aùp cung caáp : ± 4.5V ñeán ± 18V Coâng suaát tieâu thuï thaáp : 33 mW vôùi nguoàn ± 5V Trò soá toái ña Nguoàn cung caáp : VCC=+ 18 VDC VEE =- 18 VDC Ñieän aùp ngoõ vaøo digital (V5-V12):-10VDC ñeán +18VDC Ñieän aùp ngoõ ra ñöôïc duøng (V0):-11 VDC ñeán +18 VDC Doøng chuaån (I14): 5 mA Ñieän aùp vaøo chuaån (V14,V15) : VCC,VEE Hoaït ñoäng cô baûn: Doøng ñieän chuaån ñöôïc taïo ra baèng moät trong hai caùch : chuaån döông hoaëc chuaån aâm. Vref döông Vref aâm DAC0808 DAC0808 Hình a: Hình b: Doøng ñieän vaøo chuaån I14, phaûi luoân luoân chaïy vaøo chaân 14, baát chaáp caùch boá trí hoaëc cöïc tính nguoàn aùp chuaån . Caùch keát noái vôùi aùp döông nhö treân hình a. Vôùi tín hieäu chuaån luôõng cöïc, R15 coù theå ñöôïc noái vôùi nguoàn aâm . Trò soá cuûa tuï buø phaûi taêng khi R14 taêng ñeå duy trì leà pha thích hôïp . Ví duï vôùi R15 laø 1,2.5 vaø 5K thì trò toái thieåu cuûa tuï laø 15,37 vaø 75pF. Tuï coù theå noái ñeán VEE hoaëc ñaát . Aùp chuaån aâm coù theå ñöôïc söû duïng neáu R14 ñöôïc noái ñaát vaø chuaån ñöôïc noái ñeán R15 nhö hình b . Phöông phaùp naøy coù thuaän lôïi chính laø toång trôû vaøo cao (taïi chaân 15). DAC0808 laø boä bieán ñoåi A/D taïo ra doøng ñieän coù trò soá tuyø theo giaù trò digital vaø doøng ñieän chuaån ngoõ vaøo . Doøng ñieän chuaån coù theå coù trò soá coá ñònh hoaëc thay ñoåi töø gaàn 0 ñeán 4 mA .Doøng ngoõ ra toaøn thang (IFS – Full scale) laø moät haøm tuyeán tính cuûa doøng chuaån vaø cho bôûi : IFS= IREF vôùi I14= I14= VREF Doøng ñieän ra: IOUT= IREF x giaù trò digital ngoõ vaøo R15 (thoâng thöôøng baèng R14) ñöôïc söû duïng ñeå loaïi boû sai soá doøng phaân cöïc. R15 coù theå boû ñi, khi ñoù chæ taêng sai soá moät ít. Khi duøng ñieän aùp chuaån DC thì neân söû duïng tuï bypasss xuoáng ñaát. KHOÁI RS-232: Khoái naøy thöïc hieän vieäc giao tieáp döõ lieäu giöõa maùy tính PC vaø vi xöû lyù söû duïng IC MAX 232 qua coång noái tieáp cuûa maùy tính treân hai ñöôøng TXD vaø RXD. Ta thaáy raèng MAX232 caàn coù 4 tuï ngoaøi (maéc vaøo giöõa C1+ vaø C1-, C2+ vaø C2-, V+ vaøo nguoàn döông, V- vaøo ñaát)ñeå bieán ñoåi ñieän aùp töø 0V ñeán 5V thaønh ñieän aùp -12V ñeán +12V phuø hôïp cho truyeàn thoâng theo chuaån RS-232. Ngoaøi ra, beân trong MAX 232 coù 4 boä khueách ñaïi ñaûo nhaèm chuyeån töø möùc logic TTL ra chuaån RS-232 vaø ngöôïc laïi. Sô ñoà sau ñaây cho thaáy caùc khoái beân trong MAX232 vaø caùc linh kieän maéc beân ngoaøi theo daïng chuaån : RS-232 OUTPUT Sô ñoà beân trong IC MAX-232 KHOÁI RÔLE: Caùc ngoõ ra output cuûa kit vi xöû lyù ñöôïc noái vôùi caùc Rôle ñeå ñieàu khieån ñoùng ngaét caùc thieát bò ñieän. Trong töøng öùng duïng cuï theå caùc rôle seõ ñöôïc keát noái ñeán caùc ñoái töôïng caàn ñieàu khieån. Cuõng nhö khoái hieån thò, ñeå tieát kieäm caùc chaân vi xöû lyù caùc tín hieäu ñieàu khieån rôle ñöôïc laáy töø 1 chaân port cuûa vi xöû lyù vaø dòch vaøo caùc rôle qua thanh ghi dòch 8 bit 4094 (chuyeån döõ lieäu töø daïng noái tieáp sang song song) duøng IC ñeäm ULN2803. KHOÁI INPUT: Khoái input bao goàm 4 nuùt nhaán vaø 4 ñaàu vaøo töï do (laáy tín hieäu töø beân ngoaøi vaøo coù caùch ly bôûi PC817 ). Ngöôïc vôùi khoái hieån thò vaø rôle, caùc ngoõ vaøo input ñöôïc noái qua IC 4021 cuõng laø moät loaïi thanh ghi dòch 8 bit nhöng chuyeån döõ lieäu vaøo töø daïng song song sang noái tieáp. Caùc ngoõ vaøo input ñöôïc ñoïc veà töøng bit theo xung clock cuûa thanh ghi dòch 4021 vaø ñöôïc chuyeån vaøo chaân P3.2 cuûa vi xöû lyù. Chöông 5: CHÖÔNG TRÌNH PHAÀN 1: TAÄP LEÄNH GIÔÙI THIEÄU TAÄP LEÄNH : Vieäc thu thaäp döõ lieäu vaø ñieàu khieån töø xa laø moät vaán ñeà ñaùng ñöôïc quan taâm trong lónh vöïc ñieàu khieån töï ñoäng. Tuy nhieân, thaät phieàn haø neáu nhö khoâng coù moät söï thoáng nhaát chung veà caâu leänh trong quaù trình trao ñoåi thoâng tin. Vì theá, moät phaàn noäi dung chính cuûa ñeà taøi laø xaây döïng ñöôïc moät taäp leänh trong giao tieáp döõ lieäu giöõa maùy tính vôùi vi xöû lyù vaø söû duïng ñöôïc noù. Vieäc xaây döïng taäp leänh giao tieáp RS-232 naøy ñöôïc xem nhö moät mong muoán taïo ra moät caâu leänh chung trong giao tieáp döõ lieäu giöõa maùy tính vaø vi xöû lyù veà maët ngoân ngöõ. Ñaây laø moät phöông tieän giao tieáp giöõa maùy tính vaø vi xöû lyù, nhaèm giuùp cho ngöôøi söû duïng khoâng phaûi maát nhieàu thôøi gian laäp trình laïi töø ñaàu moãi khi muoán thöïc hieän vaán ñeà giao tieáp maø vieäc trao ñoåi thoâng tin vaãn coù theå xaûy ra deã daøng thoâng qua vieäc söû duïng taäp leänh naøy. Taäp leänh ñöôïc xaây döïng bao goàm caùc leänh xuaát nhaäp ñaày ñuû caùc daïng tín hieäu nhö: tín hieäu daïng möùc, tín hieäu daïng xung, tín hieäu daïng analog/digital giuùp vieäc trao ñoåi thoâng tin khoâng bò giôùi haïn vaø ñoái töôïng ñieàu khieån (töø kit vi xöû lyù) cuõng ñöôïc phong phuù hôn. Ngoaøi ra, taäp leänh coøn coù moät soá leänh ñieàu khieån vaø quan saùt quaù trình hoaït ñoäng cuûa heä thoáng nhö: bieán caøi ñaët daïng soùng ngoõ ra (Kx), counter (Cx), döõ lieäu (Dx), bieán traïng thaùi xaùc laäp cheá ñoä hoaït ñoäng töø PC hay töø KIT (Sx) vaø bieán thöïc thi hieån thò cheá ñoä hoaït ñoäng RUN/STOP (Mx) giuùp cho quaù trình hoaït ñoäng cuûa heä thoáng dieãn ra moät caùch chaët cheõ, deã quan saùt vaø deã quaûn lyù hôn. NOÄI DUNG TAÄP LEÄNH: Caùc leänh ñöôïc xaây döïng trong taäp leänh giao tieáp RS-232 naøy nhìn chung chæ bao goàm caùc leänh giao tieáp döõ lieäu laø xuaát vaø nhaäp. Ñoái vôùi caùc leänh gôûi döõ lieäu veà maùy tính (PC): noäi dung döõ lieäu ñöôïc kit vi xöû lyù thu thaäp töø caùc ñoái töôïng ñieàu khieån beân ngoaøi ví duï nhö giaù trò dieän aùp, xung ñieàu khieån hoaëc caùc giaù trò ño ñöôïc töø caûm bieán v.v… vaø ñöa vaøo caùc vuøng ñòa chæ ñònh saün tuøy thuoäc vaøo daïng cuûa tín hieäu thu vaøo (daïng möùc, xung hay A/D) vaø gôûi ñeán PC moãi khi coù yeâu caàu. Ñoái vôùi caùc leänh gôûi döõ lieäu töø PC ñeán vi xöû lyù: noäi dung döõ lieäu nhaän veà töø PC, ví duï nhö caùc thoâng soá ñieàu khieån ñöôïc caøi ñaët saün, cuõng ñöôïc ñöa vaøo caùc vuøng ñòa chæ rieâng öùng vôùi caùc daïng döõ lieäu nhaän vaøo. Caùc giaù trò döõ lieäu naøy coù theå ñöôïc duøng ñeå ñieàu khieån caùc ñoái töôïng beân ngoaøi khaùc tuøy thuoäc vaøo öùng duïng cuï theå cuûa chöông trình. Caùc leänh khoâng mang döõ lieäu ñöôïc PC gôûi ñeán vi xöû lyù laø caùc leänh yeâu caàu vi xöû lyù gôûi döõ lieäu, caùc leänh khoâng mang döõ lieäu töø vi xöû lyù gôûi veà PC laø caùc leänh traû lôøi ñaõ nhaän ñöôïc noäi dung PC vöøa gôûi vì vi xöû lyù khoâng coù chöùc naêng yeâu caàu döõ lieäu. Baûng moâ taû caùc vuøng ñòa chæ cuûa board VXL: Stt Vuøng ñòa chæ Soá byte Daïng döõ lieäu Moâ taû 1 I0-I1 2x2 2 byte daïng ASCII Input möùc-16 ngoõ vaøo(bit) 2 N0-N1 2x5 5 byte daïng ASCII Input xung-2 ngoõ vaøo(99.999Hz max) 3 Q0-Q1 2x5 5 byte daïng ASCII Ngoõ vaøo A/D – 2 ngoõ vaøo (99.999max) 4 U0-U1 2x5 5 byte daïng ASCII Ngoõ vaøo A/D - 2 ngoõ vaøo (±4.999max) 5 O0-O1 2x2 2 byte daïng ASCII Output möùc-16 ngoõ ra(bit) 6 P0-P1 2x5 5 byte daïng ASCII Output xung-2 ngoõ ra (99.99Hz max) 7 A0-A1 2x5 5 byte daïng ASCII Ngoõ ra D/A-2 ngoû ra (99.999max) 8 K0-K7 8x2 2 byte daïng ASCII Bieán caøi ñaët 9 C0-C7 8x4 4 byte daïng ASCII Counter 10 D0-D7 8x2 2 byte daïng ASCII Döõ lieäu 11 S0-S7 8x1 1 byte daïng ASCII Bieán traïng thaùi 12 M0-M7 8x1 1 byte daïng ASCII Bieán thöïc thi Baûng moâ taû caùc leänh chuaån: Stt Leänh töø PC Phaûn hoài töø VXL Moâ taû(cho PC) 1 I¿ Ix¿ I0’B’I1’B’¿ Ix’B’¿ Ñoïc ngoõ vaøo caùc Digital input. x=0hay1(daïng ASCII) 2 N¿ Nx¿ N0’BBBBB’N1’BBBBB’¿ Nx’BBBBB’¿ Ñoïc ngoõ vaøo caùc puls Input. x=0hay1(daïng ASCII) 3 Q¿ Qx¿ Q0’BBBBB’Q1’BBBBB’¿ Qx’BBBBB’¿ Ñoïc ngoõ vaøo caùc A/D Input (ñôn cöïc). x=0 hay 1 (daïngASCII) 4 U¿ Ux¿ U0’BBBBB’U1’BBBBB’¿ Ux’BBBBB’¿ Ñoïc ngoõ vaøo caùc A/D Input (löôõng cöïc). x=0 hay 1 (daïngASCII) 5 Ox’B’¿ Ox¿ Xuaát ngoõ ra caùc Digital Output. x=0 hay 1 (daïng ASCII) 6 Px’BBBBB’¿ Px¿ Xuaát ngoõ ra caùc PWM. x=0 hay 1 (daïng ASCII) 7 Ax’BBBBB’¿ Ax¿ Xuaát ngoõ ra caùc D/A. x=0 hay 1 (daïng ASCII) 8 Kx¿ Kx’BB’¿ Ñoïc ngoõ vaøo bieán caøi ñaët.x=0 ñeán 7 (daïng ASCII) 9 Cx¿ Cx’BBBB’¿ Ñoïc ngoõ vaøo giaù trò counter x=0 ñeán 7 (daïng ASCII) 10 D’BB’x¿ Dx¿ Xuaát döõ lieäu ra.x=0 ñeán 7 (daïng ASCII) 11 Sx¿ Sx’B’¿ Ñoïc ngoõ vaøo bieán traïng thaùi. x=0 ñeán 7 (daïng ASCII) 12 Mx’B’¿ Mx¿ Xuaát ngoõ ra bieán thöïc thi.x=0 ñeán 7 (daïng ASCII) Ghi chuù: ’BBBBB’: soá byte döõ lieäu cuûa caùc vuøng ñòa chæ luoân ñöôïc goïi ôû daïng ASCII ; x laø chæ soá ñi keøm theo caùc kyù töï chæ vuøng ñòa chæ nhaèm môû roäng caùc vuøng ñòa chæ coù cuøng chöùc naêng. PHAÀN 2: MOÂ TAÛ CHÖÔNG TRÌNH Buffer user Giao tieáp RS-232 Chöông trình xöû lyù döõ lieäu 1 2 3 4 LÖU ÑOÀ CHÖÔNG TRÌNH TOÅNG QUAÙT 1: Döõ lieäu nhaän veà töø PC 2: Döõ lieäu gôûi ñeán PC 3: Keát quaû xöû lyù 4: Yeâu caàu xöû lyù Khoái giao tieáp RS-232: Nhaän chuoãi töø PC Kieåm tra. Ñoùng goùi döõ lieäu (truyeàn) Truyeàn döõ lieäu ñaõ ñoùng goùi ñeán PC Khoái buffer user: Ñaây laø vuøng ñeäm cho caùc chöông trình öùng duïng. Khoái naøy thöïc hieän löu tröõ vaø truy xuaát döõ lieäu töø caùc vuøng döõ lieäu quy ñònh trong taäp leänh. Caùc chöông trình thöïc hieän trong khoái naøy laø: Ghi giaù trò A/D vaøo vuøng ñòa chæ Q0. Ghi traïng thaùi hoaït ñoäng töø Kit hay PC ñoïc töø ngoõ vaøo input 1 ñöa vaøo oâ nhôù S0. Cheá ñoä Run/Stop nhaän töø PC ñöa vaøo oâ nhôù ñòa chæ M0. Caùc ngoõ vaøo input 2,3,4 caøi ñaët daïng soùng ra ñöa vaøo vuøng nhôù ñòa chæ K0. Trò ñænh cuûa daïng soùng ra ñöa vaøo oâ nhôù döõ lieäu ñòa chæ D0. Khoái chöông trình xöû lyù döõ lieäu: Khoái naøy thöïc hieän caùc chöông trình öùng duïng cho heä thoáng. Tuøy caùc yeâu caàu cuï theå ñaët ra maø noù thöïc hieän nhieàu hay ít chöùc naêng. Sô ñoà khoái toång quaùt cho nhoùm chöông trình trtong öùng duïng naøy laø: Hieån thò Chöông trình xöû lyù Taïo daïng soùng ra Ñoïc A/D Xuaát D/A Ñoïc input Xuaát output Buffer user Böôùc ñaàu trong giao tieáp döõ lieäu giöõa maùy tính vaø vi xöû lyù ñöôïc thöïc hieän bôûiø vieäc gôûi chuoãi döõ lieäu töø maùy tính. Do ñoù, kit vi xöû lyù chæ thöïc hieän vaø traû lôøi theo yeâu caàu cuûa maùy tính gôûi ñeán. CHÖÔNG TRÌNH NHAÄN CHUOÃI TÖØ PC: Nhö ñaõ giôùi thieäu ôû chöông Protocol, frame döõ lieäu gôûi ñi luoân ñöôïc baét ñaàu bôûi moät byte header cho caû hai höôùng truyeàn (töø PC vaø vi xöû lyù). Vì theá, ñeå traùnh maát thôøi gian neáu phaûi nhaän vaøo caû chuoãi maø ngay ôû byte ñaàu tieân ñaõ khoâng ñuùng, neân tröôùc tieân ta chæ nhaän veà vaø kieåm tra byte header. Vieäc nhaän döõ lieäu chæ ñöôïc tieáp tuïc thöïc hieän khi byte header laø ñuùng. Ngoaøi ra cuõng coù moät soá raøng buoäc keøm theo cho quaù trình nhaän chuoãi, laø ôû laàn nhaän sau phaûi ñaûm baûo raèng döõ lieäu nhaän vaøo laàn tröôùc ñoù ñaõ ñöôïc kieåm tra vaø xöû lyù. Ñieàu kieän naøy ñaët ra nhaèm muïc ñích baûo toaøn caùc giaù trò nhaän veà töø PC, vì neáu vieäc nhaän döõ lieäu vaøo cöù dieãn ra lieân tuïc maø quaù trình kieåm tra vaø xöû lyù khoâng ñaùp öùng kòp, thì seõ xaûy ra tröôøng hôïp döõ lieäu ôû laàn nhaän sau seõ ñeø leân döõ lieäu nhaän veà tröôùc ñoù. Nhö vaäy, quaù trình thöïc hieän seõ boû soùt moät vaøi tröôøng hôïp xöû lyù töùc heä thoáng hoaït ñoäng khoâng toái öu. Ñieàu naøy chæ thaät söï caàn thieát ñoái vôùi heä thoáng thöïc hieän theo heä thôøi gian thöïc (multitasking) vì caùc coâng vieäc trong chöông trình ñöôïc thöïc hieän song song nhau. Max=chieàu daøi toái ña cuûa chuoãi cho pheùp nhaäp vaøo Kieåm tra byte Header Kieåm tra vuøng ñeäm thu coù döõ lieäu khoâng Côø nhaän=0 ? Nhaän vaøo 4 byte ñaàu cuûa chuoãi x[i] N=x[3]+4 (chieàu daøi cuûachuoãi döõ lieäu+ 4byte header&control fiels) N<=max? i=0àn Nhaän chuoãi x[i] vaøo vuøng ñeäm thu i=0àmax Nhaän chuoãi x[i] vaøo vuøng ñeäm thu END Khoâng coù Sai Ñuùng N Y Chöông trình nhaän chuoãi töø PC CHÖÔNG TRÌNH KIEÅM TRA: Vieäc kieåm tra chuoãi döõ lieäu nhaän veà chuû yeáu laø kieåm tra caáu truùc frame coù phuø hôïp vôùi ñònh nghóa khoâng, vaø chuyeån caùc giaù trò döõ lieäu nhaän vaøo ñeán vuøng ñòa chæ khaùc, ñoàng thôøi cho pheùp heä thoáng tieáp tuïc nhaän döõ lieäu vaøo neáu coù. Taùc vuï naøy ñöôïc thöïc hieän moãi khi coù chuoãi môùi ñöôïc nhaän vaøo. Cothu=1? (hoaøn taát coâng vieäc nhaän chuoãi?) Bit b0=bit thaáp nhaát cuûa byte bufin[2] Bit b0=0? (chuoãi nhaän vaøo coù döõ lieäu?) Soá byte döõ lieäu (bufin[3])>1? Keát quaû nhaän ñuùng Keát quaû nhaän sai Soá byte döõ lieäu (bufin[3])>1? Cothu=0(ñöôïc pheùp nhaän chuoãi môùi) RET Chuoãi buffer[]=chuoãi bufin[] Y Y Y Y N N N N CHÖÔNG TRÌNH XÖÛ LYÙ TAÄP LEÄNH: Chöông trình xöû lyù taäp leänh böôùc ñaàu thöïc hieän vieäc kieåm tra moät soá byte control fiels ñöôïc nhaän veà töø PC nhaèm traùnh söï truøng laëp trong quaù trình xöû lyù. Vì theo giao thöùc truyeàn thoâng ñaët ra (protocol), neáu trong khoaûng thôøi gian vaø soá laàn nhaéc laïi qui ñònh, keå töø sau khi PC gôûi moät yeâu caàu ñeán maùy tính, maø PC vaãn khoâng nhaän ñöôïc keát quaû phaûn hoài theo mong muoán ( loãi naøy coù theå xaûy ra khi kit vi xöû lyù khoâng nhaän ñaày ñuû döõ lieäu gôûi ñeán töø PC, coù theå do caùc byte control fiel khoâng ñöôïc xaùc laäp ñuùng qui ñònh … ) hoaëc keát quaû nhaän veà töø khoái vi xöû lyù baùo loãi thì noù gôûi laïi frame truyeàn môùi, maø frame gôûi laïi naøy mang ñaày ñuû thoâng tin vöøa roài cho khoái vi xöû lyù (xem chi tieát trong phaàn protocol). Tuy nhieân, khoâng phaûi baát cöù khi naøo PC khoâng nhaän ñöôïc frame truyeàn mang theo thoâng tin traû lôøi töø vi xöû lyù ñeàu xem laø loãi maø coù theå do gaëp söï coá veà vaán ñeà thôøi gian. Trong tröôøng hôïp ñoù, chöông trình khoâng xöû lyù laïi töø ñaàu maø tieáp tuïc coâng vieäc xöû lyù cuõ. Neân böôùc kieåm tra naøy giaûi ñaùp cho caâu hoûi khoái vi xöû lyù coù nhaän ñöôïc vaø coù xöû lyù yeâu caàu vöøa roài khoâng? Tieáp theo quaù trình kieåm tra, vieäc xöû lyù taäp leänh seõ thöïc hieän döïa treân caùc keát quaû cuûa quaù trình xöû lyù theo chöùc naêng cuï theå cho töøng heä thoáng ñöôïc ñöa vaøo caùc vuøng nhôù vaø söû duïng caùc leänh ñöôïc xaây döïng trong taäp leänh. N Löu ñoà: chöông trình xöû lyù öùng duïng taäp leänh Bit b1=buffer[2]&0x02 Frame gôûi laàn ñaàu (b1=0)? buffer[4] ≠ ñòachæ[0]? Vaø buffer[5] ≠ ñòachæ[1]? Ñòachæ[0]=buffer[4] Ñòachæ[1]=buffer[5] Goïi taäp leänh Côø xöû lyù =1 (xöû lyù xong) RET Y Y N N Keát quaû nhaän ñuùng ? Y Frame nhaän vaøo coù döõ lieäu ? Y N START CHÖÔNG TRÌNH ÑOÙNG GOÙI DÖÕ LIEÄU: Chöông trình ñoùng goùi döõ lieäu laø taïo ra moät frame truyeàn traû veà cho PC moãi khi nhaän yeâu caàu gôûi ñeán töø noù. Frame naøy cuõng tuaân theo qui ñònh cuûa caùc byte control fiel, vaø coù thoâng baùo keát quaû cuûa laàn nhaän vöøa roài. Ñoái vôùi frame gôûi veà töø vi xöû lyù, maõ ID laø maõ cuûa frame nhaän töø PC. Ngoaøi ra, vieäc ñoùng goùi döõ lieäu coøn nhaèm muïc ñích laø ñaûm baûo trong quaù trình gôûi 1 khung döõ lieäu töø Kit veà PC neáu coù söï giaùn ñoaïn naøo xaûy ra (1 chöông trình interrupt chaúng haïn ) thì söï thay ñoåi giaù trò cuûa moät bieán baát kyø cuõng khoâng gaây aûnh höôûng ñeán döõ lieäu truyeàn, tuy tröôøng hôïp naøy chæ xaûy ra vôùi xaùc suaát thaáp vì toác ñoä truyeàn döõ lieäu raát cao nhöng noù cuõng laø moät khuyeát ñieåm ñaùng chuù yù cuûa chöông trình neáu khoâng ñöôïc quan taâm ñeán. Quaù trình ñoùng goùi döõ lieäu vaø traû lôøi cho PC khoâng phuï thuoäc vaøo chöông trình xöû lyù veà maët thôøi gian. Noù ñöôïc thöïc hieän sau khi hoaøn taát chöông trình kieåm tra frame nhaän vaøo, keát quaû cuûa quaù trình xöû lyù seõ quyeát ñònh noäi dung gôûi veà cho PC, soá byte döõ lieäu laø khoâng neáu chöông trình xöû lyù vaãn ñang thöïc hieän taïi thôøi ñieåm ñoùng goùi. Bufout[0]=header Bufout[1]=bufin[1] Khôûi taïo bufout[2]=0x80 Keát quaû nhaän ñuùng? Bit b2=0 (bufout[2]=. . . b2b1b0) Xöû lyù xong? Bit b0=0 Bufout[3]=chieàu daøi chuoãi döõlieäu Bufout[i+4]=dulieu[i] Gôûi chuoãi bufout Bit b2=1 (bufout[2]=. . . b2b1b0) Bufout[3]=0(chieàu daøi chuoãi döõlieäu=0) Bit b0=0 Bufout[3]=0(chieàu daøi chuoãi döõlieäu=0) Y Y N N CHÖÔNG TRÌNH DEMO-KIT: Chöông trình xöû lyù cho öùng duïng Demo-kit luoân phaûi caäp nhaät ngoõ vaøo input 1 töø switch ñeå bieát cheá ñoä hoaït ñoäng cuûa heä thoáng laø Kit hay PC. Chöông trình xöû lyù ñöôïc baét ñaàu khi nhaän ñöôïc tín hieäu RUN vaø keát thuùc taïi STOP do PC gôûi ñeán. Caùc ngoõ vaøo Input 2, 3, 4 ñöôïc ñoïc veà töø switch neân ñöôïc thöïc hieän theo möùc öu tieân (töø 2 ñeán 4) neáu coù nhieàu ngoõ vaøo cuøng tích cöïc. Neáu taïi moät thôøi ñieåm maø khoâng coù daïng soùng ra naøo ñöôïc choïn thì heä thoáng ôû cheá ñoä chôø vaø coù thoâng baùo ra PC. Caùc daïng soùng ngoõ ra chæ nhaèm muïc ñích minh hoïa cho öùng duïng cuûa vieäc söû duïng taäp leänh neân noù ñöôïc xaây döïng raát ñôn giaûn vôùi caùc daïng soùng ngoõ ra coù ñoä doác khoâng ñoåi . CAÙC DAÏNG SOÙNG NGOÕ RA End Ñoïc ngoõ vaøo input 1 töø kit ñeå choïn cheá ñoä hoaït ñoäng Traïng thaùi RUN? Y Input 1=1 Hoaït ñoäng töø kit Ñoïc caùc ngoõ vaøo input 2,3,4 töø data switch input 2=1? Soùng ra daïng raêng cöa leân Soùng ra daïng raêng cöa xuoáng Cheá ñoä chôø input4=1? Y Y Soùng ra daïng noùn Y input3=1? N N N N Hoaït ñoäng töø PC Ñoïc caùc ngoõ vaøo input 2,3,4 PC truyeàn veà Y N Löu ñoà: Soùng ra daïng noùn Caøi ñaët trò ñænh Soùng ra =0 Soùng ra < trò ñænh Taêng soùng ra Y Y N Timer = 100ms N Caøi ñaët trò ñænh Soùng ra =trò ñænh Soùng ra ¹0? Giaûm soùng ra Y Y N Timer = 100ms N Soùng ra daïng raêng cöa xuoáng Soùng ra daïng raêng cöa leân

Các file đính kèm theo tài liệu này:

  • docLuan van.doc