Tải bản đầy đủ (.docx) (15 trang)

Thanh ghi điều khiển và trạng thái bộ so sánh tương tự - ACSR pot

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 (268.98 KB, 15 trang )

12. Khối so sánh tương tự(ANALOG)
Khối so sánh tương tự là một OP AMP so sánh có ngõ vào dương AIN0 (PB2) và ngõ vào âm
AIN1 (PB3). Khi điện áp AIN0 lớn hơn AIN1 ngỏ ra bộ so sánh sẽ bằng 1. Ngõ ra của bộ so sánh có thể
sử dụng làm tác động Capture cho Timer/Counter 1. Ngoài ra bộ so sánh còn có chứ năng yêu cầu ngắt
riêng, tác động so sánh có thể bằng cạnh lên, cạnh xuống hoặc khi đổi trạng thái. Sơ đồ khối của bộ so
sánh mô trên hình 1.25.
Thanh ghi điều khiển và trạng thái bộ so sánh tương tự - ACSR
• Bit 7 - ACD: Analog Comparator Disable
Khi ACD = 1 nguồn của bộ so sánh bit ngắt, bit này có thể xoá bất cứ thời điểm nào để tắt bộ so
sánh tương tự. Khi thay đổi ACD cần cấm ngắt so sánh tương tự bằng cách xoá bit ACIE trong thanh ghi
ACSR, nếu không muốn kích hoạt chương trình ngắt.
• Bit 6 - Res: Reserved bit
Bit này không sử dụng luôn có giá trị bằng 0.
• Bit 5 - ACO: Analog Comparator Output
ACO nối trực tiếp tơớ ngõ ra của bộ so sánh tương tự.
• Bit 4 - ACI: Analog Comparator Interrupt Flag
ACI = 1 khi ngõ ra bộ so sánh tác động trong chế độ ngắt được định nghĩa bằng các bit ACI1 và
ACI0. Chương trình ngắt so sánh tương tự sẽ được gọi khi ACIE = 1 và bit I trong SREG = 1. Bit ACI tự
động xoá bằng phần cứng khi ngắt được thực hiện. Ngoài ra ACI cũng có thể xoá bằng cách ghi vào nó
logic 0.
• Bit 3 - ACIE: Analog Comparator Interrupt Enable
Khi ACIE = 1 và I = 1 ngắt so sánh tương tư sẽ được cho phép.
• Bit 2 - ACIC: Analog Comparator Input Capture Enable
ACISC = 1 sẽ cho phép ngõ ra bộ so sánh tương tự tác động capture cho Timer/Counter1. Để cho
phép ngắt ngõ vào Capture Timer/Counter1 cấn phải lập bit TICIE1 trong thanh ghi TIMSK.
• Bits 1,0 - ACIS1, ACIS0: Analog Comparator Interrupt Mode Select
Các bit này định nghĩa các tác động ngắt khác nhau như trong bảng sau:
ACIS1 ACIS0 Tác động ngắt
00 Tác động khi đổi trạng thái ngõ ra bộ so sánh
01 Không sử dụng
10 Tác động khi ngõ ra có cạnh lên


11 Tác động khi ngõ ra có cạnh xuống
Chú ý: Khi thay đổi giá trị các bit ACIS1/ACIS0, cần phải cấm ngắt bằng cách xoá bit cho phép ngắt
trong thanh ghi ACSR, nếu không ngắt sẽ xảy ra khi các bit thay đổi giá trị. Khi sử dụng các lệnh SBI
hoặc CBI với các bit khác trong thanh ghi ACSR cũng có thể ghi giá trị 1 vào thanh ghi ACI, nên cần phải
kiểm tra lại, nếu nó bằng 1 cần xoá nó đi.
13. Bộ biến đổi tương tự sang số (ADC).
Bộ ADC của MCU AT90S8535 có các đặc tính chính như sau:
• Độ phân giải 10-bit.
• Độ chính xác ±2 LSB.
• Tích phân không tuyến tính 0.5 LSB.
• Thời gian biến đổi 65 - 260 μs.
• Có 8 ngõ vào Multiplexed.
• Dải ngõ vào Rail-to-Rail.
• Có các chế độ biến đổi Free Run hoặc Single.
• Có ngắt hoàn thành biến đổi.
• Có chế độ ngủ chống nhiễu.
ADC của AT90S8535 là loại xấp xỉ liên tiếp 10 bit, với 8 ngõ vào chọn bằng phần mềm mỗi ngõ sẽ tương
ứng với 1 cổng của PORT A. Ngõ vào ADC có bộ khuếch đại lấy và giữ mẫu đảm bảo cho điện áp ngõ
vào luôn bằng hằng số trong suốt quá trình biến đổi. Sơ đồ khối của bộ ADC được mô tả trên hình 1.26.
ADC có hai nguồn cung cấp riêng, AVCC và AGND. Chân AGND cần nối GND còn AVCC không
nên sai khác qua 0.3V so với VCC. Ngoài ra cần phải cung cấp nguồn chuẩn tới chân AREF, điện áp này
cần nằm trong khoảng AGND – AVCC.
Hoạt động.
ADC có thể hoạt động ở một trong hai chế độ Single và free run. Trong chế độ single người sử
dụng sẽ khởi động các chu kỳ biến đổi. Trong chế độ Free Run, ADC sẽ tự động lầy các mẫu biến đổi
theo các thời hằng cố định sau đó cập nhật thông tín vào Thanh ghi dữ liệu của nó. Bit ADFR trong
ADCSR sẽ chuyển đổi hoạt động của ADC giữa hai chế độ này.
Để cho phép khối ADC hoạt động cần ghi 1 tới bit ADEN trong ADCSR. Chu kỳ biến đổi đầu tiên
sẽ bắt đầu ngay sau khi ADEN = 1, tuy nhiên thời gian thực hiện sẽ dài hơn thông thường 12 chu kỳ clock
do quá trình khởi động ADC.

