Professional Documents
Culture Documents
[ 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í
bӝ
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Ӎ
là
$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
dӳ
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#%',,(3456
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ӵ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 :