KIẾN THỨC PHẦN CỨNG

Một phần của tài liệu Mô phỏng hệ thống quản lý đồng hồ nước của khu chung cư trên mạng internet (Trang 54 - 68)

CHƯƠNG IV : KIẾN THỨC PHẦN CỨNG

4. 1 : Bộ biến đổi ADC ( Analog Digital Converter ) 4. 1. 1 : Tổng Quan

Trong các ứng dụng đo lường và điều khiển bằng vi điều khiển bộ chuyển đổi tương tự - số (ADC) là một thành phần rất quan trọng. Dữ liệu trong thế giới của chúng ta là các dữ liệu tương tự (analog). Trong khi đó, rõ ràng vi điều khiển là một thiết bị số (digital), các giá trị mà một vi điều khiển có thể thao tác là các con số rời rạc vì thực chất chúng được tạo thành từ sự kết hợp của hai mức 0 và 1. Quá trình “số hóa” này thường được thực hiện bởi một thiết bị gọi là “bộ chuyển đổi tương tự - số hay đơn giản là ADC (Analog to Digital Converter).

Có rất nhiều phương pháp chuyển đổi ADC. Phương pháp chuyển đổi được sử dụng ở đây là phương pháp chuyển đổi trực tiếp (direct converting) hoặc flash ADC. Các bộ chuyển đổi ADC theo phương pháp này được cấu thành từ một dãy các bộ so sánh, các bộ so sánh được mắc song song và được kết nối trực tiếp với tín hiệu analog cần chuyển đổi. Một điện áp tham chiếu (reference) và một mạch chia áp được sử dụng để tạo ra các mức điện áp so sánh khác nhau cho mỗi bộ so sánh. Hình 3. 1 mô tả một bộ chuyển đổi flash ADC có 4 bộ so sánh, Vin là tín hiệu analog cần chuyển đổi và giá trị sau chuyển đổi là các con số tạo thành từ sự kết hợp các mức nhị phân trên các chân Vo.

Hình 4. 1 : Mạch flash ADC với 4 bộ so sánh.

Bảng 4. 1 : Giá trị số ngõ ra sau khi giải mã

CHƯƠNG IV: KIẾN THỨC PHẦN CỨNG

4. 1. 2 : Độ phân giải (resolution)

Như trong ví dụ trên, nếu mạch điện có 4 bộ so sánh, ngõ ra digital sẽ có 5 mức giá trị. Tương tự nếu mạch điện có 7 bộ so sánh thì sẽ có 8 mức giá trị có thể ở ngõ ra digital, khoảng cách giữa các mức tín hiệu trong trường hợp 8 mức sẽ nhỏ hơn trường hợp 4 mức. Nói cách khác, mạch chuyển đổi với 7 bộ so sánh có giá trị digital ngõ ra “mịn” hơn khi chỉ có 4 bộ, độ “mịn”

càng cao tức độ phân giải (resolution) càng lớn. Khái niệm độ phân giải được dùng để chỉ số bit cần thiết để chứa hết các mức giá trị digital ngõ ra. Trong trường hợp có 8 mức giá trị ngõ ra, chúng ta cần 3 bit nhị phân để mã hóa hết các giá trị này, vì thế mạch chuyển đổi ADC với 7 bộ so sánh sẽ có độ phân giải là 3 bit. Một cách tổng quát, nếu một mạch chuyển đổi ADC có độ phân giải n bit thì sẽ có 2n mức giá trị có thể có ở ngõ ra digital. Để tạo ra một mạch chuyển đổi flash ADC có độ phân giải n bit, chúng ta cần đến 2n - 1 bộ so sánh, giá trị này rất lớn khi thiết kế bộ chuyển đổi ADC có độ phân giải cao, vì thế các bộ chuyển đổi flash ADC thường có độ phân giải ít hơn 8 bit.