Một chu kỳ biến đổi sẽ bắt đầu bằng cách ghi logic 1 tới bit khời3 động quá trình biến đổi
ADSC,bit nay sẽ giữ nguyên mức cao trong suốt chu kỳ biến đổi, và tự động được xoá bằng phần cứng
khi quá trình biến đổi kết thúc. Nếu một ngõ vào khác được chọn trong quá trình biến đổi, ADC sẽ tiếp
tục thực hiện xong trước khi chuyển qua biến đổi giá trị trên kênh mới.
10 bit kết quả biến đổi do ADC tạo ra sẽ được ghi vào các thanh ghi ADCH và ADCL. Cần thực
hiện một cơ chế logic bảo vệ dữ liệu sẽ đảm bảo nội dung các thanh ghi không bị biến đổi trong khi đọc,
cơ chế đó như sau:
Cần phải đọc ADCL trước, mỗi khi đọc ADCL các thanh ghi dữ liệu sẽ được khoá lại, như vậy nếu
quá trình biến đổi kết thúc trước khi đọc ADCH thì không có thanh ghi dữ liệu nào bị thay đổi và kếtquả
biến đổi sẽ không bị mất. Sau khi đọc ADCH, cả ADCL và ADCH sẽ được cho phép ghi trở lại.
ADC cũng có một ngắt riêng, bit ADIF sẽ được lập sau khi quá trình biến đổi hoàn thành, khi truy
cập các thanh ghi dữ liệu không đúng, yêu cầu ngắt vẫn được duy trì ngay cả khi dữ liệu bị mất.
Bộ tiền chia clock của ADC.
ADC sử dụng một bộ tiền chia clock có chức năng chia clock hệ thống để cung cấp cho hoạt động
biến đổi của nó. Tần số clock của ADC trong khoảng từ 50 – 200 kHz. Khi sử dụng tần số càng cao, độ
chính xác sẽ càng giảm.
Các bit ADPS0 - ADPS2 trong ADCSR được sử dụng để tạo ra tần số clock thích hợp cho ADC từ
bất các thạch anh có tần số trên 100 kHz. Bộ tiền chia sẽ hoạt động ngay sau khi ADEN = 1,và nó sẽ reset
khi ADEN = 0.
Khi lập ADSC = 1 quá trình biến đổi sẽ bắt đầu tại cạnh lên tiếp theo của chu kỳ clock ADC. Quá
trình lấy mẫu và giữ sẽ chiếm khoảng 1.5 clock ADC sau khi quá trình biến đổi bắt đầu.Kết quả sẽ được
ghi vào các thanh ghi dữ liệu sau 13 chu kỳ clock. Trong chế độ Single ADC cần chờ thêm ít nhất một
chu kỳ clock trước khi thực hiện chu kỳ biến đổi tiếp theo (hình 1.28). Nếu ADSC = 1, ADC sẽ lập tức
thực hiện chu kỳ biến đổi mới. Trong chế độ Free Run với tần số clock cao nhất 200 kHz sẽ cho thời gian
biến đổi thấp nhất là 65ms tương đương với 15.4 kSPS. Thời gian biến đổi ở các giai đoạn của các chế độ
khác nhau cho trong bảng sau:
Chế độ Số chu kỳ
lấy mẫu
Số chu kỳ để dữ
liệu sẵn sàng

Tổng thời gian
biến đổi (chu kỳ)
Tổng thời gian
biến đổi (µs)
Chu kỳ đầu tiên trong chế
độ Free Run
14 25 25 125 – 500
Chu kỳ đầu tiên trong chế
độ Single
14 25 26 130 – 520
Chu kỳ thông thường trong
chế độ Free Run
2 13 13 65 – 260
Chu kỳ thông thường trong
chế độ Single
2 13 14 70 - 280
Chức năng chống nhiễu ADC.
Chức năng chống nhiễu của ADCcho phép quá trình biến đổi thực hiện trong chế độ Idle với chức
năng giảm thiểu nhiễu bao gồm cả nhiễu từ CPU. Để thực hiện chức năng này cần thực hiện các bước sau:
1. ADC đã được chọn và không đang trong quá trình biến đổi. Chọn chế độ Single và cho pheé ngắt
ADC.
ADEN = 1
ADSC = 0
ADFR = 0
ADIE = 1
2. Chuyển qua chế độ idle, ADC sẽ bắt đầu biến đổi khi CPU ngưng hoạt động.
3. Nếu không có ngắt nào xảy ra trước khi quá trình biến đổi ADC hoàn thành, ngắt ADC sẽ đánh
thức MCU và thực hiện chương trình ngắt phục vụ việc xử lý dữ liệu biến đổi.
Thanh ghi chon ngõ vào ADC - ADMUX
• Bits 7 3 - Res: Reserved Bits

Các bit này không sử dụng và luôn có giá trị bằng 0.
• Bits 2 0 - MUX2 MUX0: Analog Channel Select Bits 2-0
Giá trị các bit này sẽ chọn các ngõ vào tương ứng từ 0 -7 của ADC.
ADC Control and Status Register - ADCSR
• Bit 7 - ADEN: ADC Enable
ADEN = 1 cho phép ADC hoạt động. Khi ADEN = 0 ADC bit cấm, nếu cấm ADC khi đang trong
chu kỳ biến đổi, chu kỳ đó sẽ lập tức kết thúc.
• Bit 6 - ADSC: ADC Start Conversion
Trong chế độ Single ADSC= 1 sẽ khởi động quá trình biến đổi. Trong chế độ Free Run ADSC = 1
sẽ khởi động chu kỳ biến đổi đầu tiên. Lần đầu tiên ghi ADSC =1 sau khi ADEN = 1 (hoặc đồng thời với
ADEN = 1), ADC sẽ được khởi động. ADSC = 1 trong suốt quá trình biến đổi và sẽ bằng 0 khi quá trình
biến đổi kết thúc trước khi kết quả biến đổi ghi tới các thanh ghi dữ liệu của nó, điều này cho phép bắt đầu
một chu kỳ biến đổi mới trước khi chu kỳ biến đổi hiện hành hoàn tất.
• Bit 5 - ADFR: ADC Free Run Select
Khi ghi ADFR = 1 ADC sẽ hoạt động trong chế độ Free Run. Trong chế độ này ADC sẽ lấy mẫ
biến đổi và cập nhật giá trị cho các thanh ghi dữ liệu một cách liên tục.
• Bit 4 -ADIF: ADC Interrupt Flag
ADIF = 1 khi đang thực hiện chương trình ngắt ADC, chương trình ngắt sẽ thực hiện khi kết quả
biến đổi được chuyển tới các thanh ghi dữ liệu và trước đó ADIE = 1, I = 1. ADIF sẽ tự động xoá bằng
phần cứng khi thực hiện chương trình ngắt tương ứng. Ngoài ra ADIF cũng có thể xoá bằng lệnh.
• Bit 3 - ADIE: ADC Interrupt Enable
ADIE = 1 và I= 1 cho phép ngắt ADC.
• Bits 2 0 - ADPS2 ADPS0: ADC Prescaler Select Bits
Các bit xác định hệ số của bộ tiền chia trong ADC.
ADPS2 ADPS1 ADPS0 Hệ số chia
000 1
001 2
010 4
011 8
100 16

