Cấu trúc bộ nhớ và giao tiếp USART

Một phần của tài liệu Giao tiếp với GSM (Trang 34)

3.2.1. Cấu trúc bộ nhớ

Bộ nhớ vi điều khiển ATMega128 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ớ ATMega128 đƣợc chia làm 2 phần chính:

- Bộ nhớ chƣơng trình (program memory)

- Bộ nhớ dữ liệu (data memory).

Bộ nhớ chƣơng trình :

Bộ nhớ chƣơng trình của ATMega128 là bộ nhớ flash có dung lƣợng 128Kbyte. 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 véc tơ ngắt. Ở vi điều khiển ATmega128 bộ nhớ chƣơng trình còn có thể đƣợc chia làm 2 phần:

-Phần boot loader (Boot loader program section)

-Phần ứng dụng (Application program section).

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ẽ 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. Hình 3.4 thể hiện cấu trúc bộ nhớ chƣơng trình có sử dụng và 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.4: Bộ nhớ chƣơng trình có và không có sử dụng Boot loader

- Bộ nhớ dữ liệu:

Bộ nhớ dữ liệu của ATMega128 chia làm 2 phần chính là bộ nhớ SRAM 4Kbyte và bộ nhớ EEPROM 4Kbyte. Tuy cùng là bộ nhớ dữ liệu nhƣng hai bộ nhớ này lại tách biệt nhau và đƣợc đánh địa chỉ riêng.

- Bộ nhớ SRAM:

Có dụng lƣợng 4Kbyte, Bộ nhớ SRAM có hai chế độ hoạt động là chế độ thông thƣờng và chế độ tƣơng thích với ATmega103, 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 (M103C fuse bits).

- Bộ nhớ SRAM ở chế độ bình thƣờng:

Ở chế độ bình thƣờng 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) R0 đến R31 có địa chỉ từ $0000 tới $001F. Phần thứ 2 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ứ 3 dùng cho vùng nhớ dành cho các thanh ghi vào ra mở rộng (Extended I/ O Registers) có địa chỉ từ $0060 tới $00FF. Phần thứ 4 là vùng SRAM nội với 4096byte có địa chỉ từ