Độ phân giải liên quan mật thiết đến chất lượng chuyển đổi ADC, việc lựa chọn độ phân giải phải phù hợp với độ chính xác yêu cầu và khả năng xử lý của bô điều khiển. Trong 2 mô tả một ví dụ “số hóa” một hàm sin analog thành dạng digital.

Hình 4. 2 : Analog và digital của hàm sin.

4. 1. 3 : Điện áp tham chiếu (reference voltage)

Cùng một bộ chuyển đổi ADC nhưng có người muốn dùng cho các mức điện áp khác nhau, ví dụ người A muốn chuyển đổi điện áp trong khoảng 0 - 1 V trong khi người B muốn dùng cho điện áp từ 0V đến 5V. Rõ ràng nếu hai người này dùng 2 bộ chuyển đổi ADC đều có khả năng chuyển đổi đến điện áp 5V thì người A đang “phí phạm” tính chính xác của thiết bị. Vấn đề sẽ được giải quyết bằng một đại lượng gọi là điện áp tham chiếu - Vref (reference voltage). Điện áp tham chiếu thường là giá trị điện áp lớn nhất mà bộ ADC có thể chuyển đổi. Trong các bộ ADC, Vref thường là thông số được đặt bởi người dùng, nó là điện áp lớn nhất mà thiết bị có thể chuyển đổi. Ví dụ, một bộ ADC 10 bit ( độ phân giải ) có Vref = 3V, nếu điện áp ở ngõ vào là 1V thì giá trị số thu được sau khi chuyển đổi sẽ là: 1023 x ( 1/3 ) = 314. Trong đó 1023 là giá trị lớn nhất mà một bộ ADC 10 bit có thể tạo ra

(1023 = 210- 1). Vì điện áp tham chiếu ảnh hưởng đến độ chính xác của quá trình chuyển đổi, chúng ta cần tính toán để chọn 1 điện áp tham chiếu phù hợp, không được nhỏ hơn giá trị lớn nhất của input nhưng cũng đừng quá lớn.

4. 2 : AVR

4. 2. 1 : Tổ chức của AVR

AVR có cấu trúc Harvard, trong đó đường truyền cho bộ nhớ dữ liệu (data memory bus) và đường truyền cho bộ nhớ chương trình (program memory bus) được tách riêng. và Data memory bus chỉ có 8 bit được kết nối với hầu hết các thiết bị ngoại vi, với register file. Trong khi đó program memory bus có độ rộng 16 bits và chỉ phục vụ cho instruction registers.

CHƯƠNG IV: KIẾN THỨC PHẦN CỨNG

4. 2. 2 : Bộ nhớ chương trình (Program memory)

Là bộ nhớ Flash lập trình được, trong các chip AVR cũ (như AT90S1200 hay AT90S2313…) bộ nhớ chương trình chỉ gồm 1 phần là Chương trình Flash Section nhưng trong các chip AVR mới chúng ta có thêm phần Boot Flash setion. Boot section sẽ được khảo sát trong các phần sau, được hiểu là Chương trình section. Thực chất, chương trình section bao gồm 2 phần: phần chứa các instruction ( mã lệnh cho hoạt động của chip ) và phần chứa các vector ngắt ( interrupt vectors ). Các vector ngắt nằm ở phần đầu của chương trình section ( từ địa chỉ 0x0000 ) và dài đến bao nhiêu tùy thuộc vào loại chip. Phần chứa instruction nằm liền sau đó, chương trình viết cho chip phải được load vào phần này.

Vì chức năng chính của bộ nhớ chương trình là chứa instruction, chúng ta không có nhiều cơ hội tác động lên bộ nhớ này khi lập trình cho chip, vì thế đối với người lập trình AVR, bộ nhớ này “không quá quan trọng”. Tất cả các thanh ghi quan trọng cần khảo sát nằm trong bộ nhớ dữ liệu của chip.