101 32
110 64
111 128
Thanh ghi dữ liệu ADC - ADCL và ADCH
Thanh ghi này chứa kết quả biến đổi ADC. Trong chế độ Free Run cần phải đọc ADCL trước
ADCH.
Quét nhiều kênh.
Do sự chuyển kênh vào luôn phải chờ cho đến khi quá trình biến đổi kết thúc, chế độ Free Run có
thể sử dụng để quét đồng thời nhiều kênh vào mà không cần dừng quá trình biến đổi. Thông thường ngắt
kết thúc biến đổi ADC sẽ sử dụng để đổi kênh vào. Tuy nhiên người sử dụng cũng có thể thực hiện việc
chuyển đổi kênh như sau:
Khi có tác động ngắt kết quả biến đổi đã sẵn sàng, nếu ADMUX được thay đổi giá trị ngay sau khi
có tác động ngắt quá trình biến đổi mới sẽ sẵn sàng với các thiết lập ADC như cũ.
Kỹ thuật loại nhiễu ADC.
Các mạch điện số bên trong và bên ngoài MCU có thể tác động tới độ chính xác quá trình biến đổi
tương tự. Khi cần độ chính xác lớn, chúng ta có thể giảm ảnh hưởng nhiễu như sau:
1. Các khối liện quan tới tín hiệu tương tự của MCU và tất cả các linh kiện liên quan tới tín hiệu
tương tự khác cần phải có đường mass ở 1 lớp riêng trên mạch in. Mass tương tự chỉ nối với mass
số bằng một điểm xuyên lỗ duy nhất (via).
2. Tạo đường nối tín hiệu tương tự ngắn nhất có thể, đảm bảo đường tín hiệu tương tự chạy song song
với mass của nó ở lớp nguồn và tránh xa các đường truyền dữ liệu số có tốc độ chuyển mạch cao.
3. Chân AVCC của MCU cần nối tới nguồn cung cấp số VCC thông qua mạch RC như hình 1.28.
4. Sử dụng chức năng loại nhiễu ADC đểgiảm nhiễu ảnh hưởng từ CPU.
5. Nếu một chân cổng A được sửdụng làm ngõ vào ra số thì nên tránh tác động chuyển trạng thái của
nó trong chu kỳ biến đổi ADC.
. Các cổng vào ra số.
Tất cả các cổng vào ra số của AVR đều có chức năng Đọc – Thay đổi – Ghi (Read-Modify-Write),
có nghĩa là hướng truyền trên một chân vào ra mà không ảnh hưởng tới hướng vào ra của các chân vào ra
khác bằng các lệnh SBI và CBI. Chúng ta có thể lập tức thay đổi giá trị định nghĩa vào ra cho cổng hoặc
cấm/cho phép điện trở kéo lên nguồn cho các ngõ vào.

Cổng A
Cổng A là một cổng vào ra 2 chiều 8 bit, có 3 địa chỉ trong vùng địa chỉ vào ra được sử dụng cho
cổng A bao gồm: Thanh ghi dữ liệu cho cổng A (PORTA - $3B), thanh ghi định hướng truyền cho cổng A
(DDRA - $3A) và thanh ghi các chân vào cổng A (PINA - $39). Thanh ghi PINA là thanh ghi chỉ đọc, hai
thanh ghi còn lại có thể đọc ghi. Tất cả các chân vào cổng A đều có thể chọn điện trở Pull – Up. Bộ đệm
ngõ ra cổng A có thể cung cấp dòng 20 mA để cung cấp dòng kép LED trực tiếp. Khi cổng A được lập
trình là ngõ vào và bên ngoài được kéo xuống thấp, chúng trở thành nguồn dòng khi chọn điện trở Pull –
Up bên trong. Khi đọc dữ liệu từ cổng A, là đọc thanh ghi dữ liệu cổng A (PORT A) là bộ nhớ đệm cổng
A. Còn khi đọc PINA là đọc trạng thái vật lý thực sự trên cổng A.
Cổng A có thể chuyển qua chức năng là các ngõ vào cho bộ ADC, nếu một trong các ngõ vào cổng
A vẫn giữ chức năng vào ra, cần phải tránh tác động thay đổi trạng thái trong khi ADC đang trong chu kỳ
biến đổi, tác động này có thể làm thay đổi kết quả biến đổi ADC.
Trong chế độ Power down, mạch schmitt trigger của cổng số không còn kết nối. Các ngõ vào
tương tự được nối tới Vcc/2 để đảm bảo không tiêu thụ nguồn trong chế độ này.
Chức năng vào ra số của cổng A.
Tất cả 8 đường của cổng A đều có chức năng giống nhau khi chúng được lập trình là các cổng vào
ra số, PAn là các đường vào ra, DDAn là các bit của thanh ghi DDAR chọn hướng truyền trên đường
PAn. Nếu DDAn = 1, PAn được định nghĩa là một ngõ ra, nếu DDAn = 0 thì PAn trở thành 1 ngõ vào.
Nếu bit PORTAn = 1 khi chân được định nghĩa là một ngõ vào, ngõ ra MOS của đường ra sẽ được nối với
điện trở Pull – Up. Để ngắt điện trở Pull – Up cần lập trình PORTAn = 0 hoặc chân cần lập trình lại là ngõ
ra. Các chân của cổng A sẽ trở thành trạng thái trở kháng cao khi MCU được Reset ngay cả khi không
cung cấp clock cho MCU. Ảnh hưởng của DDAn lên các chân của cổng A như sau:
DDAn PORTAn I/O Pull – Up Giải thích
0 0 Vào Không Trạng thái trở kháng cao
0 1 Vào Có PA n trở thành nguồn dòng nếu chân vào
được kéo xuống mức thấp.
1 0 Ra Không Ngõ ra bằng 0
1 1 Ra Không Ngõ ra bằng 1
Sơ đồ mạch cổng A trình bày trên hình 1.28
Cổng B.