$0100 tới $10FF. Phần thứ 5 là vùng nhớ SRAM ngoài (External SRAM) bắt đầu từ địa chỉ $1100, vùng SRAM mở rộng này có thể mở rộng lên đến 64Kbyte. Khi nói bộ nhớ SRAM có dung lƣợng 4Kbyte là nói tới phần thứ 4 (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,25Kbyte = 4352byte.

- Bộ nhớ SRAM ở chế độ tƣơng thích ATmega103:

Ở chế này bộ nhớ SRAM cơ bản cũng giống ở chế độ bình thƣờng, ngoại trừ phần thứ 3 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 của phần SRAM nội (internal SRAM) chỉ có 4000 byte so với 4096 byte ở chế độ bình thƣờng.

Hình 3.5: Bản đồ bộ nhớ dữ liệu

A: Chế độ bình thường

B: Chế độ tương thích ATmega103

- 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ộ nhớ 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 ATmega128, bộ nhớ EEPROM có kích thƣớc là 4Kbyte. 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 vào ra dữ liệu với EEPROM ta sử dụng 3 thanh ghi sau:

- Thanh ghi EEAR (EEARH và EEARL):

Thanh ghi 16 bit lƣu giữ địa chỉ của các ô nhớ của EEPROM.

- Thanh ghi EEDR:

Đây là thanh ghi dữ liệu 8 bit của EEPROM, là nơi chứa dữ liệu ta định ghi vào hay lấy ra từ EEPROM.

- Thanh ghi EECR:

Đây là thanh ghi điều khiển 8 bit EEPROM, ta chỉ sử dụng 4 bit đầu của thanh ghi này, 4bit cuối là dự trữ, ta nên ghi 0 vào các bit dự trữ.

3.2.2. Giao tiếp USART [11]

USART (Universal Synchronous and Asynchronous serial Receiver and

Transmitter): Bộ truyền, nhận nối tiếp Đồng bộ Và Bất đồng bộ phổ dụng, đây là khối chức năng dùng cho việc truyền thông giữa vi điều khiển với các thiết bị khác. Trong vấn đề truyền dữ liệu số, có thể phân chia cách thức (method)

truyền dữ liệu ra hai chế độ (mode) cơ bản là: chế độ truyền, nhận Đồng bộ

(Synchronous) và chế độ truyền, nhận Bất đồng bộ (Asynchronous). Ngoài ra,

nếu ở góc độ phần cứng thì có thể phân chia theo cách khác đó là: Truyền nhận dữ liệu theo kiểu nối tiếp (serial) và song song (paralell).

• Truyền đồng bộ:

Là kiểu truyền dữ liệu trong đó bộ truyền (Transmitter) và bộ nhận (Receiver) sử dụng chung một xung đồng hồ (clock). Do đó, hoạt động truyền và nhận dữ liệu diễn ra đồng thời. Xung clock đóng vai trò là tín hiệu đồng bộ cho hệ thống (gồm khối truyền và khối nhận). Ƣu điểm của kiểu truyền đồng bộ là tốc độ nhanh, thích hợp khi truyền dữ liệu khối (block).

• Truyền bất đồng bộ:

Là kiểu truyền dữ liệu trong đó mỗi bộ truyền (Transmitter) và bộ nhận (Receiver) có bộ tạo xung clock riêng, tốc độ xung clock ở hai khối này có thể khác nhau, nhƣng thƣờng không quá 10%. Do không dùng chung xung clock, nên để đồng bộ quá trình truyền và nhận dữ liệu, ngƣời ta phải truyền các bit đồng bộ (start, stop…) đi kèm với các bit dữ liệu. Các bộ truyền và bộ nhận sẽ dựa vào các bit đồng bộ này để quyết định khi nào thì sẽ thực hiện hay kết thúc

quá trình truyền hoặc nhận dữ liệu. Do đó, hệ thống truyền không đồ bộ còn đƣợc gọi là hệ thống truyền “tự đồng bộ”.

Từ hai kiểu truyền dữ liệu cơ bản trên, ngƣời ta đƣa ra nhiều giao thức (Protocol) truyền khác nhau nhƣ: SPI (đồng bộ), USRT (đồng bộ), UART (bất đồng bộ)…Tuy vậy, cũng có giao thức truyền mà không thể xếp đƣợc vào kiểu nào: đồng bộ hay bất đồng bộ, chẳn hạn kiểu truyền I2C (Trong AVR gọi là TWI), tuy vậy một cách hơi gƣợng ép thì có thể thấy giao thức truyền I2C gần với kiểu đồng bộ hơn vì các thiết bị giao tiếp với nhau theo chuẩn I2C điều dùng chung một xung clock.

ATmega128 có hai bộ USART là USART0 và USART1. Hai bộ USART này là độc lập nhau, điều này có nghĩa là hai khối USART0 và USART1 có thể hoạt động cùng một lúc.

Tất cả hoạt động và tráng thái của USART0 đƣợc điều khiển và quan sát thông qua các thanh ghi trong vùng nhớ I/O. Có 5 thanh ghi đƣợc thiết kế riêng cho hoạt động và điều khiển của USART0, đó là:

* UDR0: Hay thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa giá trị nhận đƣợc và phát đi của USART0. Thực chất thanh ghi này có thể coi nhƣ 2 thanh ghi TXB0 (Transmit data Buffer) và RXB0 (Reveive data Buffer) có chung địa chỉ. Đọc UDR0 thu đƣợc giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR0 tƣơng đƣơng đặt giá trị vào thanh ghi đệm phát, chuẩn bị để gởi đi. Chú ý trong các khung truyền sử dụng 5, 6 hoặc 7 bit dữ liệu, các bit cao của thanh ghi UDR0 sẽ không đƣợc sử dụng.

Hình 3.6: Thanh ghi dữ liệu UDR0

* UCSRA0: (USART Control and Status Register A): Là 1 trong 3 thanh ghi điều khiển hoạt động của môđun USART0.

Hình 3.7: Thanh ghi điều khiển hoạt động UCSRA0

UDR (Write) RXB[7:0] TXB[7:0] UDR (Read) 0 3 2 1 4 7 6 5 R/W R/W R/W R/W R/W R/W R/W R/W UCSRA 0 3 2 1 4 7 6 5 R/W R/W R R R R R/W R

Thanh ghi UCSRA0 chủ yếu chứa các bit trạng thái nhƣ bit báo quá trình nhận kết thúc (RXC), truyền kết thúc (TXC), báo thanh ghi dữ liệu trống (UDRE), khung truyền có lỗi (FE), dữ liệu tràn (DOR), kiểm tra parity có lỗi (PE)…bạn chú ý một số bit quan trọng của thanh ghi này.

* UDRE0 (USART Data Register Empty) khi bit bày bằng 1 nghĩa là

thanh ghi dữ liệu UDR đang trống và sẵn sàng cho một nhiệm vụ truyền hay nhận tiếp theo. Vì thế nếu bạn muốn truyền dữ liệu đầu tiên bạn phải kiểm tra xem bit UDRE0 có bằng 1 hay không, sau khi chắc chắn rằng UDRE0 = 1 hãy viết dữ liệu vào thanh ghi UDR để truyền đi.

- U2X là bit chỉ định gấp đôi tốc độ truyền, khi bit này đƣợc set lên 1, tốc độ truyền so cao gấp 2 lần so với khi bit này mang giá trị 0.

- MPCM là bit chọn chế độ hoạt động đa xử lí (multi-processor).

* UCSRB0 (USART Control and Status Register B): Đây là thanh ghi

quan trọng điều khiển USART0. Vì thế chúng ta sẽ khảo sát chi tiết từng bit của thanh ghi này.

Hình 3.8: Thanh ghi điều khiển hoạt động USART0

- RXCIE (Receive Complete Interrupt Enable) là bit cho phép ngắt khi quá trình nhận kết thúc. Việc nhận dữ liệu truyền bằng phƣơng pháp nối tiếp không đồng bộ thƣờng đƣợc thực hiện thông qua ngắt, vì thế bit này thƣờng đƣợc set bằng 1 khi USART đƣợc dung nhận dữ liệu.

- TXCIE (Transmit Complete Interrupt Enable) là bit cho phép ngắt khi quá trình truyền kết thúc.

- UDRIE (USART Data Register Empty Interrupt Enable) là bit cho phép ngắt khi thanh ghi dữ liệu UDR trống.

- RXEN (Receiver Enable) là một bit quan trọng điều khiển bộ nhận của USART, đề kích hoạt chức năng nhận dữ liệu bạn phải set bit này lên 1.

- TXEN (Transmitter Enable) là bit điều khiển bộ phát. Set bit này lên 1 bạn sẽ khởi động bộ phát của USART.

- UCSZ2 (Chracter size) bit này kết hợp với 2 bit khác trong thanh ghi

UCSRB 0 3 2 1 4 7 6 5 R/W R R/W R/W R/W R/W R/W R/W

CSRC0 quy định độ dài của dữ liệu truyền/nhận. Chúng ta sẽ khảo sát chi tiết khi tìm hiểu thanh ghi UCSRC0.

- RXB8 (Receive Data Bit 8) gọi là bit dữ liệu 8. Bạn nhớ lại rằng USART0 trong ATMega128 có hỗ trợ truyền dữ liệu có độ dài tối đa 9 bit, trong khi thanh ghi dữ liệu là thanh ghi 8 bit. Do đó, khi có gói dữ liệu 9 bit đƣợc nhận, 8 bit đầu sẽ chứa trong thanh ghi UDR, cần có 1 bit khác đóng vai trò bit thứ chín, RXD8 là bit thứ chín này. Bạn chú ý là các bit đƣợc đánh số từ 0, vì thế bit thứ chín sẽ có chỉ số là 8, vì lẽ đó mà bit này có tên là RXD8 (không phải RXD9).

- TXB8 (Transmit Data Bit 8), tƣơng tự nhƣ bit RXD8, bit TXB8 cũng đóng vai trò bit thứ 9 truyền thông, nhƣng bit này đƣợc dung trong lúc truyền dữ liệu.

* UCSRC0 (USART Control and Status Register C): Thanh ghi này chủ

yếu quy định khung truyền và chế độ truyền. Tuy nhiên, có một rắc rối nho nhỏ

là thanh ghi này lại có cùng địa chỉ với thanh ghi UBRRH (thanh ghi chứa byte

cao dùng để xác lập tốc độ baud), nói một cách khác 2 thanh ghi này là 1. Vì thế bit 7 trong thanh ghi này, tức bit URSEL là bit chọn thanh ghi. Khi URSEL = 1, thanh ghi nàyđƣợc chip AVR hiểu là thanh ghi điều khiển UCSRC, nhƣng nếu bit URSEL = 0 thì thanh ghi UBRRH sẽ đƣợc sử dụng.

Hình 3.9: Thanh ghi UCSRC

Các bit còn lại trong thanh ghi UCSRC0 đƣợc mô tả nhƣ sau:

* UMSEL (USART Mode Select) là bit lựa chọn giữa 2 chế độ truyền

thông đồng bộ và không đồng bộ. Nếu UMSEL = 0, chế độ không đồng bộ đƣợc chọn, ngƣợc lại nếu UMSEL = 1, chế độ đồng bộ đƣợc kích hoạt.

* Hai bit UPM1 và UPM0 (Parity Mode) đƣợc dùng để quy định kiểm tra pariry. Nếu UPM1: 0 = 00, parity không đƣợc sử dụng (mode này khá thông dụng) UPM1: 0 = 01 không đƣợc sử dụng, UPM1: 0 = 10 thì parity chẵn đƣợc dùng, UPM1: 0 = 11 parity lẻ đƣợc sử dụng. UCSRC 0 3 2 1 4 7 6 5 R/W R/W R/W R/W R/W R/W R/W R/W

URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL

0

0 1 1

0

Bảng 3.1: Chọn kiểm tra Parity

UPM1 UPM0 Parity Mode

0 0 Disabled

0 1 Reserved

1 0 Enabled, Even Parity

1 1 Enabled, Odd Parity

* USBS (Stop bit Select), bit stop trong khung truyền bằng AVR USART có thể là 1 hoặc 2 bit, nếu USBS=0 thì stop bit chỉ là 1 bit trong khi USBS = 1 sẽ có 2 stop bit đƣợc dùng.

* Hai bit UCSZ1 và UCSZ2 (Character Size) kết hợp với bit UCSZ2 trong thanh ghi UCSRB tạo thành 3 bit quy định độ dài dữ liệu truyền. Bảng 3.2 tóm tắt các giá trị có thể có của tổ hợp 3 bit này và độ dài dữ liệu truyền tƣơng ứng.

Bảng 3.2: Độ dài dữ liệu truyền

UCSZ2 UCSZ1 UCSZ0 Character Size

0 0 0 5-bit 0 0 1 6-bit 0 1 0 7-bit 0 1 1 8-bit 1 0 0 Reserved 1 0 1 Reserved 1 1 0 Reserved 1 1 1 9-bit

* UCPOL (Clock Pority) là bit chỉ cực của xung kích trong chế độ truyền thông đồng bộ. nếu UCPOL=0, dữ liệu sẽ thay đổi thay đổi ở cạnh lên của xung nhịp, nếu UCPOL=1, dữ liệu thay đổi ở cạnh xuống xung nhịp. Nếu bạn sử dụng chế độ truyền thông không đồng bộ, hãy set bit này bằng 0.

* UBRRL và UBRRH (USART Baud Rate Register): 2 thanh ghi thấp và cao quy định tốc độ Baud.

Hình 3.10: Cấu Trúc Hai Thanh Ghi UBRRL và UBRRH

UBRRL URSEL - - - UBRR[11:8] UBRR[7:0] UBRRH 8 11 10 9 12 15 14 13 0 3 2 1 4 7 6 5

Nhắc lại là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC0, bạn phải set bit này bằng 0 nếu muốn sử dụng thanh ghi UBRRH. Nhƣ bạn quan sát trong hình trên, chỉ có 4 bit thấp của UBRRH đƣợc dùng, 4 bit này kết hợp với 8 bit trong thanh ghi UBRRL tạo thành thanh ghi 12 bit quy định tốc độ Baud. Chú ý là nếu bạn viết giá trị vào thanh ghi UBRRL, tốc độ Baud sẽ tức thì đƣợc cập nhật, vì thế bạn phải viết giá trị vào thanh ghi UBRRH trƣớc khi viết vào thanh ghi UBRRL.

Giá trị gán cho thanh ghi UBRR không phải là tốc độ Baud, nó chỉ đƣợc USART0 dùng để tính tốc độ Baud. Bảng 3.3 hƣớng dẫn cách tính tốc độ Baud dựa vào giá trị của thanh ghi UBRR và ngƣợc lại, cách tính giá trị cần thiết gán cho thanh ghi UBRR khi đã biết tốc độ Baud.

Bảng 3.3 Tính tốc độ BAUD.

Chế độ hoạt động Phƣơng trình tính toán

tốc độ Baud(1)

Phƣơng trình tính toán giá trị UBRR

Asynchronous Normal

Mode (U2X=0) 16(UBRR1)

f BAUD OSC 1 16   BAUD f UBRR OSC Asynchronous Double

Speed Mode (U2X=1)  8(UBRR1)

f BAUD OSC 1 8   BAUD f UBRR OSC Asynchronous Master Mode  2(UBRR1) f BAUD OSC 1 2   BAUD f UBRR OSC

Trong các công thức trong bảng 3.3, fOSC là tốc tần số xung nhịp của hệ thống (thạch anh hay nguồn xung nội…).

CHƢƠNG IV: TRIỂN KHAI THỬ NGHIỆM PHẦN CỨNG

Việc giám sát trạng thái, điều khiển thiết bị từ xa ngày càng trở nên quan trọng trong đời sống hiện đại và đang đƣợc phát triển mạnh mẽ ở nƣớc ta, nó mang lại nhiều tiện lợi, hiệu quả hơn đối với cuộc sống. Xuất phát từ nhu cầu thực tế, qua quá trình nghiên cứu em đƣa ra một giải pháp giám sát trạng thái và điều khiển thiết bị điện từ xa qua hệ thống mạng GSM, xây dựng cơ sở để đƣa ra những ứng dụng lớn và phức tạp hơn.

Một phần của tài liệu Giao tiếp với GSM (Trang 34)

Tải bản đầy đủ (PDF)

(78 trang)