• Lệnh AT<cr>
Nếu lệnh thực hiện được thì trả về: Ok
Trang 30 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> lệnh chọn chếđộ nhắn tin 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
và lưu cấu hình cho GSM Module SIM900. 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> b. 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 0916144408 thì ta gõ lệnh ATD 0916144408;<cr> <cr>: Enter
Trang 31
• Lệnh nhấc máy: ATA<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 SIM900, 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 SIM900, ta không muốn nhấc máy mà từ chối cuộc gọi thì gõ lệnh ATH<cr>
c. 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>: 1 đọc và thay đổi trạng thái của tin nhắn sau khi đọc. VD: UNREAD => READ.
0 đọc bình thường.
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) - Đối với tin nhắn SMS-DELIVER: +CMGR:<stat>,<oa>,[<alpha>],<scts>[,<tooa>,<fo>,<pid>,<dcs>,<sca>,<tosca>,<l ength>]<CR><LF><data> - Đối với tin nhắn SMS-SUBMIT: +CMGR:<stat>,<da>,[<alpha>][,<toda>,<fo>,<pid>,<dcs>,[<vp>],<sca>,<tosca>,<l ength>]<CR><LF><data> - Đối với tin nhắn SMS-STATUS-REPORTs:
Trang 32 +CMGR: <stat>,<fo>,<mr>,[<ra>],[<tora>],<scts>,<dt>,<st> - Đối với tin nhắn SMS-COMMANDs: +CMGR:<stat>,<fo>,<ct>[,<pid>,[<mn>],[<da>],[<toda>],<length><CR><LF><cda ta>] - Đối với tin nhắn CBM storage: +CMGR:<stat>,<sn>,<mid>,<dcs>,<page>,<pages><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> Nếu lệnh được thực hiện thành công thì dữ liệu trả về: - Dạng text : +CMGS: <mr> OK - Dạng PDU : +CMGS: <mr> OK Nếu 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:
Trang 33
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> d. 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.
Trang 34
• 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.
e. Một số 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 thì gõ lệnh: AT+CFUN=1 <cr> OK • Lệnh Reset mode ATZ <cr> OK • Lệnh tắt chếđộ echo ATE0 <cr>
f. 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ề SIM Card. 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).
Trang 35
- Đọ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í dụ, 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.
Trên đây là những kiến thức cơ bản nhất về Modem SIM 900 và tập lệnh AT của SIM900. Để có thể sử dụng hết các chức năng của SIM900 ta phải có một quá trình tìm hiểu lâu dài, kỹ lưỡng. Tuy nhiên, trong khuôn khổ của đồ án em chỉ tập trung vào nghiên cứu một số tính năng chính của SIM900 như cách khởi tạo cho SIM900, cách nhắn tin, cách đọc và xóa tin nhắn, cách thực hiện và hủy cuộc gọi… đó là những chức năng chính phục vụ chủ
yếu cho đề tài.
Modem SIM900 là thiết bị giao tiếp với dịch vụ mạng - thiết bị trung gian để nhận tín hiệu tin nhắn SMS điều khiển từ điện thoại người dùng hay gửi tin nhắn báo trở lại cho người dùng. Việc xử lý hay sự trao đổi đó do một trung tâm xử lý mà em lựa chọn là vi điều khiển Atmega 8 sẽđược trình bày trong mục sau.
3.3.2 Tổng quan về Vi điều khiển Atmega 8
3.3.2.1 Giới thiệu về Vi điều khiển Atmega 8
Vi điều khiển AVR do hãng Atmel (Hoa Kì) sản xuất được giới thiệu lần đầu năm 1996. AVR có rất nhiều dòng khác nhau bao gồm Tiny AVR (như AT tiny 13, AT tiny 22…) có
Trang 36
kích thước bộ nhớ nhỏ, ít bộ phận ngoại vi, rồi đến dòng AVR (chẳng hạn AT90S8535, AT90S8515…) có kích thước bộ nhớ vào loại trung bình và mạnh hơn là dòng Mega (như
Atmega 32, Atmega 8,…) với bộ nhớ kích thước vài Kbyte đến vài trăm Kbyte cùng với các bộ ngoại vi đa dạng được tích hợp trên chip, cũng có dòng tích hợp cả bộ LCD trên chip (dòng LCD AVR). Tốc độ của dòng Mega cũng cao hơn so với các dòng khác. Sự khác nhau cơ bản giữa các dòng chính là cấu trúc ngoại vi, còn nhân thì vẫn như nhau.
Hình 3.3 Các dòng AVR khác nhau: Tiny, AVR và Mega
3.3.2.2 Những tính năng chính của Atmega 8
Hiệu suất cao, tiết kiệm điện Hoàn thiện cấu trúc RISC
133 lệnh hiệu quả, thực thi tất cả các chu kỳđồng hồđơn.
32*8 thanh ghi chung đa năng và các thanh ghi điều khiển ngoại vi. Đầy đủ các quá trình điều khiển tĩnh.
Nâng lên 16 MIPS dữ liệu tại 16 MHz.
Độ bền, sức chịu đựng cao, không thay đổi phân vùng nhớ
8 Kbytes bộ nhớ Flash có thể lập trình được trong hệ thống. 512 Bytes EEPROM.
1 Kbytes bộ nhớ SRAM bên trong.
Chu kỳ ghi/xóa: 10.000 Flash/100.000 EEPROM. Lập trình khóa cho phần mềm bảo mật.
Giao diện SPI cho lập trình trong hệ thống. Giao diện JTAG
Khả năng quét biên theo chuẩn JTAG. Hỗ trợ chếđộ sửa tạm (debug) trên chip.
Lập trình của Flash, EEPROM, bộ bảo vệ (FUSE) và bit khóa (Lock Bit) thông qua giao diện JTAG.
Trang 37
2 bộ Timer/Counter 8 bit với bộ đếm gộp trước riêng biệt và chế độ so sánh mẫu.
1 bộ Timer/Counter 16 bit mở rộng với bộ đếm gộp trước chếđộ so sánh mẫu và chếđộ thu thập (bắt dữ liệu).
Bộ Counter thời gian thực với bộ dao động (oscillator) riêng biệt. 3 kênh PWM
Bộđiều chế so sánh tín hiệu ra. 8 kênh, 10 bit ADC
Lập trình USARTS nối tiếp. Giao diện nối tiếp SPI chủ tớ.
Lập trình Timer Watchdog với bộ dao động trên chip. Bộ so sánh tương tự trên chip.
Các tính năng đặc biệt của bộ vi xử lý
Thiết lập bật lại nguồn và lập trình lại khi phát hiện nguồn yếu (brown - out). Hiệu chỉnh bộ dao động RC bên trong.
Ngắt nguồn trong và ngoài.
6 chế độ chờ (Sleep): Idle - nghỉ, giảm ồn ADC, tiết kiệm điện (Power – Saver), ngắt điện, chếđộ chờ (Standby), chếđộ chờ mở rộng.
Phần mềm lựa chọn tần số xung nhịp. Cổng vào/ra và dạng đóng gói
24 đường vào/ra lập trình được. 32 chân TQFP và 32 khối QFN/MLF. Điện áp hoạt động 2.7V – 5.5V Atmega 8L. 4.5V – 5.5V Atmega 8. Mức độ xung nhịp 0 – 8 MHz Atmega 8L. 0 – 16 MHz Atmega 8.
Trang 38
Hình 3.4 Sơđồ chân của Atmega 8
• VCC: Chân cấp nguồn.
• GND: Chân đất.
• Port B (PB7 – PB0): Cổng B là một cổng vào/ra hai hướng với điện trở hãm lựa chọn cho mỗi bit.
• Port C (PC7 – PC0): Cổng C là một cổng vào/ra hai hướng với điện trở hãm lựa chọn cho mỗi bit. Bộđệm cổng C có tính đối xứng.
• Port D (PD7 – PD0): Cổng D là một cổng vào/ra hai hướng với điện trở hãm lựa chọn cho mỗi bit. Bộđệm cổng D có tính đối xứng.
• Là các cổng có 3 chếđộ khi mà điều kiện Reset được kích hoạt dù là đồng hồ không chạy.
• RESET (1): Đầu ra Reset, cấp cho phép trên chân này dài hơn độ dài xung tối thiểu sẽ phát ra tín hiệu Reset, cho dù đồng hồ không chạy.
• XTAL1 (7): Đầu vào bộ khuếch đại dao động và đầu vào cho các đồng hồ đếm bên trong mạch điện điều khiển.
Trang 39
• AVCC (18): Là chân nguồn áp cấp cho cổng F và các bộ chuyển đổi A/D. Nên nó là chân nối với VCC, dù là ADC không được sử dụng. Nếu ADC được sử dụng, nó nên
được nối với chân VCC thông qua 1 bộ lọc thấp tần.
• AREF (20): Là chân tham khảo cho bộ chuyển đổi A/D.
3.3.2.4 Cấu trúc bộ nhớ của Vi điều khiển Atmega 8
Bộ nhớ Vi điều khiển AVR có cấu trúc Harvard là cấu trúc có đường Bus riêng cho bộ
nhớ chương trình và bộ nhớ dữ liệu. Bộ nhớ AVR được chia làm 2 phần chính là bộ nhớ
chương trình (Program Memory) và bộ nhớ dữ liệu (Data Memory).
Hình 3.5 Bộ nhớ của Atmega 8
a. Bộ nhớ chương trình
Bộ nhớ chương trình của AVR là bộ nhớ Flash có dung lượng 8 Kbytes. Bộ nhớ chương trình có độ rộng Bus là 16 bit. Những địa chỉ đầu tiên của bộ nhớ chương trình được dùng cho bảng vector ngắt. Bộ nhớ chương trình được chia làm 2 phần:
Phần Boot Loader: chứa chương trình Boot Loader. Chương trình Boot Loader là một phần mềm nhỏ nạp trong Vi điều khiển và được chạy lúc khởi động. Phần mềm này có thể tải vào trong Vi điều khiển chương trình của người sử dụng và sau đó thực thi chương trình này. Mỗi khi Reset Vi điều khiển CPU sẽ nhảy tới thực thi chương trình Boot Loader trước, chương trình Boot Loader sẽ dò xem có chương trình nào cần nạp vào Vi điều khiển hay không, nếu có chương trình cần nạp, Boot Loader sẽ
Trang 40
nạp chương trình vào vùng nhớứng dụng (Application Program Section), rồi thực thi chương trình này. Ngược lại, Boot Loader sẽ chuyển tới chương trình ứng dụng có sẵn trong vùng nhớứng dụng để thực thi chương trình này.
Phần ứng dụng (Application Program Section): là vùng nhớ chứa chương trình ứng dụng của người dùng. Kích thước của phần Boot Loader và phần ứng dụng có thể tùy chọn. Cấu trúc của bộ nhớ chương trình có thể sử dụng hoặc không sử dụng Boot Loader, khi sử dụng phần Boot Loader ta thấy 4 word đầu tiên thay vì chỉ thị cho CPU chuyển tới chương trình ứng dụng của người dùng (là chương trình có nhãn Start) thì chỉ thị CPU nhảy tới phần chương trình Boot Loader để thực hiện trước, rồi mới quay trở lại thực hiện chương trình ứng dụng.
Hình 3.6 Sơđồ bộ nhớ chương trình có và không có sử dụng Boot Loader
b. Bộ nhớ dữ liệu
Bộ nhớ dữ liệu của AVR chia làm 2 phần chính đó là bộ nhớ SRAM và bộ nhớ
EEPROM. Tuy cùng là bộ nhớ dữ liệu nhưng 2 bộ nhớ này lại tách biệt nhau và được đánh
Trang 41
Bộ nhớ SRAM: có dung lượng 1 Kbytes, bộ nhớ này có 2 chếđộ hoạt động là chếđộ
thông thường và chếđộ tương thích với Atmega 103, muốn thiết lập bộ nhớ SRAM hoạt động theo chếđộ nào ta sử dụng bit cầu chì M103C (M103 fuse bit)
• Bộ nhớ SRAM ở chế độ bình thường: ở chế độ bình thường thì bộ nhớ SRAM được chia thành 5 phần:
- Phần đầu là 32 thanh ghi chức năng chung (General Purpose Register) từ R0 đến R31 có địa chỉ từ $0000 tới $001F.
- Phần thứ hai là không gian nhớ vào/ra với 64 thanh ghi vào/ra (I/O Register) có địa chỉ từ $0020 tới $005F.
- Phần thứ ba dùng cho vùng nhớ dành cho các thanh ghi vào/ra mở rộng (Extended I/O Register) có địa chỉ $0060 tới $00FF.
- Phần thứ tư là vùng SRAM nội với 4096 byte có địa chỉ từ $0100 tới $10FF.
Khi nói bộ nhớ SRAM có dung lượng 1 Kbytes là nói tới phần thứ tư (SRAM nội). Nếu tính cả các thanh ghi thì bộ nhớ SRAM trong chế độ bình thường sẽ là 4.25 Kbytes = 4352 bytes.
• Bộ nhớ SRAM ở chế độ tương thích Atmega 103: ở chế độ này bộ nhớ SRAM cơ
bản cũng giống ở chế độ bình thường, ngoại trừ phần thứ ba là vùng nhớ dành cho các thanh ghi vào/ra mở rộng không tồn tại. Ngoài ra kích thước phần SRAM nội chỉ
có 4000 byte so với 4096 byte ở chếđộ bình thường.
Trang 42
Từ hình 3.7 ta thấy nếu cấu hình để bộ nhớ SRAM hoạt động ở chế độ tương thích Atmega 103 thì ta sẽ bị mất đi 160 thanh ghi vào/ra mở rộng (Extended I/O Register), là những thanh ghi đóng vai trò quan trọng trong các chếđộ hoạt động của Vi điều khiển. Trong vùng nhớ vào/ra mở rộng ($0060 - $00FF) chỉ có 6 lệnh có thể được sử dụng là ST/STS/STD và LD/LDS/LDD.
Bộ nhớ EEPROM: đây là bộ nhớ dữ liệu có thể ghi/xóa ngay trong lúc Vi điều khiển
đang hoạt động và không bị mất dữ liệu khi nguồn điện cung cấp bị cắt. Có thể ví bộ
dữ liệu EEPROM giống như là ổ cứng (Hard disk) của máy vi tính. Với Vi điều khiển Atmega 8, bộ nhớ EEPROM có kích thước là 4 Kbytes. EEPROM được xem như là một bộ nhớ vào/ra được đánh địa chỉđộc lập với SRAM, điều này có nghĩa là ta cần sử dụng các lệnh in, out… khi muốn truy xuất tới EEPROM. Để điều khiển