Cổng B là một cổng vào ra hai chiều 8 bit, có 3 địa chỉ trong vùng nhớ vào ra sử dụng cho cổng B
là $38 cho thanh ghi dữ liệu (PORTB), địa chỉ $37 cho thanh ghi định hướng (DDRB) và địa chỉ $36 cho
chân vào cổng B (PINB). Thanh ghi PINB là thanh ghi chỉ đọc, hai thanh ghi còn lại là các thanh ghi có
thể đọc ghi được Tất cả các chân vào cổng B đều có thể chọn điện trở Pull – Up. Bộ đệm ngõ ra cổng B
có thể cung cấp dòng 20 mA để cung cấp dòng kéo LED trực tiếp. Khi cổng B được lập trình là ngõ vào
và bên ngoài kéo xuống mức thấp , chúng trở thành nguồn dòng khi chọn điện trở Pull – Up bên trong.
Khi đọc dữ liệu từ cổng A, là đọc thanh ghi dữ liệu cổng B (PORTB) là bộ nhớ đệm cổng B. Còn khi đọc
PINB là đọc trạng thái vật lý thực sự trên cổng B.
Ngoài chức năng vào ra số các chân của cổng B còn có các chức năng khác như trong bảng sau:
Chân cổng B Chức năng khác
PB5 MOSI (ngõ ra Master ngõ vào Slaver của cổng SPI)
PB6 MISO (Ngõ vào Master ngõ ra Slaver của cổng SPI)
PB7 SCK (Clock của cổng SPI)
Khi cổng B được lập trình chức năng khác, các thanh ghi DDRB và PORTB sẽ được lập trình theo
chức năng mới này.
Chức năng vào ra số của cổng B.
Tất cả 8 đường của cổng A đều có chức năng giống nhau khi chúng được lập trình là các cổng vào
ra số, PBn là các đường vào ra, DDBn là các bit của thanh ghi DDBR chọn hướng truyền trên đường
PBn. Nếu DDBn = 1, PBn được định nghĩa là một ngõ ra, nếu DDBn = 0 thì PBn trở thành 1 ngõ vào.
Nếu bit PORTBn = 1 khi chân được định nghĩa là một ngõ vào, ngõ ra MOS của đường ra sẽ được nối với
điện trở Pull – Up. Để ngắt điện trở Pull – Up cần lập trình PORTBn = 0 hoặc chân cần lập trình lại là ngõ
ra. Các chân của cổng B sẽ trở thành trạng thái trở kháng cao khi MCU được Reset ngay cả khi không
cung cấp clock cho MCU. Ảnh hưởng của DDBn lên các chân của cổng A như sau:
DDBn PORTBn I/O Pull – Up Giải thích
0 0 Vào Không Trạng thái trở kháng cao
0 1 Vào Có PBn trở thành nguồn dòng nếu chân vào
được kéo xuống mức thấp.
1 0 Ra Không Ngõ ra bằng 0
1 1 Ra Không Ngõ ra bằng 1
Mô tả các chức năng thêm của cổng B.

Các chức năng khác của cổng B bao gồm:
• SCK - Port B, Bit 7
SCK: là tín hiệu clock tạo ra từ SPI Master, đối với SPI Slaver nó là ngõ vào clock. Khi SPI trong
MCU được lập trình là một Slaver chân này sẽ là một ngõ vào trừ khi lập DDBR7 = 1 để nó trở thành một
ngõ vào số thông thường. Khi SPI lập trình thành 1 Master hướng truyền dữ liệu trên chân này được điều
khiển bằng bit DDB7. Khi chân này được lập trình thành ngõ vào, chức năng pull – up vẫn có thể sử dụng
bằng cách lập trình bit PORTB7.
• MISO - Port B, Bit 6
MISO: là ngõ vào dữ liệu cho SPI Master, là ngõ ra truyền dữ ra của SPI Slaver. Khi SPI cho phép
là Master chân này mặc định là ngõ vào trừ khi lập bit DDB6 lên 1. Khi Spi chọn là Slaver hướng truyền
dữ liệu trên chân này được điều khiển bằng bit DDB6. Khi nó được chọn là một ngõ vào vẫn có thể sử
dụng chức năng pull – up bằng cách lập trình bit PORTB6.
• MOSI - Port B, Bit 5
MOSI: là ngõ ra SPI Master, ngõ vào SPI slaver. Với SPI slaver tín hiệu này là một ngõ vào trừ khi
lập bit DDRB5 = 1. Khi SPI là Master hướng truyền dữ liệu trên chân này được điều khiển bằng DDB5.
• SS - Port B, Bit 4
SS: Ngõ vào chọncổng Slaver. Khi SPI được chọn là slaver chân này là một ngõ vào trừ khi lập
trình DDB4 = 1. Khi là một slaver, SPI sẽ tích cực nếu ngõ vào này tác động mức thấp. Khi SPI là master
hướng dữ liệu trên chân này điều khiển bằng DDB4. Khi chân này là một ngõ vào số có thể lập trình chức
năng pull – up bằng bit PORTB4.
• AIN1 - Port B, Bit 3
AIN1 (Analog Comparator Negative Input) là ngõ vào đảo của bộ so sánh tương tự. Khi lập trình là
ngõ vào DDB3 = 0, sử dụng chức năng Pull – Up PORTB3 = 0.
Trong chế độ power down mạch schmitt trigger của ngõ vào số không được kết nối làm tín hiệu
tương tự được nối tới VCC/2 làm mạch không tiêu thụ công suất nguồn.
• AIN0 - Port B, Bit 2
AIN0 (Analog Comparator Positive Input) là ngõ vào không đảo của bộ so sánh tương tự. Khi lập
trình là ngõ vào DDB2 = 0, sử dụng chức năng Pull – Up bằng các cho PORTB2 = 0
Trong chế độ power down mạch schmitt trigger của ngõ vào số sẽ không kết nối, tín hiệu tương tự
sẽ nối tới VCC/2 để mạch không tiêu thụ nguồn.

• T1 - Port B, Bit 1
Là nguồn đếm ngoài cho Timer/Counter1.
• T0 - Port B, Bit 0
Là nguồn đếm ngõ vào cho Timer/Counter0.
.
Cổng C
Cổng C là một cổng vào ra 2 chiều 8 bit, có 3 địa chỉ trong vùng địa chỉ vào ra được sử dụng cho
cổng C bao gồm: Thanh ghi dữ liệu cho cổng C (PORTC - $35), thanh ghi định hướng truyền cho cổng C
(DDRC - $34) và thanh ghi các chân vào cổng C (PINC - $33). Thanh ghi PINC là thanh ghi chỉ đọc, hai
thanh ghi còn lại có thể đọc ghi. Tất cả các chân vào cổng C đều có thể chọn điện trở Pull – Up. Bộ đệm
ngõ ra cổng C có thể cung cấp dòng 20 mA để cung cấp dòng kép LED trực tiếp. Khi cổng C được lập
trình là ngõ vào và bên ngoài được kéo xuống thấp, chúng trở thành nguồn dòng khi chọn điện trở Pull –
Up bên trong. Khi đọc dữ liệu từ cổng C, là đọc thanh ghi dữ liệu cổng C (PORT C) là bộ nhớ đệm cổng
C. Còn khi đọc PINC là đọc trạng thái vật lý thực sự trên cổng C.
Chức năng vào ra số thông thường của cổng C.
Tất cả 8 đường cồng C đều có thể sử dụng làm các đường vào ra số thông thường PCn. Bit DDCn
sử dụng để lập trình hướng truyền, DDCn = 1, PCn là ngõ ra, DDCn= 0 thì PCn là ngõ vào. Khi lập trình
là ngõ vào, nếu nạp PORTCn = 1 điện trở Pull – up bên trong sẽ được nối tới cổng vào. Bỏ kết nối điện
trở Pull – up bằng cách cho PORTCn = 0 hoặc lập trình PCn là ngõ ra. Cổng C trở thành trạng thái trở
kháng cao khi Reset ngay cả khi MCU không được cấp clock. Ảnh hưởng của DDCn tới đặc tính cổng C
trong bảng sau:
DDCn PORTCn I/O Pull Up Comment
00 Vào Không High Z
01 Vào Có Nguồn dòng nếu PCn =0
10 Ra Không 1
11 Ra Không 0
Các chức năng khác của các đường cổng C.
Khi AS2 trong ASSR được lập trình bằng 1, MCU sẽ cho phép tính năng tạo clock cận đồng bộ
của Timer/Counter 2, các chân PC6 và PC7 sẽ được sử dụng để nối tới bộ dao động thạch anh, chúng sẽ
kông còn kết nối ra cổng và không thể sử dụng làm đường vào ra số.

Cổng D
Cổng D là một cổng vào ra 2 chiều 8 bit, có 3 địa chỉ trong vùng địa chỉ vào ra được sử dụng cho
cổng D bao gồm: Thanh ghi dữ liệu cho cổng D (PORTD - $32), thanh ghi định hướng truyền cho cổng D
(DDRD - $31) và thanh ghi các chân vào cổng D (PIND - $30). Thanh ghi PIND là thanh ghi chỉ đọc, hai
thanh ghi còn lại có thể đọc ghi. Tất cả các chân vào cổng D đều có thể chọn điện trở Pull – Up. Bộ đệm
ngõ ra cổng D có thể cung cấp dòng 20 mA để cung cấp dòng kép LED trực tiếp. Khi cổng D được lập
trình là ngõ vào và bên ngoài được kéo xuống thấp, chúng trở thành nguồn dòng khi chọn điện trở Pull –
Up bên trong. Khi đọc dữ liệu từ cổng D, là đọc thanh ghi dữ liệu cổng D (PORT D) là bộ nhớ đệm cổng
D. Còn khi đọc PIND là đọc trạng thái vật lý thực sự trên cổng D.
Chức năng vào ra số thông thường của cổng D.
Tất cả 8 đường cồng D đều có thể sử dụng làm các đường vào ra số thông thường PDn. Bit DDDn
sử dụng để lập trình hướng truyền, DDDn = 1, PDn là ngõ ra, DDDn= 0 thì PDn là ngõ vào. Khi lập trình
là ngõ vào, nếu nạp PORTDn = 1 điện trở Pull – up bên trong sẽ được nối tới cổng vào. Bỏ kết nối điện
trở Pull – up bằng cách cho PORTDn = 0 hoặc lập trình PDn là ngõ ra. Cổng D trở thành trạng thái trở
kháng cao khi Reset ngay cả khi MCU không được cấp clock. Ảnh hưởng của DDDn tới đặc tính cổng D
trong bảng sau:
DDDn PORTDn I/O Pull Up Comment
00 Vào Không High Z
01 Vào Có Nguồn dòng nếu PCn =0
10 Ra Không 1
11 Ra Không 0
Các chức năng khác của cổng D.
• OC2- Port D, Bit 7
OC2 (Timer/Counter2 output compare match output): chân này còn được sử dụng làm ngõ ra bộ so
sáh Timer/Counter 2. Để chọn chức năng này cần lập trình bit DDD7 = 1. OC2 cũng được sử dụng làm
ngõ ra trong chế độ PWM.
• ICP - Port D, Bit 6
ICP - Input Capture Pin: Chân này còn được sử dụng làm ngõ vào capture cho Timer/Counter1. Để
chọn chức năng này cần lập trình bit DDD6 = 0.
• OC1A- Port D, Bit 5

OC1A, Output compare matchA output: Sử dụng làm ngõ ra so sánh thanh ghi so sánh A
Timer/Counter 1. Để chọn chức năng này cần lập trình DDD5 = 1. Ngoài ta OC1A còn sử dụng làm ngõ
ra của PWM trong Timer1.
• OC1B- Port D, Bit 4
OC1B, Output compare matchA output: Sử dụng làm ngõ ra so sánh thanh ghi so sánh B
Timer/Counter 1. Để chọn chức năng này cần lập trình DDD4 = 1. Ngoài ta OC1B còn sử dụng làm ngõ
ra của PWM trong Timer1.
• INT1 - Port D, Bit 3
INT1, External Interrupt source 1: Là chức năng làm ngõ vào cung cấp nguồn ngắt ngoài INT1.
• INT0 - Port D, Bit 2
INT0, External Interrupt source 0: Là chức năng làm ngõ vào cung cấp nguồn ngắt ngoài INT0.
• TXD - Port D, Bit 1
Là đường truyền dữ liệu ra của UART. Khi cho phép UART chân này tự động là một ngõ ra , trừ
khi lập trình DDD1 = 0.
• RXD - Port D, Bit 0
Là đường nhận dữ liệu của UART, khi cho phép UART chân này tự động là ngõ vào, trừ khi lập
trình bit DDD0 = 1.
12. UART
AT90S8535 có bộ UART song công với các thanh ghi truyền nhận riêng. Các đặc tính chính của chính
của UART như sau:
• Bộ tạo tốc độ truyền có thể tạo ra nhiều tốc độ khác nhau.
• Có thể truyền với tốc độ cao với thạch anh dao động thấp.
• Có thể truyền 8 hoặc 9 bit dữ liệu.
• Có bộ lọc nhiễu.
• Phát hiện lỗi nhận Overrun.
• Phát hiện lỗi sai khung.
• Phát hiện lỗi sai Start bit.
• Ba phục vụ ngắt riêng (truyền xong, Thanh ghi truyền rỗng và nhận xong)
• Có các bộ đệm truyền nhận.
Truyển dữ liệu.

Quá trình truyền dữ liệu được bắt đầu khi thực hiện việc ghi dữ liệu tới thanh ghi dữ liệu của
UART (UDR), dữ liệu sẽ được chuyển từ UDR qua thanh ghi dịch truyền khi:
• Nếu một ký tự truyền mới được ghi t ới UDR khi bit Stop của ký tự trước đó đã được dịch ra ngoài.
Thanh ghi dịch được nạp tức thời.
• Nếu một ký tự mới ghi tới UDR trước khi bit stop của ký tự trước dịch ra ngoài thì thanh ghi dịch chỉ
được nạp khi stop bit được dịch ra ngoài.
Khi thanh ghi dịch bộ truyền rỗng, dữ liệu sẽ được truyền từ UDR tới thanh ghi dịch và bit UDRE
trong USR sẽ được lập bằng 1. Khi UDRE = 1, UART sẵn sàng nhận một ký tự mới. Tại cùng thời điểm
dữ liệu được ghi từ UDR tới thanh ghi dịch bit 0 của thanh ghi dịch sẽ tự động được xoá để làm Start bit
và bit cuối cùng trong khung truyền được lập để làm bit Stop. Nếu lập trình truyền 9 bit (bit CHR9 trong
UCR bằng 1) thì bit TXB8 trong UCR sẽ được ghi tới bit thứ 9 của thanh ghi dịch. Theo tốc độ đã được
chọn, đầu tiên bit Start được truyền ra trên đường TXD, tiếp theo là các bit dữ liệu (LSB trước) và cuối
cùng là bit Stop. Khi bit Stop đã được dịch ra đường truyền một giá trị mới sẽ lập tức được ghi tới thanh
ghi dịch nếu có một dữ liệu đã được ghi tới UDR trong quá trình truyền. Trong suốt quá trình truyền dữ
liệu UDRE = 1, nếu không có dữ liệu mới trong UDR khi bit Stop được dịch ra ngoàicờ UDRE sẽ duy trì
mức 1 cho đến khi UDR được ghi giá trị mới. Khi không có dữ liệu mới đường truyền TXD được duy trì
ở mức bit Stop trong thời gian của một bit, cờ hoàn thanh truyền TXC trong USR được lập. Bit TXEN
trong UCR =1 sẽ cho phép bộ truyền UART, khi bit này bằng 0 chân PD1 có thể sử dụng thành đường
vào ra thông thường. Khi bit TXEN = 1, bộ truyền UART sẽ nối tới chân PD1, nó sẽ tự động là ngõ ra trừ
khi chúng ta lập bit DDD1 trong DDRD lên 1.
Quá trình nhận dữ liệu.
.
Bộ nhận lấy mẫu tín logic tín hiệu tại ngõ vào RXD với tần số gấp 16 lần tốcđộ baud được lập
trình. Khi đường nhận rỗi, trạng thái logic 0 xuất hiện sẽ được hiểu là cạnh xuống của bit Start, quá trình
nhận dữ liệu sẽ được bắt đầu. Một bit sẽ được lấy mầu theo khâu lấu mẫu bậc nhất. Sau khi có chuyển đổi
trạng thái từ 1 xuống 0 bộ nhận sẽ lấy mẫu ngõ vào RXD tại các mẫu 8, 9 và 10. Nếu từ 2 mẫu trở lên có
logic 0 bit Start nhận được sẽ được xem là nhiễu.
Khi bit Start hợp lệ, việc lấy mẫu các bit dữ liệu sẽ được thực hiện giống như đối với bit Start, các
bit chỉ được chấp nhận nếu có ít hơn 2 mẫu sai. Khung truyền dữ liệu được biểu diễn trên hình 1.24.
Khi bit Stop được nhận, phải 3 bit chính bằng 1 bit này mới được coi là đúng. Nếu từ 2 mẫu trong

bit bằng 0 UART sẽ thông báo lỗi sai khung truyền, bit FE trong USR sẽ được lập lên 1. Trước khi đọc dữ
liệu từ UDR, người sử dụng cần kiểm tra bit FE để loại bỏ các lỗi sai khung trong khi truyền dữ liệu.
Có hoặc không có bit Stop hợp lệ, khi kết thúc chu kỳ nhận dữ liệu vẫn được truyền tới UDR và cờ
RXC trong USR vẫn được lập bằng 1.
Khi thực hiện lệnh đọc thanh ghi UDR, dữ liệu trong thanh ghi nhận dữ liệu sẽ được truy cập và
khi ghi UDR dữ liệu trong thanh ghi dữ liệu truyền sẽ được truy cập. Nếu lập trình truyền 9 bit (CHR9=
1) bit RXB8 trong UCR sẽ được nạp giá trị bit 9 của thanh ghi dịch truyền khi dữ liệu được truyền tới
UDR.
Khi đã nhận xong một ký tự, nếu UDR vẫn chưa được đọc từ lần nhận trước, lỗi Overrun sẽ được
thông báo bằng cách lập cờ OR trong thanh ghi UCR. Có nghĩa là dữ liệu nhận được trước đó đã bị mất.
OR được đệm lại và cập nhật sau mỗi lần đọc dữ liệu hợp lệ trong UDR, vì vậy người sử dụng cần kiểm
tra bit OR sau khi đọc UDR để phát hiện lỗi truyền dữ liệu.
Khi RXEN trong UCR = 0 bộ nhận sẽ không được phép hoạt động,chân PD0 có thể sử dụng làm
một ngõ vào thông thường. Khi RXEN = 1, bộ nhận UART sẽ nối tới PD0 và nó sẽ là một ngõ vào trừ khi
lập bit DDD0 trong thanh ghi DDRD lên 1. Khi PD0 được sử dụng làm ngõ vào cho UART, bit PORTD0
vẫn có thể sử dụng làm bit điều khiển với điện trở pull – up kéo lên nguồn.
Khi CHR9 =1, giữa bit start và stop sẽ bao gồm 9 bit, khi truyền bit thứ 9 sẽ được lấy từ TXB8
trong UCR, khi đó người lập trình cần thiết lập giá trị mong muốn cho nó trước khi ghi dữ liệu tới UDR.
Bit thứ 9 khi nhận sẽ được ghi vào RXB8 trong UCR.
Điều khiển UART.
Thanh ghi dữ liệu vào ra UART - UDR
UDR là thanh ghi chứa trong 2 ô nhớ vật lý riêng biệt trong vùng địa chỉ vào ra của MCU. Khi
thực hiện lệnh ghi UDR, có nghĩa là ghi tới thanh ghi truyền dữ liệu của UART. Khi thực hiện lệnh đọc
UDR sẽ đọc dữ liệu từ thanh ghi nhận dữ liệu của UART.
Thanh ghi trạng thái UART – USR.
USR là thanh ghi chỉ đọc cung cấp những thông tin về trạng thái của UART.
• Bit 7 - RXC: UART Receive Complete
RXC = 1 khi dữ liệu nhận được ghi xong từ thanh ghi dịch nhận tới UDR trừ khi phát hiện lỗi sai
khung truyền. Khi RXCIE trong UCR bằng 1, ngắt phục vụ hoàn thành nhận dữ liệu sẽ được thực hiện khi
RXC = 1. RXC tự động được xoá khi đọc UDR. Khi sử dụng ngắt nhận, chương trình phục vụ ngắt cần

đọc UDR nếu không RXC không được xoá và một yêu cầu ngắt khác sẽ tiếp tục khi kết thúc chương trình
phục vụ ngắt.
• Bit 6 - TXC: UART Transmit Complete
TCX = 1 khi toàn bộ ký tự truyền ( bao gồm cả bit Stop) trong thanh ghi dịch truyền đã dịch xong
ra ngoài mà chưa có dữ liệu mới ghi tới UDR. Cờ này rất hữu dụng trong chế độ bán song công, khi
đường truyền cần giải phóng cho việc nhận dữ liệu sau khi đã truyền xong ký tự. Khi TXCIE = 1, nếu
TXC = 1 ngắt phục vụ truyền sẽ thực hiện. TXC sẽ tự động xoá khi chuyển qua chương trình phục vụ
ngắt. Cũng có thể xoá TXC = 0 bằng cách ghi logic 0 tới nó.
• Bit 5 - UDRE: UART Data Register Empty
UDRE = 1 khi một ký tự được ghi tới UDR đã được chuyển qua thanh ghi dịch truyền. Bit này
bằng 1 thông báo khối truyền trong UART sẵn sàng nhận một ký tự mới để truyền đi. Khi UDRIE trong
UCR được lập, ngắt hoàn tất truyền sẽ được thực hiện nếu UDRE = 1. UDRE sẽ tự động được xoá khi ghi
dữ liệu tới UDR.
Khi sử dụng ngắt điều khiển truyền dữ liệu chương trình ngắt phục vụ ngắt thanh ghi dữ liệu
UART rỗng cần xoá UDRE, nếu không yêu cầu ngắt sẽ vẫn tiếp tục khi chương trình phục vụ ngắt kết
thúc. Sau khi Reset UDRE = 1 để thông báo bộ truyền dữ liệu sẵn sàng.
• Bit 4 - FE: Framing Error
FE= 1 khi xảy ra lỗi sai khung truyền dữ liệu, tức là khi bit Stop trong khung truyền bằng 0.
• Bit 3 - OR: OverRun
OR = 1 khi xảy ra lỗi Overrun, lỗinày xảy ra khi có dữ liệu nhận sẵn sàng trong UDR chương trình
không đọc trước khi ký tự kế tiếp được nhận xong trong thanh ghi dịch bộ nhận.
• Bits 2 0 - Res: Reserved bits
Các bit này không sử dụngvàluôn có giá trị bằng 0.
Thanh ghi điều khiển UART - UCR
• Bit 7 - RXCIE: RX Complete Interrupt Enable
RXCIE = 1sẽ cho phép ngắt nhận dữ liệu, chương trình ngắt sẽ thực hiện khi RXC = 1.
• Bit 6 - TXCIE: TX Complete Interrupt Enable
TXCIE =1 sẽ cho phép ngắt truyền, chương trình ngắt truyền sẽ thực hiện khi TXC = 1.
• Bit 5 - UDRIE: UART Data Register Empty Interrupt Enable
Khi UDRIE = 1,nếu UDRE = 1chương trình ngắt phục vụ thanh ghi dữ liệu UDR rỗng sẽ thực

hiện.
• Bit 4 - RXEN: Receiver Enable
RXEN = 1 sẽ cho phép bộ nhận dữ liệu trong UART. Khi bộ nhận không được cho phép các bit
TXC, OR và FE sẽ không được lập. Nếu các cờ đang bằng 1, việc xóa RXEN cũng không xoá chúng trở
lại.
• Bit 3 - TXEN: Transmitter Enable
Bit này cho phép bộ truyền trong UART, cấmbộ truyền khi đang trong chu kỳ truyền 1 ký tự, bộ
truyền sẽ truyền hết ký tự đó và các ký tự đã ghi tới UDR.
• Bit 2 - CHR9: 9 Bit Characters
CHR9 = 1 khung truyền sẽ bao gồm 9 bit dữ liệu giữa Start và Stop bit. Bit thứ 9 sẽ đọc vào
RXB8 và lấy từ TXB8 trong UCR. Bit thứ 9 này có thể sử dụng làm bit Stop công thêm hoặc bit kiểm tra
chẵn lẻ.
• Bit 1 - RXB8: Receive Data Bit 8
Bit này chứa bit thứ 9 trong dữ liệu nhận được khi CHR9 = 1.
• Bit 0 - TXB8: Transmit Data Bit 8
Bit này chứa bit thứ 9 để truyền đi khi CHR9 = 1.
Bộ tạo tốc độ Baud.
Bộ tạo tốc độ baud là một bộ chia tần để tạo ra tốc độ truyền dữ liệu,với:
• BAUD = Tốc độ baud (Baud-Rate)
• fCK= Tần số thạch anh tạo xung clock (Crystal Clock frequency).
• UBRR = Nội dung thanh ghi UBRR (0-255).
Với các tần số thạch anh chuẩn tốc độ baud trên cổng UART tuỳ thuộc và giá trị nạp cho UBRR
như trong bảng sau:
BÀI 6 : GIAO TIẾP LCD
Chức năng của các chân LCD :
Các chân Vcc, Vss và Vee
Chân Vcc cấp dương nguồn 5V, chân Vss nối đất, chân Vee được dùng để
điều khiển độ tương phản của màn hình LCD.
GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 43 www.dks.edu.vn
RS ( Register select)

Khi ở mức thấp, chỉ thị được truyền đến LCD như xoá màn hình ,vị trí con
trỏ ….Khi ở mức cao, kí tự được truyền đến LCD
R/W (Read/Write)
Dùng để xác định hướng của dữ liệu được truyền giữa LCD và vi điều
khiển. Khi nó ở mức thấp dữ liệu được ghi đến LCD và khi ở mức cao, dữ liệu
được đọc từ LCD. Nếu chúng ta chỉ cần ghi dữ liệu lên LCD thì chúng ta có thể
nối chân này xuống GND để tiết kiệm chân
E (Enable)
Cho phép ta truy cập/xuất đến LCD thông qua chân RS và R/W.Khi chân E
ở mức cao (1) LCD sẽ kiểm tra trạng thái của 2 chân RS và R/W và đáp ứng cho
phù hợp. Khi dữ liệu được cấp đến chân dữ liệu thì một xung mức cao xuống thấp
phải được áp đến chân này để LCD chốt dữ liệu trên các chân dữ liêu. Xung này
phải rộng tối thiểu là 450ns. Còn khi chân E ở mức thấp (0), LCD sẽ bị vô hiệu
hoá hoặc bỏ qua tín hiệu của 2 chân RS và R/W.
Các chân D0 - D7
Đây là 8 chân dữ liệu 8 bít, được dùng để gửi thông tin lên LCD hoặc đọc
nội dung của các thanh ghi trong LCD. Các kí tự được truyền theo mã tương ứng
trong bảng mã ascii. Cũng có các mã lệnh mà có thể được gửi đến LCD để xoá
màn hình hoặc đưa con trỏ về đầu dòng hoặc nhấp nháy con trỏ.
LCD có 2 chế độ giao tiếp, chế độ 4 bit (chỉ dùng 4 chân D4 đến D7 để
truyền dữ liệu) và chế độ 8 bit (dùng cả 8 chân dữ liệu từ D0 đến D7), ở chế độ 4
bit, khi truyền 1 byte, chúng ta sẽ truyền nửa cao của byte trước, sau đó mới
truyền nửa thấp của byte.
Trước khi truyền các kí tự ra màn hình LCD ta cần thiết lập cho LCD như
chọn chế độ 4 bit hoặc 8 bit, 1 dòng hay 2 dòng ,bật/tắt con trỏ… Dưới đây là
• bảng tập lệnh của LCD :
Hướng dẫn thực hiện phần cứng:
– Kết nối màn hình LCD tới các cổng AVR: PORTC nối tới cổng dữ liệu (DB0 – DB7),
PORTD cấp các tín hiệu E, RS, R/W#.
• Hướng dẫn lập trình:

– Muốn hiển thị ký tự trên màn hình LCD trước hết phải khởi động nó bằng cách ghi giá trị
38H tới thanh ghi điều khiển của nó. Chọn thanh ghi điều khiển bằng cách cấp RS=1, ghi
bằng cách câp R/W = 0 và cho E lến mức 1 sau đó kéo xuống mức 0.
– Trước khi ghi dữ liệu tới hiển thị lên LCD cần kiểm tra trạng thái sẵn sàng của nó bằng cách
đọc thanh ghi trạng thái (RS=1, R/W=1 và E = L-H-L). Nếu bit cao nhất của thanh ghi trạng
thái bằng 1 thì LCD đã sẵn sàng nhận dữ liệu.
– Để hiển thị ký tự trên LCD cần ghi mã ASCII của ký tự cần hiển thị tới nó (RS=0, R/W=0,
E = L-H-L, DB7-0=ASCII).
– Để dòng chữ trôi trên LCD có thể ghi lệnh 18H (dịch trái) hoặc 1CH (dịch phải) tới LCD.

×