Thứ Bảy, 8 tháng 2, 2014

Báo cáo thực tập tốt nghiệp - Vi điều khiển

Chương 2. Cấu trúc nhân AVR
Chương 2. Cấu trúc nhân AVR
CPU của AVR có chức năng bảo đảm sự hoạt động chính xác của các chương trình.
Do đó nó phải có khả năng truy cập bộ nhớ, thực hiện các quá trình tính toán, điều
khiển các thiết bị ngoại vi và quản lý ngắt.
2.1.Cấu trúc tổng quát
Hình 2.1. Sơ đồ cấu trúc CPU của ATmega16
AVR sử dụng cấu trúc Harvard, tách riêng bộ nhớ và các bus cho chương trình và
dữ liệu. Các lệnh được thực hiện chỉ trong một chu kỳ xung clock. Bộ nhớ chương trình
được lưu trong bộ nhớ Flash.
2.2. ALU
ALU làm việc trực tiếp với các thanh ghi chức năng chung. Các phép toán được
thực hiện trong một chu kỳ xung clock. Hoạt động của ALU được chia làm 3 loại: đại
số, logic và theo bit.
2.3. Thanh ghi trạng thái
Đây là thanh ghi trạng thái có 8 bit lưu trữ trạng thái của ALU sau các phép tính số
học và logic.
Lê Hải Đăng CTM5-k50-HUT
Chương 2. Cấu trúc nhân AVR
Hình 2.2. Thanh ghi trạng thái SREG
C: Carry Flag ;cờ nhớ (Nếu phép toán có nhớ cờ sẽ được thiết lập)
Z: Zero Flag ;Cờ zero (Nếu kết quả phép toán bằng 0)
N: Negative Flag (Nếu kết quả của phép toán là âm)
V: Two’s complement overflow indicator (Cờ này được thiết lập khi tràn số bù 2)
V, For signed tests (S=N XOR V) S: N
H: Half Carry Flag (Được sử dụng trong một số toán hạng sẽ được chỉ rõ sau)
T: Transfer bit used by BLD and BST instructions(Được sử dụng làm nơi chung
gian trong các lệnh BLD,BST).
I: Global Interrupt Enable/Disable Flag (Đây là bit cho phép toàn cục ngắt. Nếu bit
này ở trạng thái logic 0 thì không có một ngắt nào được phục vụ.)
2.4. Các thanh ghi chức năng chung
Hình 2.3. Thanh ghi chức năng chung
2.5. Con trỏ ngăn xếp (SP)
Là một thanh ghi 16 bit nhưng cũng có thể được xem như hai thanh ghi chức năng
đặc biệt 8 bit. Có địa chỉ trong các thanh ghi chức năng đặc biệt là $3E (Trong bộ nhớ
RAM là $5E). Có nhiệm vụ trỏ tới vùng nhớ trong RAM chứa ngăn xếp.
Lê Hải Đăng CTM5-k50-HUT
Chương 2. Cấu trúc nhân AVR
Hình 2.4. Thanh ghi con trỏ ngăn xếp
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưu vào
ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí. Và con trỏ ngăn xếp sẽ giảm 1 khi
thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽ tăng 1 và
khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2. Như vậy con trỏ ngăn
xếp cần được chương trình đặt trước giá trị khởi tạo ngăn xếp trước khi một chương
trình con được gọi hoặc các ngắt được cho phép phục vụ. Và giá trị ngăn xếp ít nhất
cũng phải lơn hơn hoặc bằng 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi.
2.6. Quản lý ngắt
Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình trạng sẵn
xàng cho đổi dữ liệu của mình.Ví dụ:Khi bộ truyền nhận UART nhận được một byte nó
sẽ báo cho CPU biết thông qua cờ RXC,hợc khi nó đã truyền được một byte thì cờ TX
được thiết lập…
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và lưu vị trí
đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới vector phuc vụ
ngắt và thức hiện chương trình phục vụ ngắt đó chơ tới khi gặp lệnh RETI (return from
interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục thực hiện chương trình mà trước
khi có ngăt nó đang thực hiện. Trong trường hợp mà có nhiều ngắt yêu cầu cùng một
lúc thì CPU sẽ lưu các cờ báo ngắt đó lại và thực hiện lần lượt các ngắt theo mức ưu
tiên .Trong khi đang thực hiện ngắt mà xuất hiện ngắt mới thì sẽ xảy ra hai trường hợp.
Trường hớp ngắt này có mức ưu tiên cao hơn thì nó sẽ được phục vụ. Còn nó mà có
mức ưu tiên thấp hơn thì nó sẽ bị bỏ qua.
Bộ nhớ ngăn xếp là vùng bất kì trong SRAM từ địa chỉ 0x60 trở lên. Để truy nhập
vào SRAM thông thường thì ta dùng con trỏ X,Y,Z và để truy nhập vào SRAM theo
kiểu ngăn xếp thì ta dùng con trỏ SP. Con trỏ này là một thanh ghi 16 bit và được truy
nhập như hai thanh ghi 8 bit chung có địa chỉ :SPL :0x3D/0x5D(IO/SRAM) và
SPH:0x3E/0x5E.
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưu vào
ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí.Và con trỏ ngăn xếp sẽ giảm 1 khi
thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽ tăng 1 và
khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2. Như vậy con trỏ ngăn
xếp cần được chương trình đặt trước giá trị khởi tạo ngăn xếp trước khi một chương
trình con được gọi hoặc các ngắt được cho phép phục vụ. Và giá trị ngăn xếp ít nhất
cũng phải lớn hơn 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi.
Ví dụ:
char cSREG;
cSREG = SREG; /* store SREG value */
/* disable interrupts during timed sequence */
CLI();
EECR |= (1<<EEMWE); /* start EEPROM write */
Lê Hải Đăng CTM5-k50-HUT
Chương 2. Cấu trúc nhân AVR
EECR |= (1<<EEWE);
SREG = cSREG; /* restore SREG value (I-bit) */
Lê Hải Đăng CTM5-k50-HUT
Chương 3. Cấu trúc bộ nhớ
Chương 3. Cấu trúc bộ nhớ
AVR có 2 không gian bộ nhớ chính là bộ nhớ dữ liệu vào bộ nhớ chương trình.
Ngoài ra ATmega16 còn có thêm bộ nhớ EEPROM để lưu trữ dữ liệu.
3.1. Bộ nhớ chương trình (Bộ nhớ Flash)
Bộ nhớ Flash 16KB của ATmega16 dùng để lưu trữ chương trình. Do các lệnh của
AVR có độ dài 16 hoặc 32 bit nên bộ nhớ Flash được sắp xếp theo kiểu 8KX16. Bộ nhớ
Flash được chia làm 2 phần, phần dành cho chương trình boot và phần dành cho
chương trình ứng dụng.
Hình 3.1. Bản đồ bộ nhớ chương trình
3.2. Bộ nhớ dữ liệu SRAM
1120 ô nhớ của bộ nhớ dữ liệu định địa chỉ cho file thanh ghi, bộ nhớ I/O và bộ nhớ
dữ liệu SRAM nội. Trong đó 96 ô nhớ đầu tiên định địa chỉ cho file thanh ghi và bộ
nhớ I/O, và 1024 ô nhớ tiếp theo định địa chỉ cho bộ nhớ SRAM nội.
Lê Hải Đăng CTM5-k50-HUT
Chương 3. Cấu trúc bộ nhớ
Hình 3.2. Bản đồ bộ nhớ dữ liệu SRAM
3.3. Bộ nhớ dữ liệu EEPROM
ATmega16 chứa bộ nhớ dữ liệu EEPROM dung lượng 512 byte, và được sắp xếp
theo từng byte, cho phép các thao tác đọc/ghi từng byte một.
Lê Hải Đăng CTM5-k50-HUT
Báo cáo thực tập tốt nghiệp Chương 4.Các cổng vào ra
Chương 4. Các cổng vào ra (I/O)
Vi điều khiểnATmega16có 32 đường vào ra chia làm bốn nhóm 8 bit một. Các
đường vào ra này có rất nhiều tính năng và có thể lập trình được. Ở đây ta sẽ xét chúng
là các cổng vào ra số. Nếu xét trên mặt này thì các cổng vào ra này là cổng vào ra hai
chiều có thể định hướng theo từng bit. Và chứa cả điện trở pull-up (có thể lập trình
được). Mặc dù mỗi port có các đặc điểm riêng nhưng khi xét chúng là các cổng vào ra
số thì dường như điều khiển vào ra dữ liệu thì hoàn toàn như nhau. Chúng ta có thanh
ghi và một địa chỉ cổng đối với mỗi cổng, đó là : thanh ghi dữ liệu cổng (PORTA,
PORTB, PORTC, PORTD), thanh ghi dữ liệu điều khiển cổng (DDRA, DDRB, DDRC,
DDRD) và cuối cùng là địa chỉ chân vào của cổng (PINA, PINB, PINC, PIND).
4.1. Thanh ghi DDRx
Đây là thanh ghi 8 bit (ta có thể đọc và ghi các bit ở thanh ghi này) và có tác dụng
điều khiển hướng cổng PORTx (tức là cổng ra hay cổng vào). Nếu như một bit trong
thanh ghi này được set thì bit tương ứng đó trên PORTx được định nghĩa như một cổng
ra. Ngược lại nếu như bit đó không được set thì bit tương ứng trên PORTx được định
nghĩa là cổng vào.
4.2.Thanh ghi PORTx
Đây cũng là thanh ghi 8 bit (các bit có thể đọc và ghi được) nó là thanh ghi dữ liệu
của cổng Px và trong trường hợp nếu cổng được định nghĩa là cổng ra thì khi ta ghi một
bit lên thanh ghi này thì chân tương ứng trên port đó cũng có cùng mức logic. Trong
trường hợp mà cổng được định nghĩa là cổng vào thì thanh ghi này lại mang dữ liệu
điều khiển cổng. Cụ thể nếu bit nào đó của thanh ghi này được set (đưa lên mức 1) thì
điện trở kéo lên (pull-up) của chân tương ứng của port đó sẽ được kích hoạt. Ngược lại
nó sẽ ở trạng thái hi-Z. Thanh ghi này sau khi khởi động Vi điều khiểnsẽ có giá trị là
0x00.
4.3. Thanh ghi PINx
Đây là thanh ghi 8 bit chứa dữ liệu vào của PORTx (trong trường hợp PORTx được
thiết lập là cổng vào) và nó chỉ có thể đọc mà không thể ghi vào được.
Tóm lại:
1. Để đọc dữ liệu từ ngoài thì ta phải thực hiện các bước sau:
 Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n trong
port) đó là đầu vào (xóa thanh ghi DDRx hoặc bit).
 Sau đó kích hoạt điện trở pull-up bằng cách set thanh ghi PORTx ( bit).
 Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit).
2. Để đưa dữ liệu từ vi điều khiển ra các cổng cũng có các bước hoàn toàn tương tự.
Ban đầu ta cũng phải định nghĩa đó là cổng ra bằng cách set bit tương ứng của cổng
đó….và sau đó là ghi dữ liệu ra bit tương ứng của thanh ghi PORTx.
Ví dụ:
unsigned char i;
Lê Hải Đăng CTM5-k50-HUT
Báo cáo thực tập tốt nghiệp Chương 4.Các cổng vào ra

/* Define pull-ups and set outputs high */
/* Define directions for port pins */
PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* Insert nop for synchronization*/
_NOP();
/* Read port pins */
i = PINB;
Lê Hải Đăng CTM5-k50-HUT
Báo cáo thực tập tốt nghiệp Chương 5.Bộ định thời
Chương 5. Bộ định thời
Bộ định thời (timer/counter0) là một module định thời/đếm 8 bit, có các đặc điểm
sau:
 Bộ đếm một kênh
 Xóa bộ định thời khi trong mode so sánh (tự động nạp)
 PWM
 Tạo tần số
 Bộ đếm sự kiện ngoài
 Bộ chia tần 10 bit
 Nguồn ngắt tràn bộ đếm và so sánh
Sơ đồ cấu trúc của bộ định thời:
Hình 5.1. Sơ đồ cấu trúc bộ định thời
5.1. Các thanh ghi
TCNT0 và OCR0 là các thanh ghi 8 bit. Các tín hiệu yêu cầu ngắt đều nằm trong
thanh ghi TIFR. Các ngắt có thể được che bởi thanh ghi TIMSK.
Bộ định thời có thể sử dụng xung clock nội thông qua bộ chia hoặc xung clock
ngoài trên chân T0. Khối chọn xung clock điều khiển việc bộ định thời/bộ đếm sẽ dùng
nguồn xung nào để tăng giá trị của nó. Ngõ ra của khối chọn xung clock được xem là
xung clock của bộ định thời (clk
T0
).
Thanh ghi OCR0 luôn được so sánh với giá trị của bộ định thời/bộ đếm. Kết quả so
sánh có thể được sử dụng để tạo ra PWM hoặc biến đổi tần số ngõ ra tại chân OC0.
5.2. Đơn vị đếm
Phần chính của bộ định thời 8 bit là một đơn vị đếm song hướng có thể lập trình
được. Cấu trúc của nó như hình dưới đây:
Lê Hải Đăng CTM5-k50-HUT
Báo cáo thực tập tốt nghiệp Chương 5.Bộ định thời
Hình 5.2. Đơn vị đếm
count: tăng hay giảm TCNT0 1
direction: lựa chọn giữa đếm lên và đếm xuống
clear: xóa thanh ghi TCNT0
clk
T0
: xung clock của bộ định thời
TOP: báo hiệu bộ định thời đã tăng đến giá trị lớn nhất
BOTTOM: báo hiệu bộ định thời đã giảm đến giá trị nhỏ nhất (0)
5.3. Đơn vị so sánh ngõ ra
Hình 5.3. Sơ đồ đơn vị so sánh ngõ ra
Bộ so sánh 8 bit liên tục so sánh giá trị TCNT0 với giá trị trong thanh ghi so sánh
ngõ ra (OCR0). Khi giá trị TCNT0 bằng với OCR0, bộ so sánh sẽ tạo một báo hiệu.
Báo hiệu này sẽ đặt giá trị cờ so sánh ngõ ra (OCF0) lên 1 vào chu kỳ xung clock tiếp
theo. Nếu được kích hoạt (OCIE0=1), cờ OCF0 sẽ tạo ra một ngắt so sánh ngõ ra và sẽ
tự động được xóa khi ngắt được thực thi. Cờ OCF0 cũng có thể được xóa bằng phần
mềm.
5.4. Mô tả các thanh ghi
5.4.1. Thanh ghi điều khiển bộ định thời/bộ đếm TCCR0
Lê Hải Đăng CTM5-k50-HUT

Không có nhận xét nào:

Đăng nhận xét