Chương 1-Giới thiệu tổng quan mạng điện thoại . 9
1.1. Giới thiệu tổng quát vềtổng đài . 9
1.2. Giới thiệu tổng quát vềmáy điện thoại. 12
Chương 2 - Giới thiệu linh kiện. 18
2.1. Vi điều khiển AVR. 18
2.2 IC MT8888. 53
2.3 IC LM358 . 64
2.4 IC MAX232 . 67
Chương 3-Sơ đồthiết kếvà giải thuật. 69
3.1. Sơ đồthiết kế. 69
3.1.1 Sơ đồkhối . 69
3.1.2 Sơ đồnguyên lý. 69
3.2. Giải thuật. 76
3.2.1 Module PSTN-RS232. 76
3.2.2 Module trạm . 80
Chương 4-Kết luận và hướng phát triển đềtài. 83
4.1 Kết luận. 83
4.2 Hướng phát triển đềtài . 83
Tài liệu tham khảo. 84
102 trang |
Chia sẻ: lethao | Lượt xem: 1898 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Đề tài Giám sát và điều khiển thiết bị qua đường PSTN, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
AIN0 Ngõ vào ngắt
PD7 AIN1 Ngõ vào ngắt
2.1.3 Tổ chức bộ nhớ:
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à Application Flash Section nhưng trong các chip AVR mới chúng ta
có thêm phần Boot Flash setion. Application 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 application 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.
Vector ngắt của chip ATMEGA8 chỉ kéo dài đến địa chỉ 0x012, vì vậy chương
trình chính có thể được bắt đầu từ bất cứ vị trí nào sau đó. Bảng vector ngắt:
29
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
30
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.
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, như mô tả trong hình 1, 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.
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
clock.
• 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.
Để minh họa, hãy xét ví dụ thực hiện phép cộng 2 thanh ghi bằng instruction ADD
như sau:
31
ADD R1,R2
Bạn thấy trong dòng lệnh trên, 2 thanh ghi R1 và R2 được sử dụng trực tiếp
với tên của chúng, dòng lệnh trên khi được dịch sang opcode để download vào
chip sẽ có dạng: 0000110000010010 trong đó 00001=1 tức thanh ghi R1 và 00010
= 2 chỉ thanh ghi R2. Sau phép cộng, kết quả sẽ được lưu vào thanh ghi R1.
Tất cả các instruction sử dụng RF làm toán hạng đều có thể truy nhập tất cả
các RF một cách trực tiếp trong 1 chu kỳ xung clock, ngoại trừ SBCI, SUBI, CPI,
ANDI và LDI, các instruction này chỉ có thể truy nhập các thanh ghi từ R16 đến
R31.
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. Chúng ta sẽ khảo sát vấn đề con trỏ sau này.
Hình 3 mô tả các chức năng phụ của các thanh ghi.
32
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.
Xem lại ví dụ trong bài 1, trong đó tôi có đề cập về việc điều khiển các PORT của
AVR, mỗi PORT liên quan đến 3 thanh ghi DDRx, PORTx và PINx, tất cả 3
thanh ghi này đều nằm trong vùng nhớ I/O. Xa hơn, nếu muốn truy xuất các thiết
bị ngoại vi khác như Timer, chuyển đổi Analog/Digital, giao tiếp USART…đều
thực hiện thông qua việc điều khiển các thanh ghi trong vùng nhớ nà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 nhớ này thì địa chỉ của
chúng được tính từ 0x0020 đến 0x005F. Nhưng nếu truy xuất như các thanh ghi
I/O thì địa chỉ của chúng đựơc tính từ 0x0000 đến 0x003F.
Xét ví dụ instruction OUT dùng xuất giá trị ra các thanh ghi I/O, lệnh này sử
dụng địa chỉ kiểu thanh ghi, cấu trúc của lệnh như sau: OUT A, Rr, trong đó A là
địa chỉ của thanh ghi trong vùng nhớ I/O, Rr là thanh ghi RF, lệnh OUT xuất giá
trị từ thanh ghi Rr ra thanh ghi I/O có địa chỉ là A. Giả sử chúng ta muốn xuất giá
trị chứa trong R6 ra thanh ghi điều khiển hướng của PORTD, tức thanh ghi
DDRD, địa chỉ tính theo vùng I/O của thanh ghi DDRD là 0x0011, như thế câu
lệnh của chúng ta sẽ có dạng: OUT 0x0011, R6. Tuy nhiên trong 1 trường hợp
khác, nếu muốn truy xuất DDRD theo dạng SRAM, ví dụ lệnh STS hay LDS, thì
phải dùng địa chỉ tuyệt đối của thanh ghi này, tức giá trị 0x0031, khi đó lệnh OUT
33
ở trên được viết lại là STS 0x0031, R6.
Để thống nhất cách sử dụng từ ngữ, từ bây giờ chúng ta dùng khái niệm “địa
chỉ I/O” cho các thanh ghi trong vùng nhớ I/O để nói đến địa chỉ không tính phần
Register File, khái niệm “địa chỉ bộ nhớ” của thanh ghi là chỉ địa chỉ tuyệt đối
của chúng trong SRAM. Ví dụ thanh ghi DDRD có “địa chỉ I/O” là 0x0011 và
“địa chỉ bộ nhớ” của nó là 0x0031, “địa chỉ bộ nhớ” = “địa chỉ I/O” + 0x0020.
Vì các thanh ghi trong vùng I/O không được hiểu theo tên gọi như các Register
file, khi lập trình cho các thanh ghi này, người lập trình cần nhớ địa chỉ của từng
thanh ghi, đây là việc tương đối khó khăn. Tuy nhiên, trong hầu hết các phần mềm
lập trình cho AVR, địa chỉ của tất cả các thanh ghi trong vùng I/O đều được định
nghĩa trước trong 1 file Definition, bạn chỉ cần đính kèm file này vào chương trình
của bạn là có thể truy xuất các thanh ghi với tên gọi của chúng. Giả sử trong ví dụ
ở bài 1, để lập trình cho chip Atmega8 bằng AVRStudio, dòng thứ 2 chúng ta sử
dụng INCLUDE "M8DEF.INC" để load file định nghĩa cho chip ATMega8, file
M8DEF.INC. Vì vậy, trong sau này khi muốn sử dụng thanh ghi DDRD bạn chỉ
cần gọi tên của chúng, như: OUT DDRD,R6.
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. Như trong hình 1, phần bộ nhớ EEPROM được tách riêng và có địa
34
chỉ tính từ 0x0000.
Sơ đồ tổ chức bộ nhớ
2.1.4 Các Thanh Ghi
1. Thanh ghi 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, vì thế mà tôi dành phần này để giới
thiệu về thanh ghi này. 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:
35
• Bit 0 – C (Carry Flag: Cờ nhớ): là bit nhớ trong các phép đại số hoặc logic,
ví dụ thanh ghi R1 chứa giá trị 200, R2 chứa 70, chúng ta thực hiện phép cộng có
nhớ: ADC R1, R2, sau phép cộng, kết quả sẽ được lưu lại trong thanh ghi R1,
trong khi kết quả thực là 270 mà thanh ghi R1 lại chỉ có khả năng chứa tối đa giá
trị 255 (vì có 8 bit) nên trong trường hợp này, giá trị lưu lại trong R1 thực chất chỉ
là 14, đồng thời cờ C được set lên 1 (vì 270=100001110, trong đó 8 bit sau
00001110 =14 sẽ được lưu lại trong R1).
• 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 3 – V (Two’s complement Overflow Flag: Cờ tràn của bù 2): hoạt động
của cờ này có vẻ sẽ khó hiểu cho bạn vì nó liên quan đến kiến thức số nhị phân
(phần bù), chúng ta sẽ đề cập đến khi nào thấy cần thiết.
• 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). Tôi sẽ giải thích chức năng Bit T trong phần giới
36
thiệu về BLD và BST.
• Bit 7 – I (Global Interrupt Enable) : Cho phép ngắt toàn bộ): Bit này phải
được set lên 1 nếu trong chương trình có sử dụng ngắt. Sau khi set bit này, bạn
muốn kích hoạt loại ngắt nào cần set các bit ngắt riêng của ngắt đó. Hai instruction
dùng riêng để Set và Clear bit I là SEI và CLI.
Chú ý: tất cả các bit trong thanh ghi SREG đều có thể được xóa thông qua các
instruction không toán hạng CLx và set bởi SEx, trong đó x là tên của Bit.Ví dụ
CLT là xóa Bit T và SEI là set bit I.
Tôi chỉ giải thích ngắn gọn chức năng của các bit trong thanh ghi SREG, cụ thể
chức năng và cách sử dụng của từng bit chúng ta sẽ tìm hiểu trong các trường hợp
cụ thể sau này, người đọc có thể tự tìm hiểu thêm trong các tài liệu về
INSTRUCTION cho AVR.
Tôi cung cấp thêm 1 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.
2. Thanh ghi MCUCR:
MCUCR là một thanh ghi 8 bit nhưng đối với hoạt động ngắt ngoài, chúng ta chỉ
quan tâm đến 4 bit thấp của thanh ghi này (4 bit cao dùng cho Power manager và
Sleep Mode), 4 bit thấp là các bit Interrupt Sense Control (ISC), 2 bit ISC11,
ISC10 dùng cho INT1 và ISC01, ISC00 dùng cho INT0. Hãy nhìn vào bảng tóm
tắt bên dưới để biết chức năng của các bit trên, đây là bảng “chân trị” của 2 bit
ISC11, ISC10. Bảng chân trị cho các bit ISC01, ISC00 hoàn toàn tương tự.
37
Thật dễ dàng để hiểu chức năng của các bit Sense Control, ví dụ bạn muốn set
cho INT1 là ngắt cạnh xuống (Falling Edge) trong khi INT0 là ngắt cạnh lên
(Rising Edge), hãy đặt dòng lệnh MCUCR =0x0B (0x0B = 00001011 nhị phân)
trong chương trình của bạn.
3. Thanh ghi GICR:
Thanh ghi điều khiển ngắt thông thường – GICR (General Interrupt Control
Register) (trên các chip AVR cũ, như các chip AT90Sxxxx, thanh ghi này có tên
là thanh ghi mặt nạ ngắt thông thường GIMSK, bạn tham khảo thêm datasheet của
các chip này nếu cần sử dụng đến). GICR cũng là 1 thanh ghi 8 bit nhưng chỉ có 2
bit cao (bit 6 và bit 7) là được sử dụng cho điều khiển ngắt, cấu trúc thanh ghi như
bên dưới (trích datasheet).
Bit 7 – INT1 gọi là bit cho phép ngắt 1(Interrupt Enable), set bit này bằng 1
nghĩa bạn cho phép ngắt INT1 hoạt động, tương tự, bit INT0 điều khiển ngắt
38
INT0.
4. Thanh ghi GIFR:
Thanh ghi cờ ngắt thông thường – GIFR (General Interrupt Flag Register) có 2 bit
INTF1 và INTF0 là các bit trạng thái (hay bit cờ - Flag) của 2 ngắt INT1 và INT0,
nếu có 1 sự kiện ngắt phù hợp xảy ra trên chân INT1, bit INTF1 được tự động set
bằng 1 (tương tự cho trường hợp của INTF0), chúng ta có thể sử dụng các bit này
để nhận ra các ngắt, tuy nhiên điều này là không cần thiết nếu chúng ta cho phép
ngắt tự động, vì vậy thanh ghi này thường không được quan tâm khi lập trình ngắt
ngoài. Cấu trúc thanh ghi GIFR được trình bày trong hình ngay bên dưới.
5. Thanh ghi TCCR0:
• TCCR0 (Timer/Counter Control Register): là thanh ghi điều khiển hoạt
động của T/C0. Tuy là thanh ghi 8 bit nhưng thực chất chỉ có 3 bit có tác
dụng đó là CS00, CS01 và CS02.
Các bit CS00, CS01 và CS02 gọi là các chip chọn nguồn xung nhịp cho T/C0
(Clock Select). Chức năng các bit này được mô tả trong bảng 1.
Bảng 1: chức năng các bit CS0X
39
6. Thanh ghi TCNT0:
• TCNT0 (Timer/Counter Register): là 1 thanh ghi 8 bit chứa giá trị vận hành
của T/C0. Thanh ghi này cho phép bạn đọc và ghi giá trị một cách trực tiếp.
7. Thanh ghi TIMSK:
• TIMSK (Timer/Counter Interrupt Mask Register): là thanh ghi mặt nạ cho ngắt
của tất cả các T/C trong Atmega8, trong đó chỉ có bit TOIE0 tức bit số 0 (bit đầu
tiên) trong thanh ghi này là liên quan đến T/C0, bit này có tên là bit cho phép ngắt
khi có tràn ở T/C0. Tràn (Overflow) là hiện tượng xảy ra khi bộ giá trị trong thanh
ghi TCNT0 đã đạt đến MAX (255) và lại đếm thêm 1 lần nữa.
Bit 1, TOIE0=1, bit quy định ngắt tràn cho thanh T/C0.
Bit 2, TOIE1, bit quy định ngắt tràn cho thanh T/C1.
40
Bit 3, OCIE1B là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc so sánh
TCNT1 với OCR1B.
Bit 4, OCIE1A là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc so sánh
TCNT1 với OCR1A.
Bit 5, TICIE1 là bit cho phép ngắt trong trường hợp Input Capture được dùng.
Bit 6, TOIE2, bit quy định ngắt tràn cho thanh T/C2.
Bit 7, OCIE2 là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc so sánh
TCNT2 với OCR2.
8. Thanh ghi TIFR:
• TIFR (Timer/Counter Interrupt Flag Register): là thanh ghi cờ nhớ cho tất cả
các bộ T/C. Trong thanh ghi này bit số 0, TOV0 là cờ chỉ thị ngắt tràn của T/C0.
Khi có ngắt tràn xảy ra, bit này tự động được set lên 1.
9. Thanh ghi TCNT1:
• TCNT1H và TCNT1L (Timer/Counter Register): là 2 thanh ghi 8 bit tạo thành
thanh ghi 16 bits (TCNT1) chứa giá trị vận hành của T/C1. Cả 2 thanh ghi này cho
phép bạn đọc và ghi giá trị một cách trực tiếp. 2 thanh ghi được kết hợp như sau:
41
10. Thanh ghi TCCR1:
• TCCR1A và TCCR1B (Timer/Counter Control Register): là 2 thanh ghi điều
khiển hoạt động của T/C1. Tất cả các mode hoạt động của T/C1 đều được xác
định thông qua các bit trong 2 thanh ghi này. Tuy nhiên, đây không phải là 2 byte
cao và thấp của một thanh ghi mà là 2 thanh ghi hoàn toàn độc lập. Các bit trong 2
thanh ghi này bao gồm các bit chọn mode hay chọn dạng sóng (Waveform
Generating Mode – WGM), các bit quy định dạng ngõ ra (Compare Output Match
– COM), các bit chọn giá trị chia prescaler cho xung nhịp (Clock Select – CS)
…Cấu trúc của 2 thanh ghi được trình bày như bên dưới.
Nhìn chung để “thuộc” hết cách phối hợp các bit trong 2 thanh ghi TCCR1A
và TCCR1B là tương đối phức tạp vì T/C1 có rất nhiều mode hoạt động, chúng ta
sẽ khảo sát chúng trong phần các chế độ hoạt động của T/C1 bên dưới. Ở đây,
trong thanh ghi TCCR1B có 3 bit khá quen thuộc là CS10, CS11 và CS12. Đây là
các bit chọn xung nhịp cho T/C1 như truong T/C0. Bảng 2 sẽ tóm tắt các chế độ
42
xung nhịp trong T/C1.
Bảng 2: chức năng các bit CS12, CS11 và CS10.
Các mode hoạt động: có tất cả 5 chế độ hoạt động chính trên T/C1. Các chế độ
hoạt động cơ bản được quy định bởi 4 bit Waveform Generation Mode (WGM13,
WGM12, WGM11 WGM10) và một số bit phụ khác. 4 bit Waveform Generation
Mode lại được bố trí nằm trong 2 thanh ghi TCCR1A và TCCR1B (WGM13 là bit
4, WGM12 là bit 3 trong TCCR1B trong khi WGM11 là bit 1 và WGM10 là bit 0
trong thanh ghi TCCR1A) vì thế cần phối hợp 2 thanh ghi TCCR1 trong lúc điều
khiển T/C1. Các chế độ hoạt động của T/C1 được tóm tắt trong bảng sau 3:
Bảng 3: các bit WGM và các chế độ hoạt động của T/C1.
43
Chú ý các bit COM1A1, COM1A0 và COM1B1, COM1B0 là các bit chọn dạng
tín hiệu ra của PWM (Compare Output Mode bits). COM1A1, COM1A0 dùng cho
kênh A và COM1B1, COM1B0 dùng cho kênh B. Hãy đối chiếu bảng 4.
Bảng 4: mô tả các bit COM trong chế độ fast PWM.
44
11. Thanh ghi OCR1:
• OCR1A và OCR1B (Ouput Compare Register A và B): có một số khái niệm
mới mà chúng ta cần biết khi làm việc với T/C1, một trong số đó là Ouput
Compare (sorry, I don’t wanna translate it to Vietnamese). Trong lúc T/C hoạt
động, giá trị thanh ghi TCNT1 tăng, giá trị này được liên tục so sánh với các thanh
ghi OCR1A và OCR1B (so sánh độc lập với từng thanh ghi), việc so sánh này trên
AVR gọi là gọi là Ouput Compare. Khi giá trị so sánh bằng nhau thì 1 “Match”
xảy ra, khi đó một ngắt hoặc 1 sự thay đổi trên chân OC1A (hoặc/và chân OC1B)
xảy ra (đây là cách tạo PWM bởi T/C1). Tại sao lại có A và B? Đó là vì người
thiết kế AVR muốn mở rộng khả năng ứng dụng T/C1 cho bạn. A và B đại diện
cho 2 kênh (channel) và B. Cũng vì điều này mà chúng ta có thể tạo 2 kênh PWM
bằng T/C1. Tóm lại, cơ bản 2 thanh ghi này chứa các giá trị để so sánh, chức năng
và các chế độ hoạt động cụ thể của chúng sẽ được khảo sát trong các phần sau.
45
12. Thanh ghi ICR1:
• ICR1 (InputCapture Register 1): khái niệm mới thứ 2 của T/C1 là Input
Capture. Khi có 1 sự kiện trên chân ICP1 (chân 14 trên Atmega8), thanh ghi
ICR1sẽ “capture” giá trị của thanh ghi đếm TCNT1. Một ngắt có thể xảy ra trong
trường hợp này, vì thế Input Capture có thể được dùng để cập nhật giá trị “TOP”
của T/C1.
13. Thanh ghi UDR:
• UDR: 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 USART. Thực chất thanh ghi này có thể coi như 2 thanh ghi TXB
(Transmit data Buffer) và RXB (Reveive data Buffer) có chung địa chỉ. Đọc UDR
thu được giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR 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 UDR sẽ không được sử
dụng
46
14. Thanh ghi UCSRA:
• UCSRA (USART Control and Status Register A): là 1 trong 3 thanh ghi điều
khiển hoạt động của module USART.
Thanh ghi UCSRA 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:
* UDRE (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 UDRE có
bằng 1 hay không, sau khi chắc chắn rằng UDRE=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).
15. Thanh ghi UCSRB:
• UCSRB (USART Control and Status Register B): đây là thanh ghi quan trọng
điều khiển USART. Vì thế chúng ta sẽ khảo sát chi tiết từng bit của thanh ghi này.
47
* 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) 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 UCSRC
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 UCSRC.
* RXB8 (Receive Data Bit 8) gọi là bit dữ liệu 8. Bạn nhớ lại rằng USART trong
AVR 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
48
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.
16. Thanh ghi UCSRC:
• UCSRC (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.
Các bit còn lại trong thanh ghi UCSRC đượ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 (xem thêm bảng 1).
Bảng 1: chọn kiểm tra parity.
49
* 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 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 2: độ dài dữ liệu truyền.
* 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..
17. Thanh ghi UBRR:
• UBRRL và UBRRH (USART Baud Rate Register): 2 thanh ghi thấp và cao
quy định tốc độ baud.
50
Nhắc lại là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC, 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
USART dùng để tính tốc độ baud. Bảng 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: tính tốc độ baud.
Trong các công thức trong bảng 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…). Để tiện cho bạn theo dõi, tôi đính kèm bảng ví
51
dụ cách đặt giá trị cho UBRR theo tốc độ baud mẫu.
Bảng 4: một số tốc độ baud mẫu.
52
53
54
18. Thanh ghi ADMUX:
ADMUX (ADC Multiplexer Selection Register): là 1 thanh ghi 8 bit điều khiển
việc chọn điện áp tham chiếu, kênh và chế độ hoạt động của ADC. Chức năng của
từng bit trên thanh ghi này sẽ được trình bày cụ thể như sau:
55
• Bit 7:6- REFS1:0 (Reference Selection Bits): là các bit chọn điện áp tham
chiếu cho ADC, 1 trong 3 nguồn điện áp tham chiếu có thể được chọn là: điện áp
ngoài từ chân VREF, điện áp tham chiếu nội 2.56V hoặc điện áp AVCC. Bảng 2
tóm tắt giá trị các bit và điện áp tham chiếu tương ứng.
• Bit 5-ADLAR (ADC Left Adjust Result): là bit cho phép hiệu chỉnh trái kết
quả chuyển đổi. Sở dĩ có bit này là vì ADC trên AVR có độ phân giải 10 bit, nghĩa
là kết quả thu được sau chuyển đổi là 1 số có độ dài 10 bit (tối đa 1023), AVR bố
trí 2 thanh ghi data 8 bit để chứa giá trị sau chuyển đổi. Như thế giá trị chuyển đổi
sẽ không lắp đầy 2 thanh ghi data, trong một số trường hợp người dùng muốn 10
bit kết quả nằm lệch về phía trái trong khi cũng có trường hợp người dùng muốn
kết quả nằm về phía phải. Bit ADLAR sẽ quy
Các file đính kèm theo tài liệu này:
- Giám sát và điều khiển thiết bị qua đường PSTN.pdf