Các modem được sử dụng từ những ngày đầu sự ra đời của máy tính. Từ Modem là một từ được hình thành từ hai từ Modulator và Demodulator. Và định nghĩa đặc trưng này cũng giúp ta hình dung được phần nào là thiết bị này sẽ làm cái gì. Dữ liệu số thì đến từ một DTE, thiết bị dữ liệu đầu cuối được điều chế theo cái cách mà nó có thể được truyền dữ liệu qua các đường dây truyền dẫn. Ở một mặt khác của đường dây, một modem thứ hai điều chế dữ liệu đến và xúc tiến, duy trì nó.
Khi chúng ta xem trong RS232 thì chuẩn RS232 miêu tả một kênh tryuền thông với bộ kết nối 25 chân DB25, nó được thiết kế để thực thi quá trình truyền các lệnh đến modem được kết nối với nó. Thao tác này bao gồm cả các lệnh quay một số điện thoại nào đó. Đó là các quá trình dùng RS232 với chi phí thấp này chỉ thể hiện trên các máy tính ở các hộ gia đình trong những năm 70, và kênh truyền thông thứ 2 không được thực thi. Thế nên nhất thiết phải có một phương pháp được thiết lập để sử dụng kênh dữ liệu hiện tại để không chỉ truyền dữ liệu từ một điểm đầu cuối này tới một điểm đầu cuối khác mà nó còn nhắm tới modem duy
nhất. Dennis Hayes đã đưa ra giải pháp cho vấn đề này trong năm 1977. Modem thông minh( Smartmodem ) của ông sử dụng chuẩn truyền thông RS232 đơn giản kết nối tới một máy tính để truyền cả câu lệnh và dữ liệu. Bởi vì mỗi lệnh bắt đầu với chữ AT trong chữ Attention nên ngôn ngữ điều khiển được định nghĩa bởi Hayes nhanh chóng đượcc biết đến với bộ lệnh Hayes AT. Chính vì sự đơn giản và khả năng thực thi với chi phí thấp của nó, bộ lệnh Hayes AT nhanh chóng được sử dụng phổ biến trong các modem của các nhà sản xuất khác nhau. Khi chức năng và độ tích hợp của các modem ngày càng tăng cùng thời gian, nên làm cho ngôn ngữ lệnh Hayes AT càng phức tạp. Vì thế nhanh chóng mỗi nhà sản xuất modem đã sử dụng ngôn ngữ riêng của ông ấy. Ngày nay bộ lệnh AT bao gồm cả các lệnh về dữ liệu, fax, voice và các truyền thông SMS.
Các lệnh AT là các hướng dẫn được sử dụng để điều khiển một modem. AT là một cách viết gọn của chữ Attention. Mỗi dòng lệnh của nó bắt đầu với “AT” hay “at”. Đó là lý do tại sao các lệnh modem được gọi là các lệnh AT. Nhiều lệnh của nó được sử dụng để điều khiển các modem quay số sử dụng dây nối (wired dial-up modems), chẳng hạn như ATD (Dial), ATA (Answer), ATH (Hool control) và ATO (return to online data state), cũng được hỗ trợ bởi các modem GSM/GPRS và các điện thoại di động.
Bên cạnh bộ lệnh AT thông dụng này, các modem GSM/GPRS và các điện thoại di động còn được hỗ trợ bởi một bộ lệnh AT đặc biệt đối với công nghệ GSM. Nó bao gồm các lệnh liên quan tới SMS như: AT+ CMGS (gửi tin nhắn SMS), AT+CMSS (gửi tin nhắn SMS từ một vùng lư trữ), AT+CMGL( liệt kê các tin nhắn SMS) và AT+CMGR (đọc tin nhắn SMS).
Ngoài ra, các modem GSM còn hỗ trợ một bộ lệnh AT mở rộng. Những lệnh AT mở rộng này được định nghĩa trong các chuẩn của GSM. Với các lệnh AT mở rộng này, bạn có thể làm một số thứ như sau:
- Đọc,viết, xóa tin nhắn
- Gửi tin nhắn SMS
- Kiểm tra chiều dài tín hiệu
- Kiểm tra trạng thái sạc pin và mức sạc của pin.
- Đọc, viết và tìm kiếm về các mục danh bạ
3.2.1. Các lệnh khởi tạo GSM Module Sim300CZ:
- Lệnh AT<cr>
Nếu lệnh thực hiện đựợc thì trả về: Ok
Bắt đầu thực hiện các lệnh tiếp theo.
Nếu lệnh không thực hiện được thì trả về dạng: +CMS ERROR <err>
- Lệnh AT+CMGF=[<mode>] <cr> Nếu lệnh thực hiện đựợc thì trả về:
Ok
<mode>: 0 dạng dữ liệu PDU 1 dạng dữ liệu kiểu text
Nếu lệnh không thực hiện được thì trả về dạng: +CMS ERROR <err>
- Lệnh AT&W[<n>] Nếu lệnh thực hiện đựợc thì trả về:
Ok
Lưu cấu hình cho GSM Module Sim300CZ Nếu lệnh không thực hiện được thì trả về dạng:
+CMS ERROR <err> - Lệnh ATE[<value>] Nếu lệnh thực hiện đựợc thì trả về: Ok <value> 0 Tắt chế độ Echo 1 Bật chế độ Echo
Nếu lệnh không thực hiện được thì trả về dạng: +CMS ERROR <err>
3.2.2. Các lệnh xử lý cuộc gọi:
- Lệnh quay số:
ATD<cr>
Ví dụ: muốn quay số tới số điện thoại 01656145049 thi ta gõ lệnh ATD01656145049;<cr>
<cr>: Enter
- Lệnh nhấc máy:
ATA<cr>
Ví dụ: khi có số điện thoai nào đó gọi đến số điện thoại được gắn trên modem Sim300Cz, ta muốn nhấc máy để kết nối thì gõ lệnh:
ATA <cr>
- Lệnh bỏ cuộc gọi:
ATH<cr>
Ví dụ: khi có số điện thoại nào đó gọi đến số điện thoại được gắn trên modem Sim300Cz, ta không muốn nhấc máy mà từ chối cuộc gọi thì gõ lệnh:
3.2.3. Các lệnh về SMS:
- Lệnh Xóa tin nhắn
AT+CMGD
Ví dụ: muốn xóa một tin nhắn nào đó được lưu trên sim thì ta thực hiện lệnh sau. AT+CMGD=<index> <cr>
<index>: vị trí ngăn nhớ lưu tin nhắn Nếu lệnh thực hiện đựợc thì trả về:
Ok
Nếu lệnh không thực hiện được thì trả về dạng: +CMS ERROR <err>
- Lệnh đọc tin nhắn:
AT+CMGR=<index>[mode] <cr>
<index>: số nguyên, đó là vị trí ngăn nhớ chứa tin nhăn cần đọc <mode>: 0 dạng dữ liệu PDU
1 dạng dữ liệu kiểu text
Nếu như lệnh được thực hiện thì kiểu dữ liệu trả về dưới dạng text ( mode=1): Từ SMS-DELIVER:
+CMGR:<stat>,<oa>,
[<alpha>],<scts>[,<tooa>,<fo>,<pid>,<dcs>,<sca>,<tosca>,<length>]<CR><LF> <data>
Nếu dữ liệu trả về dạng PDU(mode=0):
+CMGR: <stat>,[<alpha>],<length><CR><LF><pdu> Nếu lệnh bị lỗi thì trả về dưới dạng:
+CMS ERROR: <err>
- Lệnh gửi tin nhắn SMS: AT+CMGS
Nếu gửi tin nhắn dưới dạng text: (+CMGF=1):
+CMGS=<da>[,<toda>]<CR> text is entered <ctrl-Z/ESC> Nếu gửi tin nhắn dạng PDU:
(+CMGF=0):
+CMGS=<length><CR> PDU is given <ctrl-Z/ESC> Lệnh được thực hiện thành công thi dữ liệu trả về:
Dạng text : +CMGS: <mr> OK
Dạng PDU: +CMGS: <mr> OK
Lệnh bị lỗi: +CMS ERROR: <err>
- Lệnh viết tin nhắn rồi lưu vào ngăn nhớ: AT+CMGW
Nếu viết tin nhắn dưới dạng text:
AT+CMGW=[<oa/da>[,<tooa/toda>[,<stat>]]]<CR>text is entered <ctrl- Z/ESC> <ESC>
Lệnh được thực hiện đúng thì dữ liệu trả về dạng: +CMGW: <index>
OK Lệnh sai:
+CMS ERROR: <err> Nếu viết tin nhắn dưới dạng PDU:
AT+CMGW=<length>[,<stat>]<CR> PDU is given <ctrl-Z/ESC>
- Lệnh gửi tin nhắn từ một ngăn nhớ nào đó: AT+CMSS=<index>[,<da>[,<toda>]]
Nếu lệnh được thực hiện thành công dữ liệu trả về dạng: Dạng text: +CMGS: <mr> [,<scts>] OK Dạng PDU: +CMGS: <mr> [,<ackpdu>] OK Nếu lệnh bị lỗi: +CMS ERROR: <err>
- Lệnh báo hiệu tin nhắn mới:
AT+CNMI=[<mode>[,<mt>[,<bm> [,<ds>[,<bfr>]]]]] Nếu lệnh được thực hiện đúng thì dữ liệu trả về dạng:
OK Nếu lệnh bị lỗi:
+CMS ERROR: <err>
3.2.4. Các lệnh về GPRS:
- AT+CGATT: lệnh gán hay tách thiết bị khỏi GPRS
- AT+CGDCONT: định nghĩa dạng PDP
- AT+CGQMIN: chất lượng dich vụ ở mức thấp nhất
- AT+CGQREQ: chất lượng dich vụ
- AT+CGDATA: trạng thái dữ liệu vào
- AT+CGREG : tình trạng đăng ký của mạng
- AT+CGCOUNT: đếm gói dữ liệu vào
3.2.5. Các lệnh về TCP/IP:
- Lệnh bắt đầu kết nối TCP hay UDP
AT+CIPSTART=<mode>,[<IPaddress>,<domain name>],<port> Trong đó:
<IP address> : địa chỉ IP của người điều khiển từ xa <port> :
<domain name> : tên miền của người điểu khiển từ xa Nếu lệnh thực hiện đúng thì lệnh trả về : CONNECT OK Nếu lệnh thực hiện 3.2.6. Các lệnh khác: - Lệnh nghỉ AT+CFUN
Ví dụ muốn tắt hết chức năng liên quan đến truyền nhận sóng RF và các chức năng liên quan đến sim thì gõ lệnh:
AT+CFUN=0 <cr> OK
- Lệnh chuyển từ chế độ nghỉ sang chế độ hoạt động bình thường AT+CFUN
Ví dụ sim đang ở chế độ nghỉ ta muốn chuyển sang chế độ hoạt động bình thường thi gõ lệnh: AT+CFUN=1 <cr> OK - Lệnh reset mode ATZ <cr> OK - Lệnh tắt chế độ echo ATE0 <cr>
3.2.7. Các lệnh kiểm tra ban đầu:
- Lấy thông tin cơ bản về điện thoại di động hay modem GSM/GPRS. Ví dụ như tên của nhà sản xuất (AT+CGMI), số model (AT+CGMM), số IMEI (International Mobile Equipment Identity) (AT+CGSN) và phiên bản phần mềm (AT+CGMR).
- Lấy các thông tin cơ bản về những người kí tên dưới đây. Thí dụ, MSISDN (AT+CNUM) và số IMS (International Mobile Subscriber Identity) (AT+CIMI).
- Lấy thông tin trạng thái hiện tại của điện thoại di động hay modem GSM/GPRS. Ví dụ như trạng thái hoạt động của điện thoại (AT+CPAS), trạng thái đăng kí mạng mobile (AT+CREG), chiều dài sóng radio (AT+CSQ), mức sạc pin và trạng thái sạc pin (AT+CBC).
- Đọc (AT+CPBR), viết (AT+CPBW) hay tìm kiếm (AT+CPBF) các mục về danh bạ điện thoại (phonebook).
- Thực thi các nhiệm vụ liên quan tới an toàn, chẳng hạn như mở hay đóng các khóa chức năng (AT+CLCK), kiểm tra xem một chức năng được khóa hay chưa (AT+CLCK) và thay đổi Password (AT+CPWD).
- Điều khiển hoạt động của các mã kết quả/các thông báo lỗi của các lệnh AT. Ví dụ, bạn có thể điều khiển cho phép hay không cho phép kích hoạt hiển thị thông báo lỗi (AT+CMEE) và các thông báo lỗi nên được hiển thị theo dạng số hay theo dạng dòng chữ (AT+CMEE=1 hay AT+CMEE=2).
- Thiết lập hay thay đổi cấu hình của điện thoại di dộng hay modem GSM/GPRS. Ví dụ, thay đổi mạng GSM (AT+COPS), loại dịch vụ của bộ truyền tin (AT+CBST), các thông số Protocol liên kết với radio (AT+CRLP), địa chỉ trung tâm SMS (AT+CSCA) và khu vực lưu trữ các tin nhắn SMS (AT+CPMS).
- Lưu và phục hồi các cấu hình của điện thoại di động hay modem GSM/GPRS. Ví du, lưu (AT+COPS) và phục hồi (AT+CRES) các thiết lập liên quan tới tin nhắn SMS chẳng hạn như địa chỉ trung tâm tin nhắn SMS.
CHƯƠNG IV: GIỚI THIỆU PIC 16F877A 4.1. Giới thiệu chung:
PIC là viết tắt của “Programable Intelligent Computer”, có thể tạm dịch là “máy tính thông minh khả trình” do hãng Genenral Instrument đặt tên cho vi điều khiển đầu tiên của họ: PIC1650 được thiết kế để dùng làm các thiết bị ngoại vi cho vi điều khiển CPU1600. Vi điều khiển này sau đó được nghiên cứu phát triển thêm và từ đó hình thành nên dòng vi điều khiển PIC ngày nay.
4.1.1. Sự phổ biến của vi điều khiển PIC:
Trên thị trường có rất nhiều họ vi điều khiển như 8051, Motorola 68HC, AVR, ARM... Tuy nhiên, hiện nay PIC đang được sử dụng rộng rãi ở Việt Nam vì những nguyên nhân sau:
- Họ vi điều khiển này có thể tìm mua dễ dàng tại thị trường Việt Nam. - Giá thành không quá đắt.
- Có đầy đủ các tính năng của một vi điều khiển khi hoạt động độc lập. - Là sự bổ sung rất tốt về kiến thức cũng như về ứng dụng cho họ vi điều khiển mang tính truyền thống: họ vi điều khiển 8051.
- Hiện nay tại Việt Nam cũng như trên thế giới, PIC được sử dụng khá rộng rãi. Điều này tạo nhiều thuận lợi trong quá trình tìm hiểu và phát triển các ứng dụng như: số lượng tài liệu, số lượng các ứng dụng mở đã được phát triển thành công, dễ dàng trao đổi, học tập, dễ dàng tìm được sự chỉ dẫn khi gặp khó khăn…
- Sự hỗ trợ của nhà sản xuất về trình biên dịch, các công cụ lập trình, nạp chương trình từ đơn giản đến phức tạp…
- Các tính năng đa dạng của vi điều khiển PIC không ngừng được phát triển.
4.1.2. Kiến trúc PIC:
Cấu trúc phần cứng của một vi điều khiển được thiết kế theo hai dạng kiến trúc: kiến trúc Von-Neumann và kiến trúc Harvard.
Hình 6: Kiến trúc Harvard và kiến
trúc Von-Neumann
Tổ chức phần cứng của PIC được thiết kế theo kiến trúc Harvard. Điểm khác biệt giữa kiến trúc Harvard và kiến trúc Von-Neumann là cấu trúc bộ nhớ dữ liệu và bộ nhớ chương trình.
Đối với kiến trúc Von-Neuman, bộ nhớ dữ liệu và bộ nhớ chương trình nằm chung trong một bộ nhớ, do đó ta có thể tổ chức, cân đối một cách linh hoạt bộ nhớ chương trình và bộ nhớ dữ liệu. Tuy nhiên điều này chỉ có ý nghĩa khi tốc độ xử lí của CPU phải rất cao,vì với cấu trúc đó, trong cùng một thời điểm CPU chỉ có thể tương tác với bộ nhớ dữ liệu hoặc bộ nhớ chương trình. Như vậy có thể nói kiến trúc Von-Neumann không thích hợp với cấu trúc của một vi điều khiển.
Đối với kiến trúc Harvard, bộ nhớ dữ liệu và bộ nhớ chương trình tách ra thành hai bộ nhớ riêng biệt. Do đó trong cùng một thời điểm CPU có thể tương tác với cả hai bộ nhớ, như vậy tốc độ xử lí của vi điều khiển được cải thiện đáng kể. Một điểm cần chú ý nữa là tập lệnh trong kiến trúc Harvard có thể được tối ưu tùy theo yêu cầu kiến trúc của vi điều khiển mà không phụ thuộc vào cấu trúc dữ liệu. Ví dụ, đối với vi điều khiển dòng 16Fxxx, độ dài lệnh luôn là 14 bit (trong khi dữ liệu được tổ chức thành từng byte), còn đối với kiến trúc Von-Neumann, độ dài lệnh luôn là bội số của 1 byte (do dữ liệu được tổ chức thành từng byte). Đặc điểm này được minh họa cụ thể trong hình 4.1.
4.1.3. RISC và CISC:
Như đã trình bày ở trên, kiến trúc Harvard là khái niệm mới hơn so với kiến trúc Von-Neumann. Khái niệm này được hình thành nhằm cải tiến tốc độ thực thi của một vi điều khiển. Qua việc tách rời bộ nhớ chương trình và bộ nhớ dữ liệu, bus chương trình và bus dữ liệu, CPU có thể cùng một lúc truy xuất cả bộ nhớ chương trình và bộ nhớ dữ liệu, giúp tăng tốc độ xử lí của vi điều khiển lên gấp đôi. Đồng thời cấu trúc lệnh không còn phụ thuộc vào cấu trúc dữ liệu nữa mà có thể linh động điều chỉnh tùy theo khả năng và tốc độ của từng vi điều khiển. Và để tiếp tục cải tiến tốc độ thực thi lệnh, tập lệnh của họ vi điều khiển PIC được
thiết kế sao cho chiều dài mã lệnh luôn cố định (ví dụ đối với họ 16Fxxxx chiều dài mã lệnh luôn là 14 bit) và cho phép thực thi lệnh trong một chu kì của xung clock ( ngoại trừ một số trường hợp đặc biệt như lệnh nhảy, lệnh gọi chương trình con … cần hai chu kì xung đồng hồ). Điều này có nghĩa tập lệnh của vi điều khiển thuộc cấu trúc Harvard sẽ ít lệnh hơn, ngắn hơn, đơn giản hơn để đáp ứng yêu cầu mã hóa lệnh bằng một số lượng bit nhất định. Vi điều khiển được tổ chức theo kiến trúc Harvard còn được gọi là vi điều khiển RISC (Reduced Instruction Set Computer) hay vi điều khiển có tập lệnh rút gọn. Vi điều khiển được thiết kế theo kiến trúc Von-Neuman còn được gọi là vi điều khiển CISC (Complex Instruction Set Computer) hay vi điều khiển có tập lệnh phức tạp vì mã lệnh của nó không phải là một số cố định mà luôn là bội số của 8 bit (1 byte).
4.1.4. PIPELINING :
Đây chính là cơ chế xử lí lệnh của các vi điều khiển PIC. Một chu kì lệnh của vi điều khiển sẽ bao gồm 4 xung clock. Ví dụ ta sử dụng oscillator có tần số 4 MHZ, thì xung lệnh sẽ có tần số 1 MHz (chu kì lệnh sẽ là 1 us). Giả sử ta có một đoạn chương trình như sau:
1. MOVLW 55h
2. MOVWFPORTB 3. CALL SUB_1
4. BSF PORTA,BIT3
5. instruction @ address SUB_1
Ở đây ta chỉ bàn đến qui trình vi điều khiển xử lí đoạn chương trình trên thông qua từng chu kì lệnh. Quá trình trên sẽ được thực thi như sau:
TCY0: đọc lệnh 1
TCY1:thực thi lệnh 1, đọc lệnh 2 TCY2: thực thi lệnh 2, đọc lệnh 3 TCY3: thực thi lệnh 3, đọc lệnh 4.
- TCY4: vì lệnh 4 không phải là lệnh sẽ được thực thi theo qui trình thực thi của chương trình (lệnh tiếp theo được thực thi phải là lệnh đầu tiên tại label
SUB_1) nên chu kì thực thi lệnh này chỉ được dùng để đọc lệnh đầu tiên tại label SUB_1. Như vậy có thể xem lệnh 3 cần 2 chu kì xung clock để thực thi.
- TCY5: thực thi lệnh đầu tiên của SUB_1 và đọc lệnh tiếp theo của SUB_1.
Quá trình này được thực hiện tương tự cho các lệnh tiếp theo của chương trình.
Thông thường, để thực thi một lệnh, ta cần một chu kì lệnh để gọi lệnh đó, và