Hình 4. 3 : Tổ chức bộ nhớ của AVR.

4. 2. 3 : Bộ nhớ dữ liệu (data memory)

Đây là phần chứa các thanh ghi quan trọng nhất của chip, việc lập trình cho chip phần lớn là truy cập bộ nhớ này. Bộ nhớ dữ liệu trên các chip AVR có độ lớn khác nhau tùy theo mỗi chip, tuy nhiên về cơ bản phần bộ nhớ này được chia thành 5 phần:

Phần 1: là phần đầu tiên trong bộ nhớ dữ liệu, phần này bao gồm 32 thanh ghi có tên gọi là register file (RF), hay General Purpose Rgegister – GPR, hoặc đơn giản là các Thanh ghi. Tất cả các thanh ghi này đều là các thanh ghi 8 bits.

CHƯƠNG IV: KIẾN THỨC PHẦN CỨNG

Hình 4. 4. Thanh ghi 8 bits.

Tất cả các chip trong họ AVR đều bao gồm 32 thanh ghi Register File có địa chỉ tuyệt đối từ 0x0000 đến 0x001F. Mỗi thanh ghi có thể chứa giá trị dương từ 0 đến 255 hoặc các giá trị có dấu từ - 128 đến 127 hoặc mã ASCII của một ký tự nào đó…Các thanh ghi này được đặt tên theo thứ tự là R0 đến R31. Chúng được chia thành 2 phần, phần 1 bao gồm các thanh ghi từ R0 đến R15 và phần 2 là các thanh ghi R16 đến R31. Các thanh ghi này có các đặc điểm sau:

- Được truy cập trực tiếp trong các instruction.

- Các toán tử, phép toán thực hiện trên các thanh ghi này chỉ cần 1 chu kỳ xung độ Ck.

- Register File được kết nối trực tiếp với bộ xử lí trung tâm – CPU của chip.

- Chúng là nguồn chứa các số hạng trong các phép toán và cũng là đích chứa kết quả trả lại của phép toán.

Thanh ghi R0 là thanh ghi duy nhất được sử dụng trong instruction LPM (Load Program Memory). Các thanh ghi R26, R27, R28, R29, R30 và R31 ngoài chức năng thông thường còn được sử dụng như các con trỏ (Pointer register) trong một số instruction truy xuất gián tiếp.

Hình 3. 5 mô tả các chức năng phụ của các thanh ghi.

Hình 4. 5 : Register file.

Tóm lại 32 RF của AVR được xem là 1 phần của CPU, vì thế chúng được CPU sử dụng trực tiếp và nhanh chóng, để gọi các thanh ghi này, chúng ta không cần gọi địa chỉ mà chỉ cần gọi trực tiếp tên của chúng. RF thường được sử dụng như các toán hạng (operand) của các phép toán trong lúc lập trình.

Phần 2: là phần nằm ngay sau register file, phần này bao gồm 64 thanh ghi được gọi là 64 thanh ghi nhập/xuất ( 64 I/O register ) hay còn gọi là vùng nhớ I/O ( I/O Memory ). Vùng nhớ I/O là cửa ngõ giao tiếp giữa CPU và thiết bị ngoại vi. Tất cả các thanh ghi điều khiển, trạng thái…của thiết bị ngoại vi đều nằm ở đây. Vùng nhớ I/O có thể được truy cập như SRAM hay như các thanh ghi I/O. Nếu sử dụng instruction truy xuất SRAM để truy xuất vùng

CHƯƠNG IV: KIẾN THỨC PHẦN CỨNG

truy xuất như các thanh ghi I/O thì địa chỉ của chúng đựơc tính từ 0x0000 đến 0x003F.

Phần 3: RAM tĩnh, nội ( internal SRAM ), là vùng không gian cho chứa các biến ( tạm thời hoặc toàn cục ) trong lúc thực thi chương trình, vùng này tương tự các thanh RAM trong máy tính nhưng có dung lượng khá nhỏ ( khoảng vài Kb, tùy thuộc vào loại chip ).

Phần 4: RAM ngoại ( external SRAM ), các chip AVR cho phép người sử dụng gắn thêm các bộ nhớ ngoài để chứa biến, vùng này thực chất chỉ tồn tại khi nào người sử dụng gắn thêm bộ nhớ ngoài vào chip.

Phần 5: EEPROM ( Electrically Ereasable Programmable ROM ) là một phần quan trọng của các chip AVR mới, vì là ROM nên bộ nhớ này không bị xóa ngay cả khi không cung cấp nguồn nuôi cho chip, rất thích hợp cho các ứng dụng lưu trữ dữ liệu.

4. 2. 4 : AVR hoạt động như thế nào?

Hình 3. 6 biểu diễn cấu tạo trong bên trong của 1 AVR. Bạn thấy rằng 32 thanh ghi trong Register File được kết nối trực tiếp với Arithmetic Logic Unit - ALU ( ALU cũng được xem là CPU của AVR ) bằng 2 line, vì thế ALU có thể truy xuất trực tiếp cùng lúc 2 thanh ghi RF chỉ trong 1 chu kỳ xung độ Ck ( vùng được khoanh tròn màu đỏ trong hình 3. 6 ).

Hình 4. 6 : Cấu trúc bên trong AVR.

Các instruction được chứa trong bộ nhớ chương trình Flash memory dưới dạng các thanh ghi 16 bit. Bộ nhớ chương trình được truy cập trong mỗi chu kỳ xung độ Ck và 1 instruction chứa trong program memory sẽ được load vào trong instruction register, instruction register tác động và lựa chọn register file cũng như RAM cho ALU thực thi. Trong lúc thực thi chương trình, địa chỉ của dòng lệnh đang thực thi được quyết định bởi một bộ đếm chương trình – PC (Program counter). Đó chính là cách thức hoạt động của AVR.

CHƯƠNG IV: KIẾN THỨC PHẦN CỨNG

4. 2. 5 : Stack

Stack được hiểu như là 1 “tháp” dữ liệu, dữ liệu được chứa vào stack ở đỉnh “tháp” và dữ liệu cũng được lấy ra từ đỉnh. Kiểu truy cập dữ liệu của stack gọi là LIFO (Last In First Out – vào sau ra trước). Hình 3. 7 thể hiện cách truy cập dữ liệu của stack.

Hình 4. 7 : Stack.

Khái niệm và cách thức hoạt động của stack có thể được áp dụng cho AVR, bằng cách khai báo một vùng nhớ trong SRAM là stack ta có thể sử dụng vùng nhớ này như một stack thực thụ.

Để khai báo một vùng SRAM làm stack chúng ta cần xác lập địa chỉ đầu của stack bằng cách xác lập con trỏ stack- SP ( Stack Pointer ). SP là 1 con trỏ 16 bit bao gồm 2 thanh ghi 8 bit SPL và SPH ( chữ L là LOW chỉ thanh ghi mang giá trị byte thấp của SP, và H = HIGH ), SPL và SPH nằm trong vùng nhớ I/O. Giá trị gán cho thanh ghi SP sẽ là địa chỉ khởi động của stack.

Có thể giải thích như sau: stack trong AVR hoạt động từ trên xuống, sau khi dữ liệu được đẩy vào stack, SP sẽ giảm giá trị vì thế khởi động SP ở vị trí cuối cùng của SRAM sẽ tránh được việc mất dữ liệu do ghi đè. Bạn có thể khởi động stack với 1 địa chỉ khác, tuy nhiên vì lý do an toàn, nên khởi động

Ví dụ cho chip ATMega8, RAMEND=0x045F, sau khi khởi động, con trỏ SP trỏ đến vị trí 0x045F trong SRAM, nếu ta viết các câu lệnh sau:

LDI R16, 1 PUSH R16 LDI R16, 5 PUSH R16 LDI R16, 8 PUSH R16

Khi đó nội dung của stack sẽ như trong hình 3. 8.

Hình 4. 8 : Nội dung stack trong ví dụ.

Sau mỗi lần PUSH dữ liệu, SP sẽ giảm 1 đơn vị và trỏ vào vị trí tiếp theo.

Bây giờ nếu ta dùng POP để lấy dữ liệu từ stack, POP R2, thì R2 sẽ mang giá trị của ngăn nhớ 0x045D, tức R2=8. Trước khi instruction POP được thực hiện, con trỏ SP được tăng lên 1 đơn vị, sau đó dữ liệu sẽ được lấy ra từ vị trí mà SP trỏ đến trong stack.

Stack trong AVR không phải là “vô đáy”, nghĩa là chúng ta chỉ có thể PUSH dữ liệu vào stack ở 1 độ sâu nhất định nào đấy ( phụ thuộc vào chip ).

CHƯƠNG IV: KIẾN THỨC PHẦN CỨNG

biến thông thường. Ứng dụng phổ biến nhất của stack là sử dụng trong các chương trình con ( Subroutine ), khi chúng ta cần “nhảy” từ một vị trí trong chương trình chính đến 1 chương trình con, sau khi thực hiện chương trình con lại muốn quay về vị trí ban đầu trong chương trình chính thì Stack là phương cách tối ưu dùng để chứa bộ đếm chương trình trong trường hợp này.

Tóm lại cần khởi động stack ở đầu chương trình và không nên sử dụng stack một cách tùy thích nếu chưa thật cần thiết.

4. 2. 6 : Thanh ghi trạng thái - SREG ( STATUS REGISTRY )

Nằm trong vùng nhớ I/O, thanh ghi SREG có địa chỉ I/O là 0x003F và địa chỉ bộ nhớ là 0x005F ( thường đây là vị trí cuối cùng của vùng nhớ I/O ) là một trong số các thanh ghi quan trọng nhất của AVR. Thanh ghi SREG chứa 8 bit cờ ( flag ) chỉ trạng thái của bộ xử lí, tất cả các bit này đều bị xóa sau khi reset, các bit này cũng có thể được đọc và ghi bởi chương trình. Chức năng của từng bit được mô tả như sau:

Hình 4. 9 : Thanh ghi trạng thái.

- Bit 0 – C ( Carry Flag: Cờ nhớ ) : là bit nhớ trong các phép đại số hoặc logic

- Bit 1 – Z ( Zero Flag: Cờ 0 ) : cờ này được set nếu kết quả phép toán đại số hay phép Logic bằng 0.

- Bit 2 – N ( Negative Flag: Cờ âm ) : cờ này được set nếu kết quả phép toán đại số hay phép Logic là số âm.

- Bit 4 – S ( Sign Bit: Bit dấu ) : Bit S là kết quả phép XOR giữa 1 cờ N và V, S=N xor V.

- Bit 5 – H ( Half Carry Flag: Cờ nhờ nữa ) : cờ H là cờ nhớ trong 1 vài phép toán đại số và phép Logic, cờ này hiệu quả đối với các phép toán với số BCD.

- Bit 6 – T ( Bit Copy Storage ) : được sử dụng trong 2 Instruction BLD ( Bit LoaD ) và BST ( Bit Storage )

- Bit 7 – I ( Global Interrupt Enable ) : Cho phép ngắt toàn bộ

Bảng tóm tắt sự ảnh hưởng của các phép toán đại số, logic lên các Bit trong thanh ghi SREG.

Bảng 4. 2 : Ảnh hưởng của các phép toán lên SREG

Một phần của tài liệu Mô phỏng hệ thống quản lý đồng hồ nước của khu chung cư trên mạng internet (Trang 54 - 68)

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

(74 trang)
w