Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.07 MB, 73 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>1. Khái quát về tin nhắn SMS: </b>
SMS là từ viết tắt của Short Message Service. Đó là một cơng nghệ cho phép gửi và nhận các tín nhắn giữa các điện thoại với nhau. SMS xuất hiện đầu tiên ở Châu âu vào năm 1992. Ở thời điểm đó, nó bao gồm cả các chuẩn về GSM (Global System for Mobile Communications). Một thời gian sau đó, nó phát triển sang cơng nghệ wireless như CDMA và TDMA. Các chuẩn GSM và SMS có nguồn gốc phát triển bởi ETSI. ETSI là chữ viết tắt của European Telecommunications Standards Institute. Ngày nay thì 3GPP (Third Generation Partnership Project) đang giữ vai trị kiểm sốt về sự phát triển và duy trì các chuẩn GSM và SMS.
Như đã nói ở trên về tên đầy đủ của SMS là Short Message Service, từ cụm từ đó, có thể thấy được là dữ liệu có thể được lưu giữ bởi một tin nhắn SMS là rất giới hạn. Một tin nhắn SMS có thể chứa tối đa là 140 byte (1120 bit) dữ liệu. Vì vậy, một tin nhắn SMS chỉ có thể chứa :
+ 160 kí tự nếu như mã hóa kí tự 7 bit được sử dụng (mã hóa kí tự 7 bit thì phù hợp với mã hóa các lí tự latin chẳng hạn như các lí tự alphabet của tiếng Anh).
+ 70 kí tự nếu như mã hóa kí tự 16 bit Unicode UCS2 được sử dụng (các tin nhắn SMS khơng chứa các kí tự latin như kí tự chữ Trung Quốc phải sử dụng mã hóa kí tự 16 bit).
Tin nhắn SMS dạng text hỗ trợ nhiều ngôn ngữ khác nhau. Nó có thể hoạt động tốt với nhiều ngơn ngữ mà có hỗ trợ mã Unicode , bao gồm cả Arabic, Trung Quốc, Nhật bản và Hàn Quốc.Bên cạnh gữi tin nhắn dạng text thì tin nhắn SMS cịn có thể mang các dữ liệu dạng binary. Nó cịn cho phép gửi nhạc chng, hình ảnh cùng nhiều tiện ích khác … tới một điện thoại khác.
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">Một trong những ưu điểm nổi trội của SMS đó là nó được hỗ trợ bởi các điện thoại có sử dụng GSM hoàn toàn. Hầu hết tất cả các tiện ích cộng thêm gồm cả dịch vụ gửi tin nhắn giá rẻ được cung cấp, sử dụng thơng qua sóng mang wireless. Khơng giống như SMS, các công nghệ mobile như WAP và mobile Java thì khơng được hỗ trợ trên nhiều model điện thoại.
Sử dụng tin nhắn SMS ngày càng phát triển và trở lên rộng khắp :
- Các tin nhắn SMS có thể được gửi và đọc tại bất kỳ thời điểm nào. Ngày nay, hầu hết mọi người đều có điện thoại di động của riêng mình và mang nó theo người hầu như cả ngày. Với một điện thoại di động , bạn có thể gửi và đọc các tin nhắn SMS bất cứ lúc nào bạn muốn, sẽ không gặp khó khăn gì khi bạn đang ở trong văn phịng hay trên xe bus hay ở nhà…
- Tin nhắn SMS có thể được gửi tới các điện thoại mà tắt nguồn.
Nếu như không chắc cho một cuộc gọi nào đó thì bạn có thể gửi một tin nhắn SMS đến bạn của bạn thậm chí khi người đó tắt nguồn máy điện thoại trong lúc bạn gửi tin nhắn đó. Hệ thống SMS của mạng điện thoại sẽ lưu trữ tin nhắn đó rồi sau đó gửi nó tới người bạn đó khi điện thoại của người bạn này mở nguồn.
- Các tin nhắn SMS ít gây phiền phức trong khi bạn vẫn có thể giữ liên lạc với người khác
Việc đọc và viết các tin nhắn SMS không gây ra ồn ào. Trong khi đó, bạn phải chạy ra ngoài khỏi rạp hát, thự viện hay một nơi nào đó để thực hiện một cuộc điện thoại hay trả lời một cuộc gọi. Bạn không cần phải làm như vậy nếu như tin nhắn SMS được sử dụng.
- Các điện thoại di động và chúng có thể được thay đổi giữa các sóng mang Wireless khác nhau.
Tin nhắn SMS là một công nghệ rất thành công và trưởng thành. Tất cả các điện thoại mobile ngày nay đều có hỗ trợ nó. Bạn khơng chỉ có thể trao đổi các tin nhắn SMS đối với người sử dụng mobile ở cùng một nhà cung cấp dịch vụ mạng sóng mang wireless, mà đồng thời bạn cũng có thể trao đổi nó với người sử dụng khác ở các nhà cung cấp dịch vụ khác.
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">- SMS là một công nghệ phù hợp với các ứng dụng Wireless sử dụng cùng với nó.
Nói như vậy là do:
Thứ nhất, tin nhắn SMS được hỗ trợ 100% bởi các điện thoại có sử dụng cơng nghệ GSM. Xây dựng các ứng dụng wireless trên nền công nghệ SMS có thể phát huy tối đa những ứng dụng có thể dành cho người sử dụng.
Thứ hai, các tin nhắn SMS cịn tương thích với việc mang các dữ liệu binary bên cạnh gửi các text. Nó có thể được sử dụng để gửi nhạc chng, hình ảnh, hoạt họa …
Thứ ba, tin nhắn SMS hỗ trợ việc chi trả các dịch vụ trực tuyến.
<b>2. Giới thiệu GSM Module SIM900 </b>
SIM900 là 1 Module GSM/GPRS 4 băng tần làm việc ở các tần số: GSM 850MHz, EGSM 900MHZ, DCS 1800MHz và PCS 1900MHz. SIM900 có đầy đủ các tính năng cơ bản của 1 điện thoại di động GSM như gọi và nhận cuộc gọi, nhắn và nhận tin SMS, gửi và nhận dữ liệu bằng kết nối GPRS thông qua tập lệnh AT
Các thông số cơ bản:
Nguồn cung cấp: 3,2 ~ 4,8V
thể tự động tìm kiếm các băng tần Phù hợp với GSM Phase 2/2+
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">Hạn chế : - 40ºC tới -30ºC và +80ºC tới +85ºC Nhiệt độ bảo quản: -45ºC tới 90ºC
Dữ liệu GPRS:
GPRS dữ liệu download: Max 85.6 kbps GPRS dữ liệu upload: Max 42.8 kbps Sơ đồ mã hóa: CS-1, CS-2, CS-3 và CS-4 Sim 300CZ tích hợp giao thức TCP/IP
Giao tiếp SIM card: Hỗ trợ sim card: 1,8v ; 3v
Anten ngồi: có tiếp điểm kết nối với antena ngoài.
Hỗ trợ Autobauding cho tốc độ baud từ 1200bps đến 57600.
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">• Kích thướt 24x24x3mm
Hình 1.1: Kích thước của SIM900
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">Hình 1.2: Hình chụp mặt trên và mặt dưới SIM900
<b>3. Sơ đồ chân và chức năng từng chân của SIM900 </b>
Hình 1.3: Sơ đồ chân SIM900 Chân 1,2 : điều khiển tắt/mở module.
Chân 3, 4, 5, 6, 7, 8, 9, 10: chân giao tiếp cổng COM.
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">- DTR : Data Terminal ready ( DTE sẵn sàng làm việc). - RI : Ring Indicator (báo chuông).
- DCD : Data Carier detect (DCE phát hiện sóng mang). - DSR : Data Set Ready (DCE sẵn sàng làm việc). - CTS : Clear To Send (DCE sẵn sàng nhận dữ liệu). - RTS : Request To Send (DTE yêu cầu truyền dữ liệu). - TXD : Transmitted Data (dữ liệu truyền).
- RXD : Received Data (dữ liệu nhận).
Chân 11, 12, 13, 14: chân giao tiếp màn hình LCD. Chức năng giao tiếp LCD không hỗ trợ trong firmware tiêu chuẩn, để sử dụng, người dùng phải sửa đổi firmware.
Chân 15 (VDD_EXT): nguồn 2.8V cung cấp cho mạch ngoài. Chân 16 (NRESET): reset module (tích cực mức thấp).
Chân 17, 18, 29, 39, 45, 46, 53, 54, 58, 59, 62, 63, 64, 65 (GND): chân mas. Chân 19, 20 (MIC_P, MIC_N): ngõ vào micro.
Chân 21, 22 (SPK_P, SPK_N): ngõ ra loa.
Chân 23, 24 (LINEIN_R, LINEIN_L): ngõ vào âm thanh.
Chân 25 (ADC): ngõ vào bộ chuyển đổi Analog-Digital (0 ~ 2.8V). Chân 26 (VRTC): nguồn cung cấp cho RTC.
Chân 27, 28 (DBG_TXD, DBG_RXD): dùng để tuỳ chỉnh và nâng cấp firmware.
Chân 30, 31, 32, 33, 34 (SIM_VDD, SIM_DATA, SIM_CLK, SIM_RESET, SIM_PRESENCE): các chân giao tiếp với SIM card.
- SIM_VDD: chân cấp nguồn cho SIM. - SIM_DATA: ngõ vào, ra dữ liệu. - SIM_CLK: cấp xung clock cho SIM. - SIM_RESET: reset SIM.
- SIM_PRESENCE: chân giúp phát hiện thẻ SIM.
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">Chân 35, 36 (PWM1, PWM2): ngõ ra điều chế xung dùng cho đèn bàn phím và bộ rung.
Chân 37, 38 (SDA, SCL): chân dùng cho giao tiếp I²C.
Chân 40-44, 47-51, 67, 68: các ngõ vào ra và kết nối với Keypad. Chân 52 (NETLIGH): ngõ ra đèn hiển thị trạng thái mạng.
Chân 55, 56, 57 (VBAT): ngõ vào nguồn cung cấp cho Module. Chân 60 (RF_ANT): kết nối với antena ngoài.
Chân 66 (STATUS): ngõ ra đèn hiển thị trạng thái hoạt động của Module.
<b>4. Tập lệnh AT của Module SIM900: </b>
Module SIM900 giao tiếp với vi điều khiển hoặc máy tính thơng qua giao tiếp RS232 và được điều khiển thông qua bộ tập lệnh AT viết tắt của từ Attention do Dennis Hayes phát minh ra vào năm 1977. Trong tập lệnh AT, mỗi câu lệnh được bắt đầu với chữ “AT” hoặc “at”.
Các thuật ngữ:
- <CR> : Carriage return (0x0D). - <LF> : Line Feed (0x0A).
- MT (Mobile Terminal): Thiết bị đầu cuối mạng (trong trường hợp này là Module SIM900).
- TE (Terminal Equipment) Thiết bị đầu cuối (máy tinh, vi điều khiển).
<i><b>4.1. Các lệnh khởi tạo GSM Module SIM900 </b></i>
Các lệnh khởi tạo chỉ cần được thực thi 1 lần, sau đó lưu lại và trở thành cấu hình mặc định của modem. Cấu hình mặc định này không thay đổi, kể cả khi mất nguồn. Phần khởi tạo này không liên quan đến quá trình hoạt dộng sau này của modem. Do đó có thể khởi tạo riêng trước khi đưa vào vận hành trong hệ thống.
ATZ<CR> : Reset modem, kiểm tra module đã hoạt động bình
ATZ<CR><CR><LF>OK<CR><LF>.
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9"> ATE0<CR> : Tắt chế độ echo lệnh. Chuỗi trả về có dạng ATE0<CR><CR><LF>OK<CR><LF>.
AT+CLIP=1<CR> : Định dạng chuỗi trả về khi nhận cuộc gọi. Thông thường, ở chế độ mặc định, khi có cuộc gọi đến, chuỗi trả về sẽ có dạng: <CR><LF>RING<CR><LF>
Sau khi lệnh AT+CLIP=1<CR> đã được thực thi, chuỗi trả về sẽ có dạng: <CR><LF>RING<CR><LF>
AT+CNMI=2,0,0,0,0<CR> : Thiết lập chế độ thông báo cho TE khi MT nhận được tin nhắn mới. Chuỗi trả về sẽ có dạng: <CR><LF>OK<CR><LF>
Sau khi lệnh trên được thiết lập, tin nhắn mới nhận được sẽ được lưu trong SIM, và MT không truyền trở về TE bất cứ thông báo nào. TE sẽ đọc tin nhắn được lưu trong SIM trong trường hợp cần thiết.
AT+CSAS<CR> : Lưu cấu hình cài đặt được thiết lập bởi các lệnh AT+CMGF và AT+CNMI.
<i><b>4.2. Các lệnh thực hiện cuộc gọi </b></i>
ATDxxxxxxxxxx;<CR> : Quay số cần gọi. Chuỗi trả về có dạng:
<CR><LF>OK<CR><LF>
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">Chuỗi này thông báo lệnh trên đã được nhận và đang được thực thi. Sau đó là những chuỗi thơng báo kết quả q trình kết nối (nếu như kết nối không được thực hiện thành công).
Nếu MT không thực hiện được kết nối do sóng yếu, hoặc khơng có sóng (thử bằng cách tháo antenna của modem GSM), chuỗi trả về sẽ có dạng:
<CR><LF>NO DIAL TONE<CR><LF>
Nếu cuộc gọi bị từ chối bởi người nhận cuộc gọi, hoặc số máy đang gọi tạm thời không hoạt động (chẳng hạn như bị tắt máy) chuỗi trả về có dạng: <CR><LF>NO CARRIER<CR><LF>
Nếu cuộc gọi không thể thiết lập được do máy nhận cuộc gọi đang bận (ví dụ như đang thông thoại với một thuê bao khác), chuỗi trả về sẽ có dạng:
Q trình kết thúc cuộc gọi được diễn ra trong hai trường hợp: Đầu nhận cuộc gọi gác máy trước: chuỗi trả về sẽ có dạng:
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11"><CR><LF>RING<CR><LF> <CR><LF>+CLIP:
"0929047589",129,"",,"",0<CR><LF>
Chuỗi trả về có hiển thị số điện thoại yêu cầu được kết nối, dựa trên thông tin này để có thể ra quyết định nhận cuộc gọi hay từ chối cuộc gọi. Nếu số điện thoại gọi đến không hợp lệ, từ chối nhận cuộc gọi bằng lệnh ATH<CR>, và chuỗi trả về sẽ có dạng:
<CR><LF>OK<CR><LF>
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">Các tham số trong chuỗi trả về bao gồm trạng thái của tin nhắn (REC UNREAD), số điện thoại gửi tin nhắn (+841228678499) và thời gian gửi tin nhắn (07/05/12,09:32:05+28) và nội dung tin nhắn.
Đây là định dạng mặc định của module SIM900 lúc khởi động. Dạng mở rộng có thể được thiết lập bằng cách sử dụng lệnh AT+CSDH=1 trước khi thực hiện đọc tin nhắn.
Sau khi đọc, tin nhắn được xóa đi bằng lệnh AT+CMGD=1<CR>.
Trong đó 62 là một số tham chiếu cho tin nhắn đã được gửi. Sau mỗi tin nhắn được gửi đi, giá trị của số tham chiếu này sẽ tăng lên 1 đơn vị. Số tham chiếu này có giả trị nằm trong khoảng từ 0 đến 255.
Thời gian gửi một tin nhắn vào khoảng 3-4 giây (kiểm tra với mạng Mobi phone).
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">Nếu tình trạng sóng khơng cho phép thực hiện việc gửi tin nhắn (thử bằng cách tháo antenna), hoặc chức năng RF của modem không được cho phép hoạt động (do sử dụng các lệnh AT+CFUN=0 hoặc AT+CFUN=4), hoặc số tin nhắn trong hàng đợi phía tổng đài vượt qua giới hạn cho phép, hoặc bộ nhớ chứa tin nhắn của MT nhận được tin nhắn bị tràn, MT sẽ gửi thơng báo lỗi trở về và có định dạng như sau:
<CR><LF>+CMS ERROR: 193<CR><LF> <CR><LF>+CMS ERROR: 515<CR><LF>
Chức năng truyền nhận tin nhắn và chức năng thoại được tách biệt. Khi đang thơng thoại vẫn có thể truyền nhận được tin nhắn. Khi truyền nhận tin nhắn vẫn có thể tiến hành thiết lập và kết thúc cuộc gọi.
<i><b>4.4. Các lệnh về GPRS </b></i>
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.
<i>Trong giới hạn của đề tài, ta chỉ sử dụng đến các lệnh thực hiện việc gửi và đọc tin nhắn SMS. </i>
<b>1. Khái quát về Vi điều khiển PIC16F877A </b>
Khối xử lí trung tâm đóng vai trị chính là PIC16F877A sẽ làm nhiệm vụ chính là tiếp nhận và xử lí các dữ liệu đến và đi một cách tự động. Đề tài sử dụng PIC16F877A vì những ưu điểm vượt trội của nó so với các vi điều khiển khác.Về
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">mặt tính năng và cơng năng thì có thể xem PIC vượt trội hơn rất nhiều so với VĐK họ 89 với nhiều module được tích hợp sẵn như ADC 10 BIT, PWM 10 BIT, EEPROM 256 BYTE, COMPARATER, VERF COMPARATER…Về mặt giá cả thì có đơi chút chênh lệch như giá 1 con 89S52 khoảng 20.000 thì PIC16F877A là 80.000 nhưng khi so sánh như thế thì ta nên xem lại phần linh kiện cho việc thiết kế mạch nếu như sử dụng VĐK họ 89 muốn có ADC phải dùng thêm IC ADC chẳng hạn như ADC 0808 hay 0809 với giá vài chục ngàn và bộ opamp thì khi sử dung PIC nó đã tích hợp cho ta sẵn các module đó có nghĩa là không cần bổ sung thêm ADC, Opam, EPPROM vì PIC đã có sẵn trong nó. Ngồi ra việc sử dụng VĐK PIC16F877A có nhiều thuận lợi hơn trong thiết kế board, khi đó board mạch sẽ nhỏ gọn và đẹp hơn dễ thi công hơn rất nhiều, vì tính về giá cả tổng cộng cho đến lúc thành phẩm thì PIC có thể xem như rẻ hơn VĐK họ 89. Một điều đặc biệt nữa là tất cả các con PIC được sử dụng thì đều có chuẩn PI tức chuẩn cơng nghiệp thay vì chuẩn PC (chuẩn dân dụng).
Ngồi ra, PIC có ngơn ngữ hổ trợ cho việc lập trình ngồi ngơn ngữ Asembly cịn có ngơn ngữ C với rất nhiều trình biên dịch như CCS, HTPIC, MirkoBasic,… Bên cạnh đó với bề dày của sự phát triển lâu đời PIC đã tạo ra rất nhiều diễn đàn sôi nổi về PIC cả trong và ngoài nước. Chính vì vậy chúng ta sẽ có nhiều thuận lợi trong việc dễ dàng tìm kiếm các thơng tin lập trình cho các dịng PIC.
Dịng PIC16F877A được chọn sử dụng trong đề tài là dịng phổ thơng với các tính năng cơ bản và dễ cho việc sử dụng với:
- Tập lệnh để lập trình chỉ có 35 lệnh với độ dài 14bit rất dễ nhớ và dễ học. Mỗi lệnh đều được thực thi trong 1 chu kỳ xung clock. Tốc độ hoạt động tối đa cho phép là 20MHz với 1 chu kỳ lệnh là 200ns.
- Bộ nhớ chương trình: 8K x 14 words; bộ nhớ dữ liệu: 368 x 8 Bytes (RAM); bộ nhớ dữ liệu EEPROM 256 x 8 bytes.
- Khả năng ngắt lên đến 14 nguồn ngắt.
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">- Dải điện thế hoạt động rộng: từ 2.0V đến 5.5V - Mức công suất tiêu thụ thấp:
Nhỏ hơn 0.6 mA khi điện thế cấp là 3V, tần số thạch anh 4 MHz
20 μA khi điện thế cấp là 3V, tần số thạch anh 32 kHz
Nhỏ hơn 1 μA ở chế độ chờ với nguồn dự phòng. - Số PORT I/O là 5 với 33 pin I/O.
- Các đặc tính ngoại vi bao gồm các khối chức năng sau:
Timer0: bộ đếm/ định thời 8 bit với bộ chia tần số 8 bit.
Timer1: bộ đếm/ định thời 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep.
Timer2: bộ đếm/ định thời 8 bit.
2 bộ Capture (thu thập) 16 bit với độ chính xác tối đa là 12.5ns
2 bộ Compare (so sánh) 16 bit với độ chính xác tối đa là 200ns
2 bộ PWM (điều chế độ rộng xung) 10 bit
Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI (Serial Peripheral Interface Bus) và I²C (Inter-Integrated Circuit).
Chẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD, WR, CS ở bên ngoài.
1 bộ ADC với 8 kênh 10 bit.
Bên cạnh đó là một vài đặc tính khác của vi điều khiển như:
Bộ nhớ Flash với khả năng ghi xoá được 100.000 lần.
Bộ nhớ EEPROM với khả năng ghi xoá được 1.000.000 lần.
Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.
Khả năng tự nạp chương trình với sự điều khiển của phần mềm.
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16"> Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial Programming) thông qua 2 chân.
Watchdog Timer với bộ dao động trong.
Chức năng bảo mật mã chương trình.
Chế độ Sleep tiết kiệm năng lượng.
Có thể hoạt động với nhiều dạng Oscillator khác nhau.
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17"><b>2. Sơ đồ khối và khái quát cấu trúc phần cứng của VĐK PIC16F877A </b>
<i><b>2.1. Sơ đồ khối vi điều khiển PIC16F877A </b></i>
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18"><i><b>2.2. Một số đặc tính của CPU </b></i>
<i>2.2.1. Configuration bit </i>
Đây là các bit dùng để lựa chọn các đặc tính của CPU. Các bit này được chứa trong bộ nhớ chương trình tại địa chỉ 2007h và chỉ có thể được truy xuất trong quá trình lập trình cho VĐK. Chi tiết về các bit này như sau:
Bit 13 : CP (Code Protection) 1: tắt chế bảo vệ mã chương trình. 0: bật chế độ bảo vệ mã chương trình.
Bit 12, 5, 4 : khơng quan tâm và được mặc định mang giá trị 0. Bit 11 : DEBUG (In-circuit debug mode bit)
1: không cho phép, RB7 và RB6 được xem như các pin xuất nhập bình thường.
0: cho phép, RB6 và RB7 là các pin được sử dụng cho quá trình debug.
Bit 10, 9 : WRT1 : WRT0 (Flash Program Memory Write Enable bit) 11: tắt chức năng chống ghi, EECON sẽ điều khiển q trình ghi lên tịan bộ nhớ chương trình.
10: chỉ chống ghi từ địa chỉ 0000h : 00FFh. 01: chỉ chống ghi từ địa chỉ 0000h : 07FFh. 00: chỉ chống ghi từ địa chỉ 0000h : 0FFFh.
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">Bit 8 : CPD (Data EEPROM Memory Write Protection bit) 1: tắt chức năng bảo vệ mã của EEPROM.
0: không cho phép BOR.
Bit 3 : PWRTEN (Power-up Timer Enable bit) 1: không cho phép PWR.
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">01: sử dụng XT oscillator. 00: sử dụng LP oscillator.
<i>2.2.2. Các đặc tính của Oscillator </i>
PIC16F877A có khả năng sử dụng một trong 4 lọai oscillator, đó là: LP: (Low Power Crystal).
XT: Thạch anh bình thường. HS: (High-Speed Crystal).
Trong một thời điểm chỉ có một chương trình ngắt được thực thi, chương trình ngắt được kết thúc bằng lệnh RETFIE. Khi chương trình ngắt được thực thi, bit GIE tự động được xóa, địa chỉ lệnh tiếp theo của chương trình được cất vào bộ nhớ Stack và bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h. Lệnh RETFIE được dùng để thóat khỏi chương trình ngắt và quay trở về chương trình chính, đồng thời
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">bit GIE cũng được set để cho phép các ngắt họat động trở lại. Các cờ hiệu được dùng để kiểm tra ngắt nào đang xảy ra và phải được xóa bằng chương trình chính trước khi cho phép ngắt tiếp tục họat động trở lại để ta có thể phát hiện thời điểm tiếp theo mà ngắt xảy ra.
Đối với các ngắt ngọai vi như ngắt từ chân INT hay ngắt từ sự thay đổi trạng thái các pin của PORTB, việc xác định ngắt nào xảy ra cần 3 hoặc 4 chu kỳ lệnh tùy thuộc vào thời điểm xảy ra ngắt.
2.2.3.1. Ngắt INT
Ng8át này dựa trên sự thay đổi trạng thái của pin RB0/INT. Cạnh tác động gây ra ng8át có thể là cạnh lên hay cạnh xuống và được điều khiển bởi bit INTEDG (thanh ghi OPTIONREG<6>). Khi có cạnh tác động thích hợp xuất hiện tại pin RB0/INT, cờ ngắt INTF được set bất chấp trạng thái các bit điều khiển GIE và PEIE. Ngắt này có khả năng đánh thức CĐK từ chế độ sleep nếu bit cho phép ngắt được set trước khi lệnh SLEEP được thực thi.
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">2.2.3.2. Ngắt do sự thay đổi trạng thái các pin trong PORTB
Các pin PORTB<7:4> được dùng cho ngắt này và được điều khiển bởi bit RBIE (thanh ghi INTCON<4>). Cờ ngắt của ngắt này là bit RBIF (INTCON<0>).
<i><b>2.3. Các cổng xuất nhập của PIC16F877A </b></i>
VĐK PIC16F877A có 5 cổng xuất nhập, bao gồm PORTA, PORTB, PRTC, PORTD, PORTE. Muốn xác lập chức năng của một chân trong PORT A là input, ta set bit điều khiển tương ứng với chân đó trong thanh ghi TRISA và ngược lại, muốn xác lập chức năng của một chân trong PORT A là output, ta clear bit điều khiển tương ứng với trong đó trong thanh ghi TRISA. Tương tự đối với các PORT và các thanh ghi điều khiển tương ứng TRIS (đối với PORT A là TRISA, đối với PORT B là TRISB, đối với PORT C là TRISC, đối với PORT D là TRISD, đối với PORT D là TRISD).
<i>2.3.1. PORT A </i>
PORT A (RPA) bao gồm 6 I/O pin. Đây là các chân “hai chiều” (bidirectional pin), nghĩa là có thể xuất và nhập được. Chức năng I/O này được điều khiển bởi thanh ghi TRISA (địa chỉ 85h). Bên cạnh đó PORT A còn là ngõ vào của bộ ADC, bộ so sánh, ngõ vào xung clock của Timer0 và ngõ vào của bộ giao tiếp MSSP (Master Synchronous Serial Port).
Các thanh ghi SFR liên quan đến PORTA bao gồm:
o PORTA (địa chỉ 05h) : chứa giá trị các pin trong PORTA. o TRISA (địa chỉ 85h) : điều khiển xuất nhập.
o CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh điện áp.
o ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển bộ ADC.
</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">Các thanh ghi SFR liên quan đến PORTB bao gồm:
o PORTB (địa chỉ 06h, 106h) : chứa giá trị các pin trong PORT B.
o TRISB (địa chỉ 86h, 186h) : điều khiển xúât nhập.
</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">o OPTION_REG (địa chỉ 81h, 181h): điều khiển ngắt ngoại vi và bộ Timer0.
Hình 1.6: Sơ đồ khối các chân RB3:RB0
Hình 1.7: Sơ đồ khối các chân RB7:RB4
<i>2.3.3. PORT C </i>
PORT C (RPC) gồm 8 pin I/O. Bên cạnh đó, PORT C còn chứa các chân chức năng của bộ so sánh, bộ Timer1, bộ PWM và các chuẩn giao tiếp nối tiếp I²C, SPI, SSP, USART.
Các thanh ghi điều khiển liên quan đến PORT C;
o PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORT C. o TRISC (địa chỉ 87h) : điều khiển xuất nhập.
</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">Hình 1.9: Sơ đồ khối các chân RC2:RC0 và RC7:RC5 Hình 1.10: Sơ đồ khối các chân Rc4:RC3
<i>2.3.4. PORT D </i>
PORT D (RPD) gồm 8 pin I/O. PORT D còn là cổng xúât dữ liệu của chuẩn giao tiếp PSP (Parallel Slave Port).
Các thanh ghi liên quan đến PORT D bao gồm:
o Thanh ghi PORTD : chứa giá trị các pin trong PORT D. o Thanh ghi TRISD : điều khiển xuất nhập.
</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">Hình 1.21: Sơ đồ khối các chân RD7:RD0
<i>2.3.5. PORT E </i>
PORT E (RPE) gồm 3 chân I/O. Các chân của PORT E có ngõ vào analog. Bên cạnh đó PORTE cịn là các chân điều khiển của chuẩn giao tiếp PSP.
Các thanh ghi liên quan đến PORT E bao gồm:
thông số cho chuẩn giao tiếp PSP.
</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">Hình 1.22: Sơ đồ khối các chân RE2:RE0
Để mã hoá được địa chỉ của 8K word bộ nhớ chương trình, bộ đếm chương tirnh2 có dung lượng 13 bit (PC<12:0>)
</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h (Reset Vector). Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h (Interrupt Vector).
Bộ nhớ chương trình khơng bao gồm bộ nhớ stack và kh6ong được địa chỉ hoá bởi bộ đếm chương trình
Hình 1.23: Sơ đồ bộ nhớ chương trình PIC16F877A
<i>2.4.2. Bộ nhớ dữ liệu </i>
Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia làm nhiều Bank. Đối với PIC16F877A, bộ nhớ dữ liệu được chia làm 4 Bank. Mỗi Bank có dung lượng
</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">128 Byte, bao gồm các thanh ghi có chức năng đặc biệt SFR (Special Functin Register) nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chung GPR (General Purpose Register) nằm ở vùng địa chỉ còn lại trong Bank. Các thanh ghi SFR thường xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽ được đặt ở tất cả các Bank của bộ nhớ dữ liệu giúp thuận tiện trong quá trình truy xuất và làm giảm bớt lệnh của chương trình. Sơ đồ cụ thể của bộ nhớ dữ liệu PIC16F877A như sau:
</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">Hình 1.24: Sơ đồ bộ nhớ dữ liệu PIC16F877A
</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31"><i>2.4.2.1. Thanh ghi chức năng đặc biệt SFR </i>
Đây là các thanh ghi được sử dụng bởi CPU hoặc được dùng để thiết lập và điều khiển các khối chức năng tích hợp bên trong VĐK. Có thể phân thanh ghi SFR làm 2 loại: thanh ghi SFR liên quan đến các chức năng bên trong (CPU) và thanh ghi SFR dùng để thiết lập và điều khiển các khối chức năng bên ngồi ( ví dụ: ADC, PWM…). Phần này sẽ đề cập đến các thanh ghi liên quan đến chức năng bên trong. Các thanh ghi dùng để thiết lập và điều khiển các khối chức năng sẽ được nhắc đến khi ta đề cập đến các khối chức năng đó
Thanh ghi STATUS (03h, 83h, 103h, 183h): thanh ghi chứa kết quả thực hiện phép toán của khối ALU, trạng thái reset và các bit chọn bank cần truy xuất trong bộ nhớ dữ liệu.
Thanh ghi OPTION_REG (81h, 181h): thanh ghi này cho phép đọc và ghi, cho phép điều khiển chức năng pull-up của các chân trong PORTB, xác lập các tham số về xung tác động, cạnh tác động của ngắt ngoại vi và bộ đếm Timer0.
Thanh ghi INTCON (0Bh, 8Bh, 10Bh, 18Bh): thanh ghi này cho phép đọc và ghi, chứa các bit điều khiển và các bit cờ hiệu khi Timer 0 bị tràn, ngắt ngoại vi RB0/INT và ngắt interrupt-on-change tại các chân của PORTB.
Thanh ghi PIE1(8Ch): chứa các bit điều khiển chi tiết các ng8át của các khối chức năng ngọai vi.
</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32"> Thanh ghi PIR1 (0Ch) chứa cờ ngắt của các khối chức năng ngọai vi, các ngắt này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE1.
Thanh ghi PIE2 (8Dh): chứa các bit điều khiển các ngắt của các khối chức năng CCP2, SSP bus, ng8át của bộ so sánh và ngắt ghi vào bộ nhớ EEPROM.
Thanh ghi PIR2 (0Dh): chứa các cờ ngắt của các khối chức năng ngọai vi, các ngắt này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE2.
Thanh ghi PCON (8Eh): chứa các cờ hiệu cho biết trạng thái các chế độ reset của vi điều khiển.
<i>2.4.2.2. Thanh ghi mục đích chung GPR </i>
Các thanh ghi này có thể được truy xuất trực tiếp hoặc gián tiếp thông qua thanh ghi FSG (File Select Register). Đây là các thanh ghi dữ liệu thông thường, người sử dụng có thể tùy theo mục đích chương trình mà có thể dùng cá thanh ghi này để chứa các biến số, hằng số, kết quả hoặc các tham số phục vụ cho chương trình
</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33"><i>2.4.3. STACK </i>
Stack khơng nằm trong bộ nhớ chương trình hay bộ nhớ dữ liệu mà là một vùng nhớ đặc biệt không cho phép đọc hay ghi. Khi lệnh CALL được thực hiện hay khi 1 ngắt xảy ra làm chương trình bị rẽ nhánh, giá trị của bộ đếm chương trình PC tự động được VĐK cất vào trong stack.
Bộ nhớ stack trong VĐK PIC họ 16F87xA có khả năng chứa được 8 địa chỉ và hoat động theo cơ chế xoay vòng. Nghĩa là giá trị cất vào bộ nhớ stack lần thứ 9 sẽ ghi đè lên giá trị cất vào stack lần đầu tiên
Khơng có cờ hiệu nào cho biết trạng thái stack, do đó khơng thể biết được khi nào stack tràn. Các thao tác với bộ nhớ stack sẽ hịan tồn được điều khiển bởi CPU.
<i><b>2.5. Timer 0 </b></i>
Đây là một trong ba bộ đếm hoặc bộ định thời của VĐK PIC16F877A. Timer 0 là bộ đếm 8 bit được kết nối với bộ chia tần số (prescaler) 8 bit. Cấu trúc của Timer 0 cho phép ta lựa chọn xung clock tác động và cạnh tích cực của xung clock. Ngắt Timer 0 sẽ xuất hiện khi Timer 0 bị tràn. Bit TMR0IE (INTCON<5>) là bit điều khiển của Timer 0. TMR0IE = 1 cho phép ngắt Timer 0 tác động, TMR0IE = 0 không cho phép ngắt Timer 0 tác động.
Muốn Timer 0 họat động ở chế độ timer ta clear bit TOSC (OPTION_REG<5>), khi đó giá trị thanh ghi TMR0 sẽ tăng theo từng chu kì xung đồng hồ (tần số vào Timer 0 bằng ¼ tần số oscillator). Khi giá trị thanh ghi TMR0 từ FFh trở về 00h, ngắt Timer 0 sẽ xuất hiện. Thanh ghi TMR0 cho phép ghi và xóa giúp ta ấn định thời điểm ngắt Timer0 xuất hiện một cách linh động.
Muốn Timer 0 họat động ở chế độ Counter ta set bit TOSC (OPTION_REG<5>). Khi đó xung tác động lên bộ đếm được lấy từ chân RA4/TOCK1. Bit TOSE (OPTION_REG<4>) cho phép lực chọn cạnh tác động vào bộ đếm. Cạnh tác động là cạnh lên nếu TOSE = 0 và cạnh tác động là cạnh xuống nếu TOSE = 1.
</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">Hình 1.25: Sơ đồ khối của Timer 0
Khi thanh ghi TMR0 bị tràn, bit TMR0IF (INTCON<2>) sẽ được set. Đây chính là cờ ngắt của Timer0. Cờ ngắt này phải được xóa bằng chương trình trước khi bộ đếm bắt đầu thực hiện quá trình đếm. Ngắt Timer0 không thể “đánh thức” VĐK từ chế độ sleep.
Bộ chia tần số (prescaler) được chia sẻ giữa Timer 0 và WDT (Watchdog Timer). Điều đó có nghĩa là nếu prescaler được sử dụng cho Timer 0 thì WDT sẽ khơng có được hỗ trợ của prescaler và ngược lại.
<i><b>2.6. ADC </b></i>
ADC (Analog to Digital Converter) là bộ chuyển đổi tín hiệu từ dạng tương tự sang dạng số. VĐK PIC16F877a có 8 ngõ vào analog (RA4:RA0 và RE2:RE0). Hiệu điện thế chuẩn VREF có thể lựa chọn là VDD, VSS hay hiệu điện thế chuẩn được xác lập trên 2 chân RA2 và RA3. Kết quả chuyển đổi từ tín hiệu tương tự sang
</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">tín hiệu số là 10 bit số tương ứng và được lưu trong 2 thanh ghi ASRESH:ADRESL. Khi không sử dụng bộ chuyển đổi ADC, các thanh ghi này có thể được sử dụng như các thanh ghi thơng thường khác.
Hình 1.26: Sơ đồ khối bộ chuyển đổi ADC Qui trình chyển đổi từ tương tự sang số bao gồm các bước sau:
1- Thiết lập các thông số cho bộ chuyển đổi ADC:
Chọn ngõ vào Analog, chọn điện áp mẫu (dựa trên các thông số của thanh ghi ADCON1).
Chọn kênh chuyển đổi AD (thanh ghi ADCON0).
</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36"> Chọn xung clock cho kênh chuyển đổi AD (thanh ghi ADCON0).
Cho phép bộ chuyển đổi AD họat động (thanh ghi ADCON0).
2- Thiết lập cá cờ ngắt cho bộ AD Clear bit ADIF.
Set bit ADIE. Set bit PEIE. Set bit GIE.
3- Đợi cho tới khi q trình lấy mẫu hịan tất.
4- Bắt đầu quá trình chuyển đổi (set bit GO/DONE).
5- Đợi cho tới khi q trình chuyển đổi hịan tất bằng cách:
Kiểm tra bit GO/DONE. Nếu GO/DONE =0, quá trình chuyển đổi đã hịan tất.
</div>