You are on page 1of 14

Nhӳng Tính Năng Chính Cӫa ATmega128:

O ROM : 128 Kbytes


O SRAM: 4Kbytes
O EEPROM : 4Kbytes
O 64 thanh ghi I/O
O 160 thanh ghi vào ra mӣ rӝng
O 32 thanh ghi đa mөc đích.
O 2 bӝ đӏnh thӡi 8 bit (0,2).
O 2 bӝ đӏnh thӡi 16 bit (1,3).
O Bӝ đӏnh thӡi watchdog
O Bӝ dao đӝng nӝi RC tҫn sӕ 1 MHz, 2 MHz, 4 MHz, 8 MHz
O ADC 8 kênh vӟi đӝ phân giҧi 10 bit (Ӣ dòng Xmega lên tӟi 12 bit )
O 2 kênh PWM 8 bit
O 6 kênh PWM có thӇ lұp trình thay đәi đӝ phân giҧi tӯ 2 tӟi 16 bit
O Bӝ so sánh tương tӵ có thӇ lӵa chӑn ngõ vào
O Hai khӕi USART lұp trình đưӧc
O Khӕi truyӅn nhұn nӕi tiӃp SPI
O Khӕi giao tiӃp nӕi tiӃp 2 dây TWI
O Hӛ trӧ boot loader
O 6 chӃ đӝ tiӃt kiӋm năng lưӧng
O Lӵa chӑn tҫn sӕ hoҥt đӝng bҵng phҫn mӅm
O Đóng gói 64 chân kiӇu TQFP.
O Tҫn sӕ tӕi đa 16MHz
O ĐiӋn thӃ : 4.5v - 5.5v
«v.v«
Vi điӅu khiӇn AVR do hãng Atmel ( Hoa Kì ) sҧn xuҩt đưӧc gӟi thiӋu lҫn đҫu năm
1996. AVR có rҩt nhiӅu dòng khác nhau bao gӗm dòng Tiny AVR ( như AT tiny 13, AT
tiny 22«) có kích thưӟc bӝ nhӟ nhӓ, ít bӝ phұn ngoҥi vi, rӗi đӃn dòng AVR ( chҷn hҥn
AT90S8535, AT90S8515,«) có kích thưӟc bӝ nhӟ vào loҥi trung bình và mҥnh hơn là
dòng Mega ( như ATmega32, ATmega128,«) vӟi bӝ nhӟ có kích thưӟc vài Kbyte đӃn
vài
trăm Kb cùng vӟi các bӝ ngoҥi vi đa dҥng đưӧc tích hӧp trên chip, cũng có dòng tích hӧp
cҧ bӝ LCD trên chip ( dòng LCD AVR ). Tӕc đӝ cӫa dòng Mega cũng cao hơn so vӟi các
dòng khác. Sӵ khác nhau cơ bҧn giӳa các dòng chình là cҩu trúc ngoҥi vi, còn nhân thì
vүn
như nhau, [ nh 1.1. —  
    !
"  # $%  &'()*+ ' ),-)
.
)"  !/-0   &12,
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 4

 

Cҩu trúc cơ bҧn cӫa vi điӅu khiӇn AVR đưӧc thӇ hiӋn ӣ h nh 1.2.
  !  "#$%
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 5
Chương II
CҨU TRÚC BӜ N[ VÀ CӘNG VÀO - RA
I.| CҨU TRÚC BӜ N[
II.|
III.|
IV.| Giӟi ThiӋu:
Bӝ nhӟ vi điӅu khiӇn AVR 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ӟ AVR đưӧc chia làm 2 phҫn chính: Bӝ
nhӟ
chương trình ( program memory ) và bӝ nhӟ dӳ liӋu ( Data memory ).
Bӝ Nhӟ Chương Tr nh : Bӝ nhӟ chương trình cӫa AVR là bӝ nhӟ Flash có
dung lưӧng 128 K bytes. 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 bҧng véc tơ ngҳt ( xem
chi tiӃt vӅ bҧng véc tơ ngҳt ӣ chương 4 ). Cҫn đӇ ý là ӣ 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 ) và 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. [ nh 2.1 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.
[ nh 2.1 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 AVR chia làm 2 phҫn chính là bӝ nhӟ
SRAM và bӝ nhӟ EEPROM. 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 4 K bytes, 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 bit (9) ).
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 4096 byte 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 64 K byte. Khi nói bӝ nhӟ SRAM có dung
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< /
lưӧng 4 K byte 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.25 K byte = 4352 byte.
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 2.2 thӇ hiӋn sơ đӗ
bӝ nhӡ dӳ liӋu ӣ cҧ hai chӃ đӝ : Bình thưӡng và tương thích ATmega103. Tӯ h nh 2.2 ta
thҩy nӃu cҩu hình đӇ bӝ nhӟ SRAM hoҥt đӝng ӣ chӃ đӝ tương thích ATmega103 thì ta sӁ
bӏ mҩt đi 160 thanh ghi vào ra mӣ rӝng ( extended I/O Register ), là nhӳng thanh ghi
đóng
vai trò quan trӑng trong các chӃ đӝ hoҥt đӝng cӫa vi điӅu khiӇn.
[ nh 2.2 Bҧn đӗ bӝ nhӟ dӳ liӋu
A : -=>'
B: -='?% 6 @ A
Trong vùng nhӟ vào ra mӣ rӝng ( $0060 - $00FF ) chӍ có 6 lӋnh sau là có thӇ đưӧc
sӱ dөng, là : ST / STS / STD và LD / LDS / LDD.
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 8
LӋnh CBI và SBI chӍ có thӇ làm viӋc vӟi 32 thanh ghi thҩp hơn trong vùng nhӟ vào
ra , tӭc các thanh ghi I/O có đӏa chӍ tӯ $20 tӟi $3F ( đӏa chӍ SRAM ).
64 thanh ghi vào ra trong vùng nhӟ vào ra ( phҫn sӕ 2 ) có 2 kiӇu chӑn đӏa chӍ : NӃu
xem chúng là vùng nhӟ vào ra thì đӏa chӍ sӁ là $00 - $3F, khi sӱ dөng các lӋnh in, out «
ta
phҧi sӱ dөng đӏa chӍ này. NӃu xem chúng như là mӝt phҫn cӫa bӝ nhӟ SRAM thì sӁ có
đӏa
chӍ là $0020 - $005F, khi ta dùng các lӋnh như LD, ST« ta phҧi sӱ dөng kiӇu đӏa chӍ
này.
(h nh 2.3 ). 6!B!2+CD'EFGF&'E.B'!CD
H /
BIJ)K%>9 ,ĐӇ ý là 160 thanh ghi vào ra mӣ rӝng ( $0060 - $00FF )
không có 2 kiӇu chӑn đӏa chӍ như trên, đӏa chӍ cӫa chúng chính là các đӏa chӍ SRAM .
u0020
u005F
u0021
u00
u3F
u01
Ñòa
Chæ
Vaøo
Ra
Ñòa
Chæ
SRAM
64
&' 
()*+
()*,
-,.
-(
[ nh 2.3 Vùng nhӟ 64 thanh ghi vào ra có 2 cách chӑn đӏa chӍ
Chi tiӃt vӅ 64 thanh ghi vào ra và 160 thanh ghi vào ra mӣ rӝng có thӇ tìm thҩy ӣ
datasheet cӫa vi điӅu khiӇn ATmega128.
TiӋp ghanh ghi ( register file ) : TiӋp 32 thanh ghi đa chӭc năng ( $0000 - $001F )
đã đưӧc nói ӣ trên, ngoài chӭc năng là các thanh ghi đa chӭc năng, thì các thanh ghi tӯ
R26
tӟi R31 tӯng đôi mӝt tҥo thành các thanh ghi 16 bit X, Y, Z đưӧc dùng làm con trӓ trӓ tӟi
bӝ nhӟ chương trình và bӝ nhӟ dӳ liӋu ( [ nh 2.4 ). Thanh ghi con trò X, Y có thӇ dùng
làm con trӓ trӓ tӟi bӝ nhӟ dӳ liӋu, còn thanh ghi Z có thӇ dùng làm con trӓ trӓ tӟi bӝ nhӟ
chương trình. Các trình biên dӏch C thưӡng dùng các thanh ghi con trӓ này đӇ quҧn lí
Data
stack cӫa chương trình C.
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 9

[ nh 2.4. Chӭc năng con trӓ cӫa các thanh ghi R26 ±R31
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í

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à 4 Kbyte. 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 :
1.| Thanh Ghi EEAR ( EEAR[ và EEARL )

EEAR là thanh ghi 16 bit lưu giӳ đӏa chӍ cӫa các ô nhӟ cӫa EEPROM, thanh ghi
EEAR đưӧc kӃt hӧp tӯ 2 thanh ghi 8 bit là EEARH và thanh ghi EEARL. Vì bӝ nhӟ
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 10
EEPROM cӫa ATmega128 có dung lưӧng 4 Kbyte = 4096 byte = 212 byte nên ta chӍ cҫn
12
bit cӫa thanh ghi EEAR , 4 bit tӯ 15 -12 đưӧc dӵ trӳ, ta nên ghi 0 vào các bit dӵ trӳ này.
2.| Thanh Ghi EEDR

Đây là thanh ghi dӳ liӋu cӫa EEPROM, là nơi chӭa dӳ liӋu ta đӏnh ghi vào hay lҩy
ra tӯ EEPROM.
3.| Thanh Ghi EECR

Đây là thanh ghi điӅu khiӇn EEPROM, ta chӍ sӱ dөng 4 bit đҫu cӫa thanh ghi này, 4
bit cuӕi là dӵ trӳ, ta nên ghi 0 vào các bit dӵ trӳ. Sau đây ta xét chӭc năng cӫa tӯng bit.
@ Bit 3 ± EERIE: EEPROM Ready Interrupt Enable : Đây là bit cho phép
EEPROM ngҳt CPU, khi bit này đưӧc set thành 1 và ngҳt toàn cөc đưӧc cho phép ( bҵng
cách set bit I trong thanh ghi SREG lên 1 ) thì EEPROM sӁ tҥo ra mӝt ngҳt vӟi CPU khi
bit
EEWE đưӧc xóa, điӅu này có nghĩa là khi các ngҳt đưӧc cho phép ( bit I trong thanh ghi
SREG và bit EERIE trong thanh ghi EECR đưӧc set thành 1 ) và quá trình ghi vào ROM
vӯa xong thì sӁ tҥo ra mӝt ngҳt vӟi CPU, chương trình sӁ nhҧy tӟi véc tơ ngҳt có đӏa chӍ

$002C đӇ thӵc thi chương trình phөc vө ngҳt ( ISR ). Khi bit EERIE là 0 thì ngҳt không
đưӧc cho phép.
@ Bit 2 ± EEMWE: EEPROM Master Write Enable : Khi bit EEMWE và bit
EEWE là 1 sӁ ra lӋnh cho CPU ghi dӳ liӋu tӯ thanh ghi EEDR vào EEPROM, đӏa chӍ cӫa
ô
nhӟ cҫn ghi trong EEPROM đưӧc lưu trong thanh ghi EEAR . Khi bit này là 0 thì không
cho phép ghi vào EEPROM. Bit EEMWE sӁ đưӧc xóa bӣi phҫn cӭng sau 4 chu kì máy.
@ Bit 1 ± EEWE: EEPROM Write Enable : Bit này vӯa đóng vai trò như mӝt bit
cӡ, vӯa là bit điӅu khiӇn viӋc ghi dӳ liӋu vào EEPROM. Ӣ vai trò cӫa mӝt bit điӅu khiӇn
nӃu bit EEMWE đã đưӧc set lên 1 thì khi ta set bit EEWE lên 1 sӁ bҳt đҫu quá trình ghi

VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 11
liӋu vào EEPROM. Trong suӕt quá trình ghi dӳ liӋu vào EEPROM bit EEWE luôn giӳ là
1.
Ӣ vai trò cӫa mӝt bit cӡ khi quá trình ghi dӳ liӋu vào EEPROM hoàn tҩt, phҫn cӭng sӁ tӵ
đӝng xóa bit này vӅ 0. Trưӟc khi ghi dӳ liӋu vào EEPROM ta cҫn phҧi biӃt chҳc là không
có quá trình ghi EEPROM nào khác đang xҧy ra, đӇ biӃt đưӧc điӅu này ta cҫn kiӇm tra bit
EEWE. NӃu bit EEWE là 1 tӭc là EEPROM đang đưӧc ghi, ta phҧi chӡ cho cho quá trình
ghi vào EEPROM hoàn tҩt thì mӟi ghi tiӃp. NӃu bit EEWE là 0 tӭc là không có quá trình
ghi EEPROM nào đang diӉn ra, lúc này ta có thӇ bҳt đҫu ghi dӳ liӋu vào EEPROM. Khi
bit
EEWE đưӧc set lên 1 ( bҳt đҫu ghi vào EEPROM ) CPU sӁ tҥm nghӍ trong 2 chu kì máy
trưӟc khi thӵc hiӋn lӋnh kӃ tiӃp.
@ Bit 0 ± EERE: EEPROM Read Enable : Khi bit này là 1, sӁ cho phép đӑc dӳ
liӋu tӯ EEPROM, dӳ liӋu tӯ EEPROM có đӏa chӍ lưu trong thanh ghi EEAR lұp tӭc đưӧc
chuyӇn vào thanh ghi EEDR. Khi bit EERE là 0 thì không cho phép đӑc EEPROM.
Trưӟc
khi đӑc dӳ liӋu tӯ EEPROM ta cҫn biӃt chҳc là không diӉn ra quá trình ghi EEPROM
bҵng
cách kiӇm tra bit EEWE. ĐӇ ý là sau khi quá trình đӑc EEPROM hoàn tҩt, bit EERE sӁ
đưӧc tӵ đӝng xoá bӣi phҫn cӭng. NӃu EEPROM đang đưӧc ghi thì ta không thӇ đӑc đưӧc
dӳ liӋu tӯ EEPROM. Khi bҳt đҫu quá trình đӑc dӳ liӋu tӯ EEPROM, CPU sӁ tҥm nghӍ 4
chu kì máy trưӟc khi thӵc hiӋn lӋnh kӃ tiӃp.
/012#%',,(3 45 6
789 :
1. Chӡ cho bit EEWE vӅ 0.
2. Cҩm tҩt cҧ các ngҳt.
3. Ghi đӏa chӍ vào thanh ghi EEAR.
4. Ghi dӳ liӋu mà ta cҫn ghi vào EEPROM vào thanh ghi EEDR.
5. Set bit EEMWE thành 1.
6. Set bit EEWE thành 1 .
/. Cho phép các ngҳt trӣ lҥi.
NӃu mӝt ngҳt xҧy ra giӳa bưӟc 5 và 6 sӁ làm hӓng quá trình ghi vào EEPROM bӣi
vì bit EEMWE sau khi set lên 1 chӍ đưӧc giӳ trong 4 chu kì máy, chương trình ngҳt sӁ
làm
hӃt thӡi gian ( time out ) duy trì bit này ӣ mӭc 1.
Mӝt ngҳt xuҩt hiӋn ӣ cuӕi bưӟc 4 cũng có thӇ làm cho đӏa chӍ và dӳ liӋu cҫn ghi vào
EEPROM trӣ nên không chính xác nӃu trong chương trình phөc vө ngҳt có chӍnh sӱa lҥi
các thanh ghi EEAR và EEDR. Đó là lí do ta cҫn cҩm các ngҳt trưӟc khi thӵc hiӋn tiӃp
các
bưӟc 3, 4, 5, 6.
Quá trình ghi dӳ liӋu vào EEPROM cũng có thӇ không an toàn nӃu điӋn thӃ nguӗn
nuôi ( Vcc ) quá thҩp.
Đoҥn chương trình sau thӵc hiӋn quá trình ghi dӳ liӋu vào EEPROM.
EEPROM_write:
…LLML#N 
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 12
sbic EECR,EEWE
rjmp EEPROM_write
…1 +O
cli
…CD#!LL 
out EEARH, r18
out EEARL, r1/
…P$B#!LLQ
out EEDR,r16
…FLL/ML!@
sbi EECR,EEMWE
…HLLML9@.ORB#!LL:S/
sbi EECR,EEWE
…T+O=*
sei
ret
—  ;16<,,(3
ViӋc đӑc dӳ liӋu tӯ EEPROM đơn giҧn hơn ghi dӳ liӋu vào EEPROM, đӇ đӑc dӳ
liӋu tӯ EEPROM ta thӵc hiӋn các bưӟc sau:
1. Chӡ cho bit EEWE vӅ 0.
2. Ghi đӏa chӍ vào thanh ghi EEAR.
3. Set bit EERE lên 1.
Đoҥn chương trình sau thӵc hiӋn quá trình đӑc dӳ liӋu tӯ EEPROM.
EEPROM_read:
; LLML#N 
sbic EECR,EEWE
rjmp EEPROM_read
…—'CD#!LL 
out EEARH, r18
out EEARL, r1/
…HLLL.ORB5LL:S/
sbi EECR,EERE
…—'$B#!@U
in r16,EEDR
ret
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 13
Tóm tҳc: Bҧn đӗ bӝ nhӟ bên trong cӫa ATmega128 có thӇ tóm tҳc lҥi như sau:
[ nh 2.5. Tóm tҳc bҧn đӗ bӝ nhӟ ATmega128
II. CӘNG VÀO RA
II.1. GII T[IӊU
Cәng vào ra là mӝt trong sӕ các phương tiӋn đӇ vi điӅu khiӇn giao tiӃp vӟi các
thiӃt bӏ ngoҥi vi. ATmega128 có cҧ thҧy / cәng ( port ) vào ra 8 bit là : PortA, PortB,
PortC, PortD, PortE, PortF, PortG, tương ӭng vӟi 56 đưӡng vào ra. Các cәng vào ra cӫa
AVR là cәng vào ra hai chiӅu có thӇ đӏnh hưӟng, tӭc có thӇ chӑn hưӟng cӫa cәng là
hưӟng
vào (input ) hay hưӟng ra (output ). Tҩt các các cәng vào ra cӫa AVR điӅu có tính năng
Đӑc ± ChӍnh sӱa ± Ghi ( Read ± Modify ± write ) khi sӱ dөng chúng như là các cәng vào
ra
sӕ thông thưӡng. ĐiӅu này có nghĩa là khi ta thay đәi hưӟng cӫa mӝt chân nào đó thì nó
không làm ҧnh hưӣng tӟi hưӟng cӫa các chân khác. Tҩt cҧ các chân cӫa các cәng ( port )
Boä nhôù chöông tr nh
16 Bit
128 Kbyte
32 Thanh Ghi
64 Thanh ghi I/O
160 Thanh ghi
I/O môû roäng
4 Kbyte
SRAM noäi
8 Bit
u0000
uFFFF
Boä nhôù döõ lieäu
u0000
u10FF
4 Kbyte
8 Bit
Boä nhôù EEPROM
u000
uFFF
Baûn ñoà boä nhôù ATmega128
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 14
điӅu có điӋn trӣ kéo lên ( pull-up ) riêng, ta có thӇ cho phép hay không cho phép điӋn trӣ
kéo lên này hoҥt đӝng.
—iӋn trӣ kéo lên là mӝt điӋn trӣ đưӧc dùng khi thiӃt kӃ các mҥch điӋn tӱ logic. Nó
có mӝt đҫu đưӧc nӕi vӟi nguӗn điӋn áp dương (thưӡng là Vcc hoһc Vdd) và đҫu còn lҥi
đưӧc nӕi vӟi tín hiӋu lӕi vào/ra cӫa mӝt mҥch logic chӭc năng. ĐiӋn trӣ kéo lên có thӇ
đưӧc lҳp đһt tҥi các lӕi vào cӫa các khӕi mҥch logic đӇ thiӃt lұp mӭc logic lӕi vào cӫa
khӕi
mҥch khi không có thiӃt bӏ ngoài nӕi vӟi lӕi vào. ĐiӋn trӣ kéo lên cũng có thӇ đưӧc lҳp
đһt
tҥi các giao diӋn giӳa hai khӕi mҥch logic không cùng loҥi logic, đһc biӋt là khi hai khӕi
mҥch này đưӧc cҩp nguӗn khác nhau. Ngoài ra, điӋn trӣ kéo lên còn đưӧc lҳp đһt tҥi lӕi
ra
cӫa khӕi mҥch khi lӕi ra không thӇ nӕi nguӗn đӇ tҥo dòng, ví dө các linh kiӋn logic TTL

cӵc góp hӣ. Đӕi vӟi hӑ logic lưӥng cӵc vӟi nguӗn nuôi 5 Vdc thì giá trӏ cӫa điӋn trӣ kéo
lên thưӡng nҵm trong khoҧng 1000 đӃn 5000 Ohm, tùy theo yêu cҫu cҩp dòng trên toàn
giҧi hoҥt đӝng cӫa mҥch. Vӟi lôgíc CMOS và lôgíc MOS chúng ta có thӇ sӱ dөng các
điӋn
trӣ có giá trӏ lӟn hơn nhiӅu, thưӡng tӯ vài ngàn đӃn mӝt triӋu Ohm do dòng rò rӍ cҫn thiӃt
ӣ
lӕi vào là rҩt nhӓ. Trong viӋc thiӃt kӃ các vi mҥch ӭng dөng, nӃu mӝt IC có ngõ ra loҥi
cӵc
thu đӇ hӣ giao tiӃp vӟi nhiӅu IC khác thì giá trӏ cӫa điӋn trӣ kéo lên sӁ tương đӕi nhӓ
(khoҧng vài trăm Ohm). Bӣi vì lúc này hӋ sӕ fanout lӟn dүn đӃn dòng ngõ ra cӫa IC phҧi
lӟn đӇ đӫ cung cҩp cho các ngõ vào cӫa các IC khác, nӃu không vi mҥch sӁ hoҥt đӝng
chұp
chӡn hoһc có thӇ không hoҥt đӝ__________ng.
II.2. CÁC[ [OҤT —ӜNG :
Khi khҧo sát các cәng như là các cәng vào ra sӕ thông thưӡng thì tính chҩt cӫa các
cәng ( PortA, PortB,«PortG ) là tương tӵ nhau, nên ta chӍ cҫn khҧo sát mӝt cәng nào đó
trong sӕ / cәng cӫa vi điӅu khiӇn là đӫ.
Mӛi mӝt cәng vào ra cӫa vi điӅu khiӇn đưӧc liên kӃt vӟi 3 thanh ghi : PORTx,
DDRx, PINx. ( ӣ đây x là đӇ thay thӃ cho A, B,«G ). Ba thanh ghi này sӁ đưӧc phӕi hӧp
vӟi nhau đӇ điӅu khiӇn hoҥt đӝng cӫa cәng, chҷn hҥn thiӃt lұp cәng thành lӕi vào có sӱ
dөng điӋn trӣ pull-up, ..v.v.. . Sau đây là diӉn tҧ cө thӇ vai trò cӫa 3 thanh ghi trên.
a. Thanh Ghi DDRx.
Đây là thanh ghi 8 bit ( có thӇ đӑc ghi ) có chӭc năng điӅu khiӇn hưӟng cӫa cәng
(là lӕi ra hay lӕi vào ). Khi mӝt bit cӫa thanh ghi này đưӧc set lên 1 thì chân tương ӭng
vӟi
nó đưӧc cҩu hình thành ngõ ra. Ngưӧc lҥi, nӃu bit cӫa thanh ghi DDRx là 0 thì chân
tương
ӭng vӟi nó đưӧc thiӃt lұp thành ngõ vào. Lҩy ví dө: Khi ta set tҩt cҧ 8 bit cӫa thanh ghi
DDRA đӅu là 1, thì 8 chân tương ӭng cӫa portA là PA1, PA2, « PA/ ( tương ӭng vӟi
các
chân sӕ 50, 49, «44 cӫa vi điӅu khiӇn ) đưӧc thiӃt lұp thành ngõ ra.
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 15
6QQ 
b. Thanh Ghi PORTx.
PORTx là thanh ghi 8 bit có thӇ đӑc ghi. Đây là thanh ghi dӳ liӋu cӫa PORTx, NӃu
thanh ghi DDRx thiӃt lұp cәng là lӕi ra, khi đó giá trӏ cӫa thanh ghi PORTx cũng là giá trӏ
cӫa các chân tương ӭng cӫa PORTx, nói cách khác, khi ta ghi mӝt giá trӏ logic lên 1 bit
cӫa
thanh ghi này thì chân tương ӭng vӟi bit đó cũng có cùng mӭc logic. Khi thanh ghi
DDRx
thiӃt lұp cәng thành lӕi vào thì thanh ghi PORTx đóng vai trò như mӝt thanh ghi điӅu
khiӇn
cәng. Cө thӅ , nӃu mӝt bit cӫa thanh ghi này đưӧc ghi thành 1 thì điӋn trӣ treo ( pull-up
resistor ) ӣ chân tương ӭng vӟi nó sӁ đưӧc kích hoҥt, ngưӧc lҥi nӃu bit đưӧc ghi thành 0
thì
điӋn trӣ treo ӣ chân tương ӭng sӁ không đưӧc kích hoҥt, cәng ӣ trҥng thái cao trӣ ( Hi-Z
).
6:S6 
c. Thanh Ghi PINx.
PINx không phҧi là mӝt thanh ghi thӵc sӵ, đây là đӏa chӍ trong bӝ nhӟ I/O kӃt nӕi
trӵc tiӃp tӟi các chân cӫa cәng. Khi ta đӑc PORTx tӭc ta đӑc dӳ liӋu đưӧc chӕt trong
PORTx, còn khi đӑc PINx thì giá trӏ logic hiӋn thӡi ӣ chân cӫa cәng tương ӭng đưӧc đӑc.
Vì thӃ đӕi vӟi thanh ghi PINx ta chӍ có thӇ đӑc mà không thӇ ghi. Bҧng 25 thӇ hiӋn các
các
thiӃt lұp cách hoҥt có thӇ có cӫa cәng.
6:V8 
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 16
DDRxn PORTxn PUD ( Trong
thanh ghi SFIOR
I/O Pull-up Chú thích
0 0 x Ngõ vào không Cao trӣ
0 1 0 Ngõ vào có Như mӝt nguӗn dòng
0 1 1 Ngõ vào không Cao trӣ
1 0 x Ngõ ra không Ngõ ra thҩp
1 1 x Ngõ ra không Ngõ ra cao
Bҧng 25. Cҩu h nh cho các chân cәng
QQW!XYQQW
:S6W!XY:S6W
Q1BZxÇ*=XA.D+C![2\
[ nh 30. Sơ đӗ mӝt cәng vào ra
VI ĐIӄU KHIӆN AVR ± ATmega 128 Lê Trung Thҳng
—343567896:,3;-%/< 1/
[ nh 30 thӇ hiӋn sơ đӗ cӫa mӝt chân cӫa cәng vào ra. Ӣ sơ đӗ trên ta thҩy ngoài 2
bit cӫa các thanh ghi DDRx và PORTx tham gia điӅu khiӇn điӋn trӣ treo (pull-up resistor
),
còn có mӝt tín hiӋu nӳa điӅu khiӇn điӋn trӣ treo, đó là tín hiӋu PUD, đây là bit nҵm trong
thanh ghi SFIOR, khi set bit này thành 1 thì điӋn trӣ kéo lên sӁ không đưӧc cho phép bҩt
kӇ các thiӃt lұp cӫa các thanh ghi DDRx và PORTx. Khi bit này là 0 thì điӋn trӣ kéo lên
đưӧc cho phép nӃu { DDRxn, PORTxn } = { 0, 1 } .
6H]VS
Dưӟi đây là đӏa chӍ cӫa tҩt cҧ các port :

You might also like