You are on page 1of 158

CHƯƠNG 1. KỸ THUẬT GHÉP NỐI MÁY TÍNH........................... ....................

3
1.1. Phương pháp truyền dữ liệu..................................................................... .....3
1.2. Giao tiếp qua Slot Card................................................. ...............................9
1.3. Cổng song song(LPT)................................................................................ ...9
1.4. Giới thiệu về truyền thông qua chuẩn RS232.............................................12
1.5. Giới thiệu về truyền thông qua chuẩn RS-485............................... .............16
CHƯƠNG 2. TỔNG QUAN VỀ VI ĐIỀU KHIỂN..............................................22
2.1. Giới Thiệu Họ Vi Điều Khiển MCS – 51 :.................................................22
2.2. Tổng quan về vi điều khiển AVR................................................. ...............25
2.2.1. Giới thiệu tổng quan họ vi điều khiển AVR.........................................25
2.2.2. Kiến trúc AVR. .................................................................... ....26
2.2.3. Bộ nhớ EEPROM......................................................... .......................56
2.2.4. Bộ nhớ SRAM.................................................................... .................61
2.2.5. Bộ định thời.......................................................................... ...............63
2.2.6. Bộ truyền nhận UART......................................................... ................66
2.2.7. Cấu trúc ngắt....................................................................................... .70
2.2.8. Bộ so sánh Analog........................................................... ....................74
2.2.9. Bộ biến đổi A/D bên trong....................................................... ............75
2.2.10. Bộ định thời Watchdog bên trong.............................. ........................77
2.2.11.Chế độ hoạt động tiết kiệm năng lượng..............................................78
CHƯƠNG 3.......................................................................... ................................80
CÁC LINH KIỆN SỬ DỤNG TRONG MẠCH.............................................. ......80
3.1. C1815.................................................................................... .....................80
3.2. A1015.................................................................................... .....................80
3.3. IC 74HC14.................................................................... .............................81
3.4. OPTO P521.................................................................... ............................82
3.5. Rơle cuộn hút.............................................................. ...............................82
3.6. MAX232................................................................................................... ..83
3.7. MAX485................................................................................................... ..84
3.8. ATMEGA16................................................................................................ 85
3.9.ATMEGA88. .................................................... ................................86
3.10. ATTINY 2313............................................................................ ...............87
3.11. IRF 540........................................................................................... ..........88
3.12. LM 7805..................................................................................... ..............89
CHƯƠNG 4.......................................................................... ................................90
GIỚI THIỆU MỘT SỐ PHẦN MỀM ĐÃ SỬ DỤNG..........................................90
4.1. Giới thiệu phần mềm thiết kế mạch OrCad 10.......................................... ..90
4.2. Giới thiệu phần mềm Visual C++......................................... ......................96
4.3. Phần mềm lập trình cho vi điều khiển :CODEVISION AVR....................103
CHƯƠNG 5................................................................................................ .........111
THIẾT KẾ MẠCH ĐIỀU KHIỂN............................................................. ..........111
5.1. Nhiệm vụ thiết kế................................................................................. .....111
5.2. Sơ đồ và chức năng từng khối............................................................ .......111
Đồ án tốt nghiệp Cơ điện tử 3 - K47

5.3. Thiết kế và phân tích hoạt động từng khối................................... .............112


5.3.1. Khối máy tính PC................................................. .............................112
5.3.2. Chuyển đổi RS232-RS485................................................... ..............112
5.3.3. Khối vi điều khiển............................................................................. .117
5.3.4. Khối mạch công suất....................................................................... ...118
5.3.5. Khối nguồn cho hệ thống........................................................... ........123
CHƯƠNG 6. ....................................................................................................... 124
LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG...................................................... ......124
6.1. Thiết kế giao diện............................................................. ........................124
6.1.1. Sử dụng thư viện Serial..................................... ................................124
6.1.2. Thuật toán nội suy........................................................................ ......125
6.1.3. Chương trình điều khiển hệ thống.....................................................135

2
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CHƯƠNG 1. KỸ THUẬT GHÉP NỐI MÁY TÍNH

Kỹ thuật truyền tải thông tin trong hệ thống CIM và robot với máy tính
được truyền qua chuẩn RS-485 ( qua chuyển đổi RS-232 → RS485 ) nên trong
mục này ta sẽ trình bày các phương pháp truyền thông trong các mạng công
nghiệp.

1.1. Phương pháp truyền dữ liệu.


Truyền dữ liệu nối tiếp, không đồng bộ là phương pháp được sử dụng chủ
yếu trong các hệ thống mạng truyền thông công nghiệp. Với phương pháp này, các
bit được truyền từ bên gửi tới bên nhận một cách tuần tự trên cùng một đường
truyền. Cũng chính vì không có một đường dây riêng biệt mang tín hiệu nhịp, nên
việc động bộ hoá thuộc trách nhiệm do bên gửi và bên nhận thoả thuận trên cơ sở
một giao thức truyền thông.
Các chuẩn truyền dẫn TIA/EIA
EIA ( Eelectronic Industry Association ) và TIA ( Telecommunication
Industry Association ) là các hiệp hội đã xây dựng và phát triển một sô chuẩn giao
diện cho truyền thông công nghiệp, trong đó có các chuẩn truyền dẫn nối tiếp.
Theo nghĩa truyền thống, một chuẩn truyền dẫn nối tiếp trước hết được hiểu là các
quy định được thống nhất về giao diện vật lý giữa các thiết bị cuối xử lý dữ liệu
( Data Terminal Equipment, DTE ) và các thiết bị truyển dữ liệu ( Data
Communication Equipment, DCE ). Một ví dụ tiêu biểu của giao diện DTE/DCE
là chuẩn RS-232 giữa máy tính và modem. Tuy vậy, phạn vi sử dụng các chuẩn
truyền nối tiếp không chỉ hạn chế ở việc kết nối giữa các DTE và DCE theo nghĩa
cổ điển.
Các chuẩn truyền thông nối tiếp được sử dụng rộng rãi trong truyền thông
công nghiệp là EIA/TIA-232, EIA/TIA-422 và đặc biệt là EIA/TIA-485. Các
chuẩn truyền dẫn của EIA/TIA được chia thành 3 phạm trù sau:
• Các chuẩn giao tiếp chọn vẹn ( complete Interface Standards ) như
EIA/TIA-232-F, EIA/TIA-530-A, EIA/TIA-561, đưa ra toàn bộ các
qui định về mặt chức năng, về mặt điện học và về mặt cơ học.
• Các chuẩn riêng về điện học ( Electrical Only Standard ) như
EIA/TIA-232-F, EIA/TIA-422-B, EIA/TIA-485-A, chỉ định nghĩa
thông số về mặt điện học.
• Các chuẩn về chất lượng tín hiệu ( Signal Quality Standard ) như
EIA/TIA-334-A, EIA/TIA-363 , EIA/TIA-404-A, định nghĩa các
thuật ngữ và phương pháp cho việc đánh giá chất lượng tín hiệu.

3
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Phương thức truyền dẫn tín hiệu:


Tín hiệu được dùng để truyền tải thông tin. Không kể tới môi trường truyền
dẫn thì các thành phần cơ bản trong một hệ thống truyền tín hiệu gồm có bộ phát
( transmitter generator ) hay còn gọi là bộ kích thích ( driver, ký hiệu là D ) và bộ
thu ( receiver, ký hiệu là R ). Một thiết bị vừa thu và phát hay bộ thu phát được
gọi là transceiver.
Hai phương thức truyền dẫn tín hiệu cơ bản được dùng trong các hệ thống
truyền thông công nghiệp đó là phương thức truyền chênh lệch đối xứng (balanced
diferential mode ) và phương thức truyền không đối xứng hay phương thức đơn
cực ( unbalanced mode, singe ended mode ).
Truyền dẫn không đối xứng:
Truyền dẫn không đối xứng sử dụng điện áp của một dây dẫn so với đất để
thể hiện trạng thái logic 1 và 0 của tín hiệu số. Chú ý rằng sự liên quan giữa trạng
thái logic của một tín hiệu với trạng thái logic của dãy bit mang thông tin được
truyền phụ thuộc vào phưong pháp mã hoá bit, tức là giá trị logic của tín hiệu tại
một thời điểm không nhất thiết phải đồng nhất với giá trị logic của bit tương
đương mang thông tin.
Một trong những ưu điểm của phương thức truyền dẫn không đối xứng là
chỉ cần một đường dây đất chung cho nhiều kênh tín hiệu trong trường hợp cần
thiết. Nhờ vậy tiết kiệm được số lượng dây dẫn và các linh kiện ghép nối.

Truyền dẫn không đối xứng ( 3 kênh, 4 dây ).


Việc sử dụng đất là điểm tựa cho việc đánh giá mức tín hiệu bộc lộ một
nhược điểm cơ bản là khả năng chống nhiễu kém. Nguyên nhân gây nhiễu ở đây
có thểlà môi trường xung quanh, sự xuyên âm ( crosstalk ) hoặc do chênh lệch
điện áp đất của các đối tác truyền thông. Điều này cũng dẫn đến sự hạn chế về
chiều dài dây dẫn cũng như tốc độ truyền.
Truyền dẫn chênh lệch đối xứng:

4
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Truyền dẫn chênh lệch đối xứng sử dụng điện áp giữa hai dây dẫn ( A và B
hay dây - và dây + ) để biểu diễn trạng thái logic 1 và 0 của tín hiệu, không phụ
thuộc vào đất.
Khái niệm " chênh lệch đối xứng " ở đây được thể hiện qua sự cân xứng
( tương đối ) về mặt điện áp của hai dây A và B đối với điện áp chế độ chung trong
điều kiện làm việc bình thường. Một tác động nhiễu ở bên ngoài sẽ làm tăng hay
giảm tức thời điện áp ở cả hai dây một giá trị gần tương đương nhau, vì thế tín
hiệu sẽ ít bị sai lệch. Sự khác nhau về điện áp đất giữa các thiết bị tham gia truyền
thông cũng hầu như không ảnh hưởng trực tiếp đến việc đánh giá giá trị logic của
tín hiệu. Một nguyên nhân gây nhiễu khác là sự xuyên âm cũng được loại trừ
đáng kể khi dùng đôi dây xoắn ( twisted pair ). Những ưu điểm trên đây dẫn đến
sự phổ biến của phương thức truyền dẫn chênh lệch đối xứng trong các hệ thống
tốc độ cao và phạm vi rộng.

Truyền dẫn chênh lệch đối xứng ( 3 kênh, 7 dây ).

5
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Bốn thông số sau đây chiếm vai trò quan trọng trong phương thức truyền
dẫn chênh lệch đối xứng:
• VOD: điện áp chênh lệch đầu ra của bộ kích thích qua trở đầu cuối
( giữa hai dây A và B ), còn được gọi là điện áp đầu cuối ( termination
voltage ) VT. VOD không phụ thuộc vào điện áp của đất. Theo chuẩn qui
định thì VOD tối thiều bằng 1,5V tại đầu ra của bộ kích thích. Dọc theo
đường dây dài, điện áp này sẽ bị suy giảm bởi điện trở DC hoặc bị sai
lệch do nhiễu, tuy nhiên bộ thu chỉ cần mức 200mV để có thể xác định
trạng thái logic của tín hiệu.
• VOS: điện áp dịch của bộ kích thích ( driver's offset voltage ), còn được
gọi là điện áp chế độ chung đầu ra V OC ( output common mode
voltage ). Nó được xác định bằng chênh lệch từ điểm giữa của tải đầu
ra so sánh với đất của bộ kích thích. VOC liên quan trực tiếp đến điện áp
chế độ chung VCM ( common mode voltage ).
• VCM: điện áp chế độ chung, được tính bằng giá trị trung bình của điện
áp hai dây, tức là VA và VB, có kể tới nhiễu và chênh lệch điện áp đất.
VCM cũng được tính như sau:
VCM = VOS + Vnoise + VGPD

• VGPD: chênh lệch điện áp đất ( groud-potential difference ) giữa các


trạm trong một hệ thống. Giới hạn cho giá trị này được qui định cụ thể
trong mỗi chuẩn.
Trở đầu cuối:

6
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Thông thường một tín hiệu được phát đi khi tới một đầu dây sẽ phản xạ
ngược trở lại, giống như hiện tượng phản xạ ánh sáng. Khi tốc độ truyền tương đối
thấp hoặc dây dẫn tương đối ngắn, sao cho thời gian bit TB lớn hơn gấp nhiều lần
so với thời gian lan truyền tín hiệu TS, tín hiệu phản xạ sẽ suy giảm và triệt tiêu
sau một vài lần qua lại, không gây ảnh hưởng tới chất lượng của tín hiệu mang bit
dữ liệu được phát tiếp theo. Trong trường hợp khác sẽ xảy ra xung đột tín hiệu, vì
vậy người ta dùng một trở kết thúc, hay trở đầu cuối để hấp thụ tín hiệu ban đầu. Ý
tưởng ở đây là khi một đường dây dẫn dài vô hạn thì sẽ không xảy ra hiện tượng
phản xạ tín hiệu. Vì vậy, trở đầu cuối được chọn có giá trị tương đương với trở
kháng đặc trưng ( trở kháng sóng ) của cáp truyền.
Để giao tiếp với máy tính ta có thể sử dụng các cách :
+ Ghép nối theo chuẩn của máy in ( cổng LPT )
+ Ghép nối theo cổng nối tiếp ( cổng COM )
+ Ghép nối bằng cổng USB
+ Ghép nối bằng các giao tiếp …
Trong các cách trên mỗi cách đều có những ưu điểm riêng. Với giao tiếp
cổng USB sẽ cho tốc độ cao nhưng việc sử dụng cổng USB rất khó. Mạch ngoài
cần một IC chuyên dụng làm nhiệm vụ giao tiếp , phía trong máy tính phải viết
phương thức giao tiếp riêng cho cổng. Với những giao tiếp ngoại vi đơn giản cổng
USB không thích hợp.
Giao tiếp thông qua card giao tiếp , các giao tiếp là một card cắm vào rãnh
cắm mở rộng trong máy tính , cho phép mở rộng giao tiếp về số cổng. Nhưng để
thực hiện cần phải mua các giao tiếp với chi phí không rẻ .
Giao tiếp bằng cổng song song ( cổng LPT ) hay cổng máy in. Giao tiếp
cổng song song có ưu điểm là tốc độ nhanh, truyền nhận từng Byte một ( 8 Bit ).
Nhưng có nhược điểm là không truyền được xa , dễ nhiều . Là một cổng chuẩn
trên máy PC có nhiều hỗ trợ về giao tiếp , cách sử dụng đơn giản . Để điều khiển
các thiết bị ngoại vi cổng song song cũng được dùng rất phổ biến.
Giao tiếp qua cổng nối tiếp , cách giao tiếp này rất hay được sử dụng trong
giao tiếp với thiết bị ngoại vi. Ưu điểm của cách này là đơn giản , dễ sử dụng,
truyền được khoảng cách xa, ít nhiễu, là một giao tiếp chuẩn được hầu hết các họ
Vi Điều Khiển hỗ trợ. Nhược điểm của cách này là tốc độ chậm, Vi Điều Khiển
tốn tài nguyên để hoạt động cổng nối tiếp.

7
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Trong đồ án này chúng em chọn cổng nối tiếp RS232-RS485 để thực hiện
giao tiếp giữa máy tính PC với mạch ngoài.

8
Đồ án tốt nghiệp Cơ điện tử 3 - K47

1.2. Giao tiếp qua Slot Card.


Trong máy tính người ta chế tạo sẵn các slot cho phép người sử dụng tính
năng của máy tính bằng cách gắn các thiết bị vào đó .
Mỗi slot đều có các đường dữ liệu ( data ), địa chỉ ( address ), các đường
+5v, -5v, +12v, -12v và các đường điều khiển như CLK, IRQ, RESET, IOW,
IOR… vì vậy nếu thiết kế mạch giao tiếp qua slot sẽ giảm được nhiều linh
kiện,giảm được bộ nguồn bên ngoài ,dễ điều khiển ,giá thành thấp ,tốc độ truyền
dữ liệu nhanh.
Tuy nhiên bên cạnh những ưu điểm thì giao tiếp qua slot cũng có những
nhược điểm. Do SlotCard gắn bên trong máy tính nên cách giao tiếp này khó có
thể nhận dữ liệu từ bên ngoài vào,và cũng bị hạn chế về khoảng cách làm việc
đồng thời mỗi khi sử dụng đều phải mở máy tính gây bất tiện cho người sử dụng.
Các rãnh cắm trong máy tính PC:
Trên máy tính PC/XT rãnh cắm trong máy tính chỉ có một loại có độ rộng
8 bit và tuân theo tiêu chuẩn ISA (Industry Standard Architecture).
Từ máy tính AT trở đi việc bố trí chân trên rãnh cắm phức tạp hơn,tuỳ theo
tiêu chuẩn khi chọn máy tính các loại rãnh cắm theo tiêu chuẩn khác nhau có thể
được kiểm tra như sau;
- Rãnh cắm 16 bit theo tiêu chuẩn ISA (Industry Standard Architecture).
- Rãnh cắm PS/2 16 bit theo tiêu chuẩn MCA(Micro ChannelArchitecture).
- Rãnh cắm PS/2 32 bit theo tiêu chuẩn MCA.
- Rãnh cắm PC/2 32 bit theo tiêu chuẩn EISA (Extended Micro Channel
Architecture).
- Rãnh cắm 32 bit theo tiêu chuẩn VESA.
- Rãnh cắm 32 bit theo tiêu chuẩn PCI.

Cho đến nay các card dùng để giao tiếp với máy tính đều tuân theo tiêu
chuẩn ISA

1.3. Cổng song song(LPT)


Sơ đồ chân của giắc cắm 25 chân :

9
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Các đường trong giắc cắm 25 chân được chia thành 3 nhóm :
- Các đường dữ liệu ( Data lines )
- Các đường điều khiển ( Control lines )
- Các đường trạng thái ( Status lines )
Như tên mô tả, dữ liệu được chuyền qua những đường dữ liệu, đường điều
khiển được sử dụng để điều khiển ngoại vi và tất nhiên, ngoại vi trả lại tình trạng
báo hiệu máy tính sau khi chuyền qua đường Trạng thái. Những đường này được
nối tới Dữ liệu, những thanh ghi Điều khiển và Trạng thái nội tại.

Thanh ghi cổng song song.


Dữ liệu, những đường Điều khiển và Trạng thái được nối tới các thanh ghi
tương ứng bên trong máy tính. Như vậy bằng cách sử dụng các thanh ghi trong
chương trình ta có thể dễ dàng đọc hoặc ghi cho cổng song song bằng những ngôn
ngữ lập trình như ' C ' và Basic
Những thanh ghi trong cổng song song chuẩn,
1) Thanh ghi dữ liệu
Thanh ghi dữ liệu là một byte Data từ D0 – D7 có địa chỉ chân tương ứng
từ chân số 2 đến chân số 9 của cổng.

10
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2) Thanh ghi Trạng thái

3) Thanh ghi Điều khiển

Với các tên đã chỉ rõ, thanh ghi Dữ liệu được nối tới những đường Dữ liệu,
thanh ghi Điều khiển được nối tới những đường Điều khiển và thanh ghi Trạng
thái được nối tới những đường Trạng thái. Những gì ta ghi vào các thanh ghi sẽ
xuất hiện giá trị tại đường tương ứng.
Trong máy PC IBM, những thanh ghi này là “IO map” và sẽ có địa chỉ duy
nhất. Chúng ta phải tìm những địa chỉ đó để có thể làm việc với cổng song song.
Với một PC tiêu biểu, địa chỉ cơ sở của LPT1 là 0 x378 và LPT2 là 0 x278. Thanh
ghi Dữ liệu tại địa chỉ cơ sỏ này, thanh ghi Trạng thái ở địa chỉ cơ sở + 1 và thanh
ghi Điều khiển ở địa chỉ cơ sở + 2. Mỗi cổng có một địa chỉ cơ sở, chúng ta có thể
tính toán địa chỉ của những thanh ghi trong trường hợp này. Địa chỉ các thanh ghi
của LPT1 và LPT2 :

Register
LPT1
LPT2
data registar(baseaddress + 0)
0x378
0x278
status register (baseaddress + 1)
0x379
0x279
control register (baseaddress + 2)
0x37a

11
Đồ án tốt nghiệp Cơ điện tử 3 - K47

x27a
Lập trình giao tiếp với cổng song song.
Hầu hết các ngôn ngữ lập trình đều cung cấp cho chúng ta các lệnh để giao
tiếp với cổng song song như : Borland C cung cấp "Inportb" và "Outportb” ,
Visual C++ cung cáp các hàm '_inp' cho đọc và '_outp' cho xuất dữ liệu. Nhưng
các hàm này chỉ hoạt động tốt trên môi trường DOS , Win98,Me nhưng không thể
hoạt động được trên WinXP.
Để có thể thực hiện giao tiếp trên tất cả các môi trường ta sử dụng một thư
viện Inpout32.dll được cung cấp miễn phí trên trang web :
http://www.logix4u.net/parallelport1.htm.

1.4. Giới thiệu về truyền thông qua chuẩn RS232.


RS-232 lúc đầu được xây dựng phục vụ chủ yếu trong việc ghép nối điểm-
điểm giứa hai thiết bị đầu cuối ( DTE, Data Terminal Equipment ), như giữa hai
máy tính ) PC, PLC ...), giữa máy tính và máy in, hoặc giữa một thiết bị đầu cuối
và một thiết bị truyền dữ liệu ( DCE, Data Communication Equipment ).
Mặc dù tính năng hạn chế, RS-232 là một trong các chuẩn tín hiệu có từ lâu
nhất, vì thế được sử dụng rất rộng rãi. Ngày nay, mỗi máy tính cá nhân đều có một
vài cổng RS-232 ( cổng COM ), có thể sử dụng tự do để nối với các thiết bị ngoại
vi hoặc với các máy tính khác. Nhiều thiết bị công nghiệp cũng tích hợp cổng RS-
232 phục vụ lập trình hoặc tham số hoá.
- Đặc tính điện học: RS-232 sử dụng phương thức truyền thông đối xứng,
tức là sử dụng tín hiệu điện áp chênh lệch giữa một dây dẫn và đất. Mức điện áp
được sử dụng dao động trong khoảng từ -15V đến 15V. Khoảng từ 3V đến 15V
ứng với giá trị logic 0, khoảng từ -15V đến -3V ứng với mức giá trị logic 1.
Chính vì khoảng từ -3V đến 3V là phạm vi không được định nghĩa, trong
trường hợp thay đổi giá trị logic từ 0 lên 1 hoặc từ 1 xuống 0 một tín hiệu phải
vượt qua khoảng quá độ đó trong một thời gian ngắn hợp lý. Ví dụ, theo tiêu
chuẩn DIN 66259 phần 2 qui định độ dốc tối thiểu của một tín hiệu phải là 6V/ms
hoặc 3% nhịp xung, tuỳ theo giá trị nào nhỏ hơn. Điều này dẫn đến việc phải hạn
chế về điện dung của các thiết bị tham gia và của cả đường truyền.

12
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Quy định trạng thái logic của tín hiệu RS-232.


Tốc độ truyền dẫn tối đa phụ thuộc vào chiều dài dây dẫn. Đa số các hệ
thống hiện nay chỉ hỗ trợ tới tốc độ 19,2kBd ( chiều dài cho phép 30-50m ). Gần
đây, sự tiến bộ của vi mạch đã góp phần nâng cao tốc độ của các modem lên nhiều
lần so với ngưỡng 19,2kBd. Hiện nay đã có những mạch thu phát đạt tốc độ
460kBd và hơn nữa. Tuy nhiên tốc độ truyền dẫn thực tế lớn hơn 115,2 kBd theo
tiêu chuẩn RS-232 trong một hệ thống làm việc dựa vào ngắt là một điều khó có
thể thực hiện.
Một ưu điểm của chuẩn RS-232 là có thể sử dụng công suất phát tương đối
thấp, nhờ trở kháng đầu vào hạn chế trong phạm vi từ 3-7kΩ.
Một số thông sô điện học quan trọng của RS-232:

Thông số Điều kiện Min Max

Điện áp đầu ra hở mạch 25V

Điện áp đầu ra khi có tải. 3kΩ < RL < 7kΩ 5V 15

Trở kháng đầu ra khi cắt nguồn -2V < V0 < 2V 300Ω

Dòng ra ngắn mạch 500mA

Điện dung tải 2500pF

Trở kháng đầu vào 3V < VL < 25V 3kΩ 7kΩ

Ngưỡng cho giá trị logic 0 3V

Ngưỡng cho giá trị logic 1 -3V

- Giao diện cơ học: chuẩn EIA/TIA-232F qui định ba loại giắc cắm RS-232
là DB-9 ( 9 chân ), DB-25 ( 25 chân ) và ALT-A ( 26 chân ), trong đó hai loại đầu

13
Đồ án tốt nghiệp Cơ điện tử 3 - K47

được sử dụng rỗng rãi hơn. Loại DB-9 cũng đã được chuẩn hóa riêng trong
EIA/TIA-574.
Ý nghĩa của các chân quan trọng được mô tả dưới đây:
• RxD ( receive data ): đường nhân dữ liệu.
• TxD ( transmit data ): đường gửi dữ liệu.
• DTR ( Data terminal ready ): chân DTR thường ở trạng thái On khi thiết
bị đầu cuối sẵn sàng thiết lập kênh truyền thông. Qua việc giữ mạch
DTR ở trạng thái ON, thiết bị đầu cuối cho phép DCE của nó ở chế độ "
tự trả lời "chấp nhận lời gọi không yêu cầu. Mạch DTR ở trạng thái OFF
chỉ khi thiết bị đầu cuối không muốn DCE của nó chấp nhận lời gọi tử
xa ( chế độ cục bộ ).
• DSR ( data set ready, DCE ready ): cả hai modem chuyển mạch DSR
sang ON khi một đường truyền thông đã được thiết lập giữa hai bên.
• DCD ( data carrier detect ): chận DCD được sử dụng để kiểm soát truy
nhập đường truyền. Một trạm nhận tín hiệu DCD là OFF sẽ hiểu là trạm
đối tác chưa đóng mạch yêu cầu gửi dữ liệu ( chân RTS ) và vì thế có
thể đoạt quyền kiểm soát đường truyền nếu cần thiết. Ngược lại, tín hiệu
DCD là ON chỉ thị bên đối tác đã gửi tín hiệu RTS và giành quyền kiểm
soát đường truyền.
• RTS ( request to send ): đường RTS kiểm soát chiều truyền dữ liệu. Khi
một trạm cần gửi dữ liệu, nó đóng mạch RTS sang ON để báo hiệu với
modem của nó. Thông tin này cũng được chuyển tiếp tới modem xa.
• CTS ( clear to send ): khi CTS chuyển sang ON, một trạm được thông
báo rằng modem của nó đã sẵn sàng nhận dữ liệu từ trạm và kiểm soát
đường điện thoại cho việc truyền dữ liệu đi xa.
• RI ( ring indicator ): khi modem nhận được một lời gọi, mạch RI chuyển
ON/OFF một cách tuần tự với chuông điện thoại để báo hiệu cho trạm
đầu cuối. Tín hiệu này chỉ thị rằng một modem xa yêu cầu thiết lập liên
kết dial-up.

14
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Sơ đồ giắc cắm và chiều tín hiệu RS-232 loại DB-9

- Chế độ làm việc: chế độ làm việc của hệ thống RS-232 là hai chiều toàn
phần ( full-duplex ), tức là hai thiết bị tham gia cùng có thể thu và phát tín hiệu
cùng một lúc. Như vậy, việc thực hiện truyền thông cần tối thiểu 3 dây dẫn - trong
đó hai dây tín hiệu nối chéo các đầu thu phát của hai trạm và một dây đất. Với cấu
hình tối thiều này, việc đảm bảo độ an toàn truyền dẫn tín hiệu thuộc về trách
nhiệm của phần mềm.

15
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Ta còn có thể ghép nối trực tiếp giữa hai thiết bị thực hiện chế độ bắt tay
( handshake mode ) không thông qua modem. Qua việc sử dụng các dây dẫn DTR
và DSR, độ an toàn giao tiếp sẽ được đảm bảo. Trong trường hợp này các chân
RTS và CTS được nối ngắn.

1.5. Giới thiệu về truyền thông qua chuẩn RS-485.


+ Đặc tính điện học: sử dụng tín hiệu điện áp chênh lệch đối xứng giữa hai
dây dẫn A và B. Nhờ vậy giảm được nhiễu và cho phép tăng chiều dài dây dẫn ( có
thể lên đến 1200m ). Điện áp chênh lệch dương tương ứng với trạng thái logic 0 và
âm tương ứng với trạng thái logic 1. Điện áp chênh lệch ở đầu vào dây nhận có thể
xuống tới 200mV.
Các thông số quan trọng của RS-485:

Thông số Điều kiện Min Max

Điện áp đầu ra hở mạch ± 1,5V ± 6V

Điện áp đầu ra khi có tải. Rload = 54Ω ± 1,5V ± 5V

Dòng ra ngắn mạch ± 250mA

Thời gian quá độ đầu ra Rload = 54Ω 30%TB


Cload = 54pF

Điện áp chế độ chung đầu ra VOC Rload = 54Ω -1V 3V

Độ nhạy cảm đầu vào -7V < VCM < 12V ± 200mV

Điện áp chế độ chung VCM -7V 12V

Trở kháng đầu vào 12kΩ

16
Đồ án tốt nghiệp Cơ điện tử 3 - K47

RS-485 có khả năng ghép nối nhiều điểm. Có thể ghép nối 32 trạm, được
định địa chỉ và giao tiếp đồng thời qua một đoạn RS-485 mà không cần lắp bộ. Để
đạt được điều này, trong một thời điểm chỉ một trạm được phép kiểm soát đường
dẫn và phát tín hiệu. Vì thế một bộ kích thích đều phải đưa về chế độ trở kháng
cao mỗi khi rỗi, tạo điều kiện cho các bộ kích thích ở các trạm khác tham gia. Chế
độ này gọi là chế độ tri-state. Một số vi mạch RS-485 tự động xử lý tình huống
này, trong nhiều trường hợp khác việc đó thuộc về trách nhiệm của phần mềm điều
khiển truyền thông. Trong mạch của bộ kích thích RS-485 có một tín hiệu vào '
enable ' được dùng cho mục đích chuyển bộ kích thích về trạng thái phát tín hiệu
hoặc tri-state.

Sơ đồ bộ kích thích ( driver ) và bộ thu ( receiver ) RS-485.


Mặc dù phạm vi làm việc tối đa là -6V đến 6V (trong trường hợp hở mạch),
trạng thái logic của tín hiệu chỉ được định nghĩa trong khoảng từ ±1,5V đến ±5V
đối với đầu ra ( bên phát ) và từ ±0,2V đến ±5V đối đầu vào ( bên nhận ).
+ Số trạm tham gia: RS-485 cho phép nối mạng 32 tải đơn vị ( unit load,
UL ), ứng với 32 bộ thu phát hoặc nhiều hơn, tuỳ theo cách chọn tải cho mỗi thiết
bị thành viên. Thông thường, mỗi bộ thu phát được thiết kế tương đương với một
tải đơn vị. Gần đây cũng có những cố gắng giảm tải xuống 1/2UL hoặc 1/4UL, tức
là tăng trở kháng đầu vào lên hai hoặc bốn lần, với mục đích tăng số lượng trạm
lên 64 hoặc 128. Tuy nhiên, tăng số trạm theo cách này sẽ gắn với việc phải giảm
tốc độ truyền thông, vì các trạm trở kháng lớn sẽ hoạt động chậm hơn.

17
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Quy định trạng thái logic của tín hiệu RS-485.


Giới hạn 32 tải đơn vị xuất phát từ đặc tính kỹ thuật của hệ thống truyền
thông nhiều điểm. Các tải được mắc song song vì thế việc tăng tải sẽ làm suy giảm
tín hiệu vượt quá mức cho phép. Theo qui định chuẩn, một bộ kích thích tín hiệu
phải đảm bảo dòng tổng cộng 60mA vừa đủ để cung cấp cho:
• Hai trở đầu cuối mặc song song tương ứng tải 60Ω ( 120Ω tại mỗi
đầu ) với điện áp tối thiểu 1,5V tạo dòng tương đương 25mA.
• 32 tải đơn vị mắc song song với dòng 1mA qua mỗi tải ( trường hợp
xấu nhất ), tạo dòng tương đương 32mA.

Định nghĩa một tải đơn vị.


+ Tốc độ truyền tải và chiều dài dây dẫn: RS485 cho phép truyền khoảng
cách tối đa giữa trạm đầu và trạm cuối trong một đoạn mạng là 1200m, không phụ
thuộc vào số trạm tham gia. Tốc độ truyền dẫn tối đa có thể lên đến 10Mbit/s, một
số hệ thống gần đây có khả năng làm việc với tốc độ 12Mbit/s. Tuy nhiên có sự
ràng buộc giữa tốc độ truyền dẫn tối đa và độ dài dây dẫn cho phép, tức là một
mạng dài 1200m không thể làm việc với tốc độ 10MBd. Quan hệ giữa chúng phụ
thuộc vào chất lượng cáp dẫn và phụ thuộc vào việc đánh giá chất lượng tín hiệu.

Quan hệ giữa tốc độ truyền và chiều dài dây dẫn tối đa trong RS-485 sử
dụng đôi dây xoắn AWG24.

18
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Tốc độ truyền tối đa phụ thuộc vào chất lượng cáp mạng, cụ thể là đôi dây
xoắn kiểu STP có khả năng chống nhiễu tốt hơn loại UPT và vì thế có thể truyền
với tốc độ cao hơn. Có thể sử dụng các bộ lặp để tăng số trạm trong một mạng,
cũng như chiều dài dây dẫn lên nhiều lần, đồng thời đảm bảo được chất lượng tín
hiệu.
+ Cấu hình mạng: RS-485 là chuẩn duy nhất do EIA đưa ra mà có khả năng
truyền thông đa điểm thực sự chỉ dụng một đường dẫn chung duy nhất, được gọi là
bus. Chính vì vậy mà nó được làm chuẩn cho lớp vật lý ở đa số các hệ thông bus
hiện thời.
Cấu hình phổ biến nhất là sử dụng hai dây dẫn cho việc truyền tín hiệu.
Trong trường hợp này, hệ thống chỉ có thể làm việc với chế độ hai chiều gián đoạn
( half-duplex ) và các trạm có thể nhận quyên bình đẳng trong việc truy nhập
đường dẫn. Chú ý, đường dẫn được kết thúc bằng hai trở tại hai đầu chứ không
được phép ở giữa đường dây. Trên hình trên không vẽ dây nối đất song trên thực tế
việc nối đất là rất quan trọng.

Cấu hình mạng RS-485 hai dây.


+ Cáp nối: RS-485 không phải là một chuẩn trọn vẹn mà chỉ là một chuẩn
về đặc tính điện học, vì vậy không đưa ra các qui định cho cáp nối cũng như các
bộ nối. Có thể dùng đôi dây xoắn, cáp trơn hoặc các loại cáp khác. Tuy nhiên đôi
dây xoắn vẫn là loại cáp được sử dụng phổ biến nhất nhờ đặc tính chống tạp nhiễu
và xuyên âm.
+ Trở đầu cuối: Do tốc độ truyền thông và chiều dài dây dẫn có thể khác
nhau rất nhiều trong các ứng dụng nên hầu hết các bus RS-485 đều yêu cầu sử
dụng trở đầu cuối tại hai đầu dây. Sử dụng trở đầu có tác dụng chống các hiệu ứng
phụ trong truyền dẫn tín hiệu như sụ phản xạ tín hiệu...Trở đầu cuối dùng cho
RS485 có thể từ 100Ω đến 120Ω.

19
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Cấu hình mạng RS-485 sử dụng 4 dây.


Trong trường hợp cáp truyền ngắn và tốc độ truyền thấp, ta có thể không
cần dùng trở đầu cuối. Tín hiệu phản xạ sẽ suy giảm và triệt tiêu sau vài lần qua
lại. Tốc độ truyền dẫn thấp có nghĩa là chu kỳ nhịp bus dài. Nếu tín hiệu phản xạ
triệt tiêu hoàn toàn trước thời điểm trích mẫu ở nhịp tiếp theo ( thường vào giữa
chu kỳ ) thì tín hiệu mang thông tin sẽ không bị ảnh hưởng.
Có nhiều phương pháp chặn đầu cuối một đường dẫn RS-485. Phương pháp
được dùng phổ biến nhất là chỉ dùng một điện trở thuần nhất nối giữa hai dây A và
B tại mỗi đầu. Phương pháp này gọi là chặn song song. Điện trở được chọn có giá
trị tương đương với trở kháng đặc trưng ( trở kháng sóng ) của cáp nối. Như vậy sẽ
không có tín hiệu phản xạ và chất lượng tín hiệu mang thông tin sẽ được đảm bảo.
Nhược điểm của phương pháp này là sự tổn hao nguồn tại hai điện trở.

Các phương pháp chặn đầu cuối RS-485.


Phương pháp Không chặn Song song RC Tin cậy
Tốc độ Thấp Cao Trung bình Cao
Chất lượng Kém Tốt Hạn chế Tốt
Tổn hao nguồn Thấp Cao Thấp Cao

20
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Phương pháp thứ hai được gọi là chặn RC, sử dung kết hợp một tụ C mắc
nối tiếp với điện trở R. Mạch RC này cho phép khắc phục nhược điểm của cách sử
dụng một điện trở thần nêu trên. Trong lúc tín hiệu ở giai đoạn qua độ, tụ C có tác
dụng ngắn mạch và trở R có tác dụng chặn đầu cuối. Khi tụ C đảo chiều sẽ cản trở
dòng một chiều và vì thế có tác dụng giảm tải. Tuy nhiên, hiệu ứng sẽ cản trở
thông thấp ( lowpass ) của mạch RC không cho phép hệ thống làm việc với tốc độ
cao.
Một biến thể của phương pháp chặn song song cũng được sử dụng rộng rãi
là chặn tin cậy, bởi nó có tác dụng khác nữa là tạo thiên áp tin cậy ( fail-safe
biasing ) đảm bảo một dòng tối thiểu cho trường hợp bus rỗi hoặc có sự cố.
+ Nối đất: Mặc dù mức tín hiệu được xác định bằng điện áp chênh lệch
giữa hai dây dẫn A và B không liên quan tới đất, hệ thống RS485 vẫn cần một
đường dây nối đất để tạo một đường thoát cho nhiễu chế độ chụng và các dòng
khác, ví dụ dòng đầu vào bộ thu. Một sai lầm thương gặp là chỉ dùng hai dây để
nối hai trạm. Trong trường hợp này dòng chế độ chung sẽ tìm cách quay ngược trở
lại nguồn phát, bức xạ nhiễu ra môi trường xung quanh. ảnh hưởng tối tính tương
thích điện từ của hệ thống. Nối đất sẽ có tác dụng tạo một đương thoát trở kháng
nhỏ tại một vị trí xác định, nhờ vậy giảm thiểu tác hại gây nhiễu. Hơn thế nữa với
cấu hình trở đầu cuối tin cậy, việc nối đất tạo thiên áp sẽ giữ một mức điện áp tối
thiểu giữa hai dây A và B trong trường hợp kể cả bus rỗi hoăc có sự cố

21
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CHƯƠNG 2. TỔNG QUAN VỀ VI ĐIỀU KHIỂN

Ngày nay, những ứng dụng của Vi điều khiển đã đi sâu vào đời sống sinh
hoạt và sản xuất của con người. Thực tế hiện nay là hầu hết các thiết bị điện dân
dụng hiện nay đều có sự góp mặt của Vi Điều Khiển và vi xử lí . Ứng dụng vi điều
khiển trong thiết kế hệ thống làm giảm chi phí thiết kế và hạ giá thành sản phẩm
đồng thời nâng cao tính ổn định của thiết bị và hệ thống. Trên thị trường có rất
nhiều họ vi điều khiển: họ 8051 của Intel, 68HC11 của Motorola, Z80 của hãng
Eilog, PIC của hãng Microchip, H8 của Hitachi,vv.. và cuối cùng là AVR của hang
Atmel.

2.1. Giới Thiệu Họ Vi Điều Khiển MCS – 51 :


MCS-51 là họ IC vi điều khiển do hãng Intel sản xuất. Các IC tiêu biểu cho
họ là 8031, 8051, 8951... Những đặc điểm chính và nguyên tắt hoạt động của các
bộ vi điều khiển này khác nhau không nhiều. Khi đã sử dụng thành thạo một loại
vi điều khiển thì ta có thể nhanh chóng vận dụng kinh nghiệm để làm quen và làm
chủ các ứng dụng của một bộ vi điều khiển khác. Vì vậy để có những hiểu biết cụ
thể về các bộ vi điều khiển cũng như để phục vụ cho đề tài tốt nghiệp này ta bắt
đầu tìm hiểu một bộ vi điều khiển thông dụng nhất, đó là họ MCS-51 và nếu như
họ MCS-51 là họ điển hình thì 8051 lại chính là đại diện tiêu biểu.
Các đặc điểm của 8051 được tóm tắt như sau :
4 KB ROM bên trong.
128 Byte RAM nội.
4 Port xuất /nhập I/O 8 bit.
Giao tiếp nối tiếp.
64 KB vùng nhớ mã ngoài
64 KB vùng nhớ dữ liệu ngoại.
Xử lý Boolean (hoạt động trên bit đơn).
210 vị trí nhớ có thể định vị bit.
4 µs cho hoạt động nhân hoặc chia.

Bảng 2.1. Mô tả sự khác nhau của các IC trong họ MSC-51

22
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Loại Bộ Nhớ Mã Trên CHIP Bộ Nhớ Dữ Liệu Trên CHIP Số Timer


8051 4K ROM 128 Byte 2
8031 0K ROM 128 Byte 2
8751 4K ROM 128 Byte 2
8052 8 K ROM 256Byte 2
8032 0 K ROM 256Byte 2
8752 8K EPROM 256Byte 2

1.2 Cấu trúc VĐK 8051, chức năng từng chân


U 1

39 21
38 P 0 .0 /A D 0 P 2 .0 /A 8 22
37 P 0 .1 /A D 1 P 2 .1 /A 9 23
36 P 0 .2 /A D 2 P 2 .2 /A 1 0 24
35 P 0 .3 /A D 3 P 2 .3 /A 1 1 25
34 P 0 .4 /A D 4 P 2 .4 /A 1 2 26
33 P 0 .5 /A D 5 P 2 .5 /A 1 3 27
32 P 0 .6 /A D 6 P 2 .6 /A 1 4 28
P 0 .7 /A D 7 P 2 .7 /A 1 5
1 10
2 P 1 .0 P 3 .0 /R XD 11
3 P 1 .1 P 3 .1 /T XD 12
4 P 1 .2 P 3 .2 /IN T 0 13
5 P 1 .3 P 3 .3 /IN T 1 14
6 P 1 .4 P 3 .4 /T 0 15
7 P 1 .5 P 3 .5 /T 1 16
8 P 1 .6 P 3 .6 /W R 17
P 1 .7 P 3 .7 /R D
19 30
18 X1 ALE 29
X2 PSEN
31
9 EA
R ST
40
VC C

8051

Hình 2-1: Sơ đồ chân của 8051


Chức năng hoạt động của từng chân (pin) được tóm tắt như sau :
Từ chân 1 ÷ 8 Port 1 (P1.0, . . ., P1.7) dùng làm Port xuất nhập I/O để giao
tiếp bên ngoài.

23
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Chân 9 (RST) là chân để RESET cho 8051. Bình thường các chân này ở
mức thấp. Khi ta đưa tín hiệu này lên cao (tối thiểu 2 chu kỳ máy). Thì những
thanh ghi nội của 8051 được LOAD những giá trị thích hợp để khởi động lại hệ
thống. Từ chân 10 ÷17 là Port3 (P3.0, P3.1, . . ., P3.7) dùng vào hai mục đích :
dùng là Port xuất / nhập I/O hoặc mỗi chân giữ một chức năng cá biệt được tóm tắt
sơ bộ như sau :
P3.0 (RXD) : Nhận dữ liệu từ Port nối tiếp.
P3.1 (TXD) : Phát dữ liệu từ Port nối tiếp.
P3.2 (INT0) : Ngắt 0 bên ngoài.
P3.3 (INT1) : Ngắt 1 từ bên ngoài.
P3.4 (T0) : Timer/Counter 0 nhập từ bên ngoài.
P3.5 (T1) : Timer/Counter 1 nhập từ bên ngoài.
P3.6 (WR) : Tín hiệu Strobe ghi dữ liệu lên bộ nhớ bên ngoài.
P3.7 (RD) : Tín hiệu Strobe đọc dữ liệu lên bộ nhớ bên ngoài.
Các chân 18,19 (XTAL2 và XTAL1) được nối với bộ dao động thạch anh
12 MHz để tạo dao động trên CHIP. Hai tụ 30 pF được thêm vào để ổn định dao
động.
Chân 20 (Vss) nối đất (Vss = 0).
Từ chân 21 - 28 là Port 2 (P2.0, P2.1, . . ., P2.7) dùng vào hai mục đích:
làm Port xuất/nhập I/O hoặc dùng làm byte cao của Bus địa chỉ thì nó không còn
tác dụng I/O nữa. Bởi vì ta muốn dùng EPROM và RAM ngoài nên phải sử dụng
Port 2 làm byte cao bus địa chỉ.
Chân 29 (PSEN)(program store enable) là tín hiệu điều khiển xuất ra của
8051, nó cho phép chọn bộ nhớ ngoài và được nối chung với chân của OE (Outout
Enable) của EPROM ngoài để cho phép đọc các byte của chương trình. Các xung
tín hiệu PSEN hạ thấp trong suốt thời gian thi hành lệnh. Những mã nhị phân của
chương trình được đọc từ EPROM đi qua bus dữ liệu và được chốt vào thanh ghi
lệnh của 8051 bởi mã lệnh.(chú ý việc đọc ở đây là đọc các lệnh (khác với đọc dữ

24
Đồ án tốt nghiệp Cơ điện tử 3 - K47

liệu), khi đó VXL chỉ đọc các bit opcode của lệnh và đưa chúng vào hàng đợi lệnh
thông qua các Bus địa chỉ và dữ liệu)
Chân 30 (ALE : Adress Latch Enable) là tín hiệu điều khiển xuất ra của 8051,
nó cho phép phân kênh bus địa chỉ và bus dữ liệu của Port 0.
Chân 31 (EA : Eternal Acess) được đưa xuống thấp cho phép chọn bộ nhớ
mã ngoàiđối với 8031.
Đối với 8051 thì :
EA = 5V : Chọn ROM nội.
EA = 0V : Chọn ROM ngoại.
EA = 21V : Lập trình EPROM nội.
Các chân từ 32 39 là Port 0 (P0.0, P0.1, . . . , P0.7) dùng cả hai mục đích :
Vừa làm byte thấp cho bus địa chỉ, vừa làm bus dữ liệu, nếu vậy Port 0 không còn
chức năng xuất nhập I/O nữa.
Chân 40 (Vcc) được nối lên nguồn 5V.

2.2. Tổng quan về vi điều khiển AVR.


2.2.1. Giới thiệu tổng quan họ vi điều khiển AVR.
AVR là họ vi diều khiển mới khá mạnh, tích hợp tính năng cao, hơn hẳn họ
89xx của hãng Atmel theo công nghệ RISC(Reduced Instruction Set Computer )
Những đặc điểm nổi trội của AVR đó là về tốc độ sử lý nhanh hơn, nhiều tính năng
hơn , giao tiếp đơn giản , khả năng chống nhiễu tốt hơn .
Có thể xem AVR ngang hàng với những họ vi điều khiển mới như: Pic,psoc cùng
thời. tuy mổi họ có những tính năng riêng tuỳ thuộc vào ứng dụng thực tế của
chúng ta , sử dụng cho phù hợp yêu cầu.
Những tính năng mạnh hơn như:
 Kiến trúc (RISC) với hầu hết các lệnh có chiều dài cố định, truy cập bộ nhớ
nạp-lưu dữ liệu , và 32 thanh ghi đa năng.
 Kiến trúc đường ống lệnh kiểu 2 tầng làm tăng tốc độ thực thi lệnh.
 Có chứa nhiều bộ phận ngoại vi: giao diện SPI đồng bộ,các đường dẫn
vào/ra (I/O) lập trình được, giao tiếp I2C , bộ biến đổi ADC 10 bit, các
kênh băm xung PWM , chế độ sleep, standby , 1 bộ định thời Watchdog , 3
bộ timer/counter 8 bit, 1 bộ timer/counter 16 bit , 1 bộ só sánh tương tự
(analog) , có bộ nhớ EEPROM , giao tiếp UART…..

25
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Hầu hết các lệnh đều thực hiện trong 1 chu kỳ xung nhịp.
 Hoạt động với tốc độ đồng hồ đến 12 MHZ , vi điều khiển AVR có khả
năng đạt đến tốc độ xử lý 12MPIS (1 triệu lệnh trên giây).
 Bộ nhớ chương trình và dữ liệu tích hợp ngay trên chip .AVR có 3 công
nghệ bộ nhớ khác nhau : EPROM( luôn lập trinh mới được) xoá được kiểu
flash , EEPROM xoá được bằng tín hiệu xung điện nhưng nội dung bộ nhơ
vẫn dữ nguyên khi mất điện áp nguồn , RAM dung cho các biến thông
thường.
 Khả năng lập được trình trong hệ thống ,do cách thiết kế và công nghệ bộ
nhớ có thể lập trình ngay trong khi đang được cấp nguồn trên mạch , ko cần
phải nhấc chip ra như các vi điều khiển khác.
 Hỗ trợ lập trình bằng ngôn ngữ C.
 Điện áp làm việc thay đổi trong khoảng rộng từ 2.7->6V.

2.2.2. Kiến trúc AVR.


1) Mở đầu.
Chương này sẽ mô tả một cách chi tiết về họ vi điều khiển AVR, cụ thể là
về kiến trúc và các bộ phận ngoại vi được tích hợp ngay trên chip, bên cạnh đơn vị
xử lý trung tâm CPU.
Vi điều khiển AVR là bộ xử lý RISC với kiến trúc Harvard. Thuật ngữ kiến
trúc Harvard dùng để chỉ một đặc điểm là đơn vị xử lý trung tâm (CPU) có bộ nhớ
chương trình và một bộ nhớ dữ liệu tách biệt.
Họ vi điều khiển AVR có những đặc điểm sau:
1. Bộ nhớ flash được tích hợp ngay trên chip và có khả năng lập trình ngay
trên hệ thống được sử dụng làm bộ nhớ chương trình. Tất cả các bộ xử lý
đều có bộ nhớ chương trình loại này. Điều đó có nghĩa là ta không càn phải
dùng đến các bộ nhớ EPROM hoặc ROM bên ngoài để chứa mã chương
trình. Hơn nữa, bộ nhớ chương trình có thể nạp chương trình trong khi bộ
xử lý vẫn ở nguyên vị trí trên bảng mạch, không cần phải nhấc ra ngoài để
đặt vào bộ nạp chương trình. Đặc tính này cho phép cập nhật phần mềm hệ
thống nhanh chóng và dễ dàng hơn. Đôi khi hình thức này còn được gọi là
lập trình tại chỗ (in situ). Bộ nhớ chương trình có thể được lập trình theo
hai chế độ: nối tiếp hoặc song song và sẽ được bàn luận chi tiết ở phần sau.
2. Các thanh ghi làm việc đa năng 32 –X – 8 (theo truyền thống của các bộ xử
lý RISC thực sự). Một tập hợp bao gồm rất nhiều thanh ghi có nghĩa là các
biến có thể lưu trữ bên trong CPU chứ không phải lưu trữ các biến trong bộ
nhớ, vì việc truy nhập lên bộ nhớ thường tốn nhiều thời gian hơn. Như vậy
chương trình sẽ chạy nhanh hơn.
3. Bộ nhớ dữ liệu ngay trên chip loại EEPROM và RAM có trong hầu hết các
thành viên của họ AVR. Đơn vị CPU có kiến trúc Harvard, còn các bộ nhớ

26
Đồ án tốt nghiệp Cơ điện tử 3 - K47

EPROM và RAM được nhìn nhận như là bộ nhớ dữ liệu và được dùng để
cất giữ các hằng và biến.
4. Hoạt động với xung giữ nhịp có tần số từ 0 đến 10MHz. Hầu hết các lệnh
được thực hiện trong 1 chu kỳ đồng hồ và điều này dẫn đến sự cải thiện tính
năng với tốc độ xử lý khoảng 10 lần lớn hơn các bộ xử lý thông thường
(chẳng hạn, họ 8051) hoạt động ở cùng tần số cuẩ đồng hồ giữ nhịp.
5. Có mạch đặt lại trạng thái mỗi khi cấp lại điện nguồn cho hệ thống (Power
On Reset).
6. Có bộ định thời ngay trên chip và lập trình được với mạch chia tần số
(prescalr) tách biệt. Bộ định thời này được sử dụng cho các ứng dụng cần
có sự phân định thời gian (timing) của các sự kiện.
7. Có các nguồn ngắt bên trong và bên ngoài.
8. Có bộ định thời watchdog ngay trên chip và lập trình được với bộ dao động
độc lập. Bộ phận này được sử dụng để khôi phục lại trạng thái hoạt động
của hệ thống trong trường hợp xảy ra lỗi (treo) khi chạy phần mềm, nhưng
cũng có thể được sử dụng cho các ứng dụng đáng quan tâm khác, như sẽ
được bàn luận đến trong một ứng dụng sẽ được trình bày về sau.
9. Có chế độ hoạt động: SLEPP (ngủ) và POWER DOWN (nghỉ hay giảm
dòng tiêu thụ khi không cần thiết). Đặc điểm này cho phép tiết kiệm năng
lượng khi bộ xử lý không có công việc cần xử lý, đặc biệt có ý nghĩa đối
với các thiết bị cầm tay dùng pin.
10. Nhiều chip có mạch dao động đồn hồ RC ngay trên chip. Khi sử dụng bộ
giao động RC trên chip, số lượng các linh kiện phụ trợ sẽ giảm đi.
11. Có một phạm vi rộng các đặc tính của bộ xử lý (từ các bộ xử lý cỡ nhỏ với
8 chân ra đến bộ xử lý 68 chân), nhờ vậy ta có thể lựa chọn một bộ xử lý
cho thích hợp với yêu cầu đã đặt ra, cả về chi phí và tính năng kỹ thuật
cũng như về các công cụ phát triển.

27
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2) Kiến trúc của bộ xử lý AVR.


Các bộ xử lý AVR có kiến trúc Harvard, nghĩa là có bộ nhớ dữ liệu và bộ
nhớ chương trình tách biệt nhau. Hình 3-2 minh họa một bản phác thảo kiến trúc
bên trong của bộ điều khiển. Bus dữ liệu dùng cho bộ nhớ dữ liệu là một bus 8 bit,
cho phép nối hầu hết các bộ phận ngoại vi vi với tệp thanh nghi (register file). Bus
dữ liệu dùng cho bộ nhớ chương trình có độ rộng 16 bit và chỉ nối với thanh ghi
lệnh. Mặc dù hình 3-1 minh họa cho kiến trúc của bộ điều khiển AVR AT90S2313,
nhưng cũng có thể áp dụng cho tất cả các bộ xử lý và chỉ khác về quy mô của các
bộ phận ngoại vi bổ sung (hoặc không có) cũng như sự khác nhau về dung lượng
của bộ nhớ chương trình và bộ nhớ dữ liệu.

Hình 3-1: Kiến trúc của bộ xử lý AVR


Bộ nhớ chương trình là loại bộ nhớ flash. Dung lượng chính xác của bộ nhớ
này thay đổi khác nhau giữa các bộ xử lý trong cùng họ. Bộ xử lý AT90S1200, bộ
xử lý ở mức cơ bản, có 1 kbyte bộ nhớ chương trình, được tổ chức các bit theo 512
– X- 16 bit, trong khi bộ điều khiển Mega103 có 128 kbyte bộ nhớ được tổ chức
theo 64k –X-16. Một kilô (k) ở đây được tính tho hệ số 1.024 chứ không phải
1.000 như thông thường. Bộ nhớ chương trình được truy nhập theo từng chu kỳ
đồng hồ, và một lệnh được nạp vào thanh ghi lệnh. Thanh ghi lệnh nối với tệp
thành ghi bằng cách lựa chọn xem thanh nghi nào sẽ được ALU sử dụng để thực

28
Đồ án tốt nghiệp Cơ điện tử 3 - K47

thi lệnh. Lối ra của thanh nghi lệnh được giải mã bằng bộ giải mã lệnh để quyết
định chọn tín hiệu điều khiển nào sẽ được kích hoạt để thoàn thành lệnh hiện tại.
Bộ nhớ chương trình, bên cạnh các lệnh lưu trữ, cũng như chứa các vectơ
ngắt bắt đầu ở địa chỉ $0000. Chương trình hiện tại sẽ bắt đầu ở vị trí bộ nhớ phía
bên khia vùng dùng cho các vectơ. Số lượng các vectơ cũng khác nhau giữa các bộ
xử lý. Bộ xử lý AT90S1200 có 3 vectơ còn AT90S8515 có 13 vectơ. Bảng 3-1
minh họa toàn bộ không gian vectơ dùng cho bộ xử lý AT90S8515.

Bộ nhớ chương trình Vectơ Giải thích


dùng cho địa chỉ

$S0000 Reset Reset Handler

$0001 EXT_INT0 IRQ0 Handler

$0002 XT_INT1 IRQ1 Handler

$0003 ETIM_CAPT Timer 1 Capture Handler

$0004 TIM1_COMA Timer 1 Compare A Handler

$0005 TIM1_COMB Timer 1 Compare B Handler1

$0006 TIM1_OVF Timer 1 Overflow Handler

$0007 TIM0_OVF Timer 0 Overflow Handler

$0008 SPI_STC SPI transfer Complete Handler

$0009 UART_RXC UART RX Complete Handler

$000A UART_DRE UART URD empty Handler

$000B UART_TXC UART TxC Complete Handler

&000C ANA_COMP Analog Comparator Handler


Bảng 3-1: Bộ nhớ chương trình dung cho địa chỉ.

Bộ nhớ dữ liệu, mặt khác, được phân chia thành những loại khác nhau. Hình 3-
2 minh họa các bản đồ bộ nhớ khác nhau có trên một vi điều khiển AVR. Bộ nhớ
dữ liệu có tất cả 5 thành phần khác nhau:
1. Một tệp thanh ghi (register file) với 32 thanh ghi có độ rộng 8 bit. Tất cả
các bộ điều khiển của họ AVR đều có tệp thanh ghi này.

29
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2. 64 thanh ghi vào/ra (I/O), mỗi thanh ghi 8 bit. Tất cả các bộ xử lý không
phải đều có đúng 64 thanh ghi. Một số trong đó có nhiều hơn số còn lại, tùy
thuộc vào các bộ phận ngoại vi có trên chip. Các thanh nghi vào/ra này thực
chất là một phần của bộ nhớ SRAM trên chip và có thể được truy nhập
hoặc như bộ nhớ SRAM với các địa chỉ giữa $20 và $5F hoặc như các
thanh ghi I/O với các địa chỉ giữa $00 và $3F. Hầu hết các thanh ghi này
thường được trao đổi như các thanh nghi I/O chứ không phải như bộ nhớ
SRAM.
3. Bộ nhớ SRAM bên trong. Bộ nhớ này có trên hầu hết các bộ xử lý AVR, chỉ
trừ các bộ xử lý loại cơ sở (baseline), chẳng hạn như loại AT90S1200. dụng
lượng bộ nhớ SRAM thay đổi từ 128 byte đến 4 kbyte. Bộ nhớ SRAM
được sử dụng cho ngăn xếp cũng như để lưu trữ các biến. Trong thời gian
có ngắt và gọi đoạn chương trình (subroutine), giá trị hiện tại của bộ đếm
chương trình được lưu trữ trong ngăn xếp. Kích thước của ngăn xếp bị giới
hạn bởi bộ nhớ SRAM có mặt trên chip. Vị trí của ngăn xếp được chỉ thị
bởi con trỏ ngăn xếp. Con trỏ ngăn xếp có dụng lượng 1 kbyte trên các vi
điều khiển nhỏ hơn, chẳng hạn như loại AT90S2313 và bằng 2 byte trên các
bộ xử lý lớn hơn, chẳng hạn như loại AT90S8515. Con trỏ ngăn xếp cần
phải được khởi tạo sau khi đặt lại (reset) và trước khi ngăn xếp có thể được
sử dụng. Các bộ xử lý này không có bộ nhớ SRAM trên chip, chẳng hạn
như loại AT90S1200. Ngăn xếp bằng phần cứng được thiết kế để lưu trữ
các địa chỉ trả lại chương trình. Một ngăn xếp bằng phần cứng này chỉ có
thể lưu trữ đến 3 giá trị trả lại.
4. Bộ nhớ SRAM bên ngoài. Đặc tính này chỉ có ở các bộ xử lý cỡ lớn trong
họ vi điều khiển AVR. Các bộ xử lý này có các cổng để truy nhập bộ nhớ và
dữ liệu bên ngoài (chẳng hạn như AT90S8515) có thể sử dụng bất kỳ bộ
nhớ SRAM ngoài nào mà người dụng có thể tùy ý quyết định khi thiết kế.
5. EEROM. Bộ nhớ EEROM có sẵn trên hầu như tất cả các bộ vi điều khiển
AVR và được truy nhập theo một bản đồ bộ nhớ tách biệt. Địa chỉ bắt đầu
của bộ nhớ EEPROM luôn là $0000. Các bộ xử lý khác nhau có từ 64 byte
đến 4 kbyte bộ nhớ EEPROM. Bộ nhớ EEPROM có thể được đọc và ghi
bởi bất kỳ chương trình nào. Việc đọc bộ nhớ EEPROM diễn ra nhanh hơn
việc ghi vào bộ nhớ EEROM. Bộ nhớ EEPROM có thể ghi vào được
khoảng 100.000 lần.

30
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Hình 3-2: Bản đồ bộ nhớ của vi điều khiển AVR.

Hầu hết các lệnh dùng cho bộ điều khiển AVR đều có chiều dài1 từ (2 byte)
và vì thế chiếm 1 ô nhớ chương trình. Nhiều lệnh được thực thi trong một chu kỳ
đồng hồ đơn lẻ, trongkhi một số khác có thể chiếm 2 hoặc nhiều chu kỳ đồng hồ.
Việc thực thi trong một chu trình đơn lẻ đạt được là do việc sử dụng một kiểu cấu
trúc đường ống (pipeline) hai tầng. Đường ống làm việc theo cách tiếp nhận đồng
thời một lệnh mới từ bộ nhớ chương trình trong khi lệnh trước đó đang được thực
thi trong phần khác của bộ xử lý. Việc tìm nạp/giải mã và thực thi các lệnh như
vậy gọi là những quá trình được thực hiện bởi bộ xử lý một cách đồng thời.
Bây giờ ta thử tìm hiểu các bộ phận khác nhau hình thành bộ xử lý AVR, đó là:
+ Tệp thanh ghi + Bộ truyền nhận UART
+ Khối số học logic + Cấu trúc ngắt.
+ Bộ nhớ vào/ra + Bộ định thời.
+ Bộ nhớ EEPROM + Bộ watchdog
+ Cổng vào/ra + Bộ biến đổi A/D
+ Bộ nhớ SRAM + Bộ định thời watchdog.

31
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Tệp thanh ghi.


Tất cả các bộ điều khiển AVR đều có 32 thanh ghi đa năng. Một số trong
các thanh ghi này còn có các chức năng riêng biệt, bổ sung. Các thanh ghi được
đặt tên từ R0 đến R31. Tệp thanh ghi được tách thành 2 phần, mỗi phần có 16
thanh ghi, đánh số từ R0 đến R15 và R16 đến R31. Tất cả các lệnh thao tác trên
các thanh ghi đều có thể truy nhập trực tiếp và truy nhập trong chu trình đơn đến
tất cả các thanh ghi. Nhưng có một ngoại lệ là các lệnh SBCI, SUBI, CPI, ANDI
và ORI cũng như lệnh WI, các lệnh này chỉ tác động đến các thanh ghi R16 đến
R31.
Các thanh ghi R0 và R26 đến R31 có các chức năng bổ xung. Thanh ghi R0
được sử dụng trong các lệnh nạp bộ nhớ chương trình LPM (Load Program
Memory), trong khi các thanh ghi R26 đến R31 được sử dụng làm các thanh ghi
con trỏ như được minh họa trên hình 3-3. Các thanh ghi con trỏ này được sử dụng
trong nhiều lệnh gián tiếp dụng cho thanh ghi (regiser indirect insruction).

Hình 3-3: Tệp thanh ghi của vi điều khiển AVR.

 Khối số học logic.


Khối số học logic (ALU) thực hiện các thao tác như thao tác bit; phép tính
số học và logic trên nội dụng của các thanh ghi và ghi ngược kết quả vào tệp thanh
ghi trên thanh ghi đã được chỉ định. Các thao tác này được thực hiện trong một

32
Đồ án tốt nghiệp Cơ điện tử 3 - K47

chu kỳ đồng hồ đơn lẻ. Mỗi một hao tác ALU đều làm ảnh hưởng đến các cờ trong
thanh ghi trạng thái (STATUS), tùy thuộc vào lệnh.

 Truy nhập bộ nhớ và việc thực thi lệnh.


Bộ xử lý AVR được điều khiển bởi đồng hồ hệ thống, đồng hồ này có thể ở
bên ngoài, hoặc nếu có tồn tại và được phép, một đồng hồ RC bên trong có thể
được sử dụng. Đồng hồ hệ thống này không qua bất kỳ bộ chia nào và được sử
dụng thực tiếp cho tất cả các thao tác truy nhập bên trong bộ xử lý. Bộ xử lý có
một đường ống hai tầng, và lệnh tìm nạp/giải mã (fech/decode) được thực hiện
đồng thời với việc thực thi lệnh. Quá trình này được minh họa trên hình 3-4

Hình 3-4: Tìm nạp/giải mã lệnh và việc thực thi lệnh


Cứ mỗi lần lệnh được tìm nạp (fetch), nếu đây là một lệnh liên quan đến
ALU, nó có thể được thực thi bởi khối ALU như được minh họa trên hình 3-5 cho
một chu trình đơn lẻ.

Hình 3-5: Việc thực thi của ALU bao gồm tìm/nạp, thực thi, và ghi ngược vào
thanh ghi.
Mặt khác, việc truy nhập bộ nhớ SRAM chiếm mất 2 chu kỳ, như được
minh họa trên hình 3-6. Nguyên nhân là việc truy nhập bộ nhớ SRAM sử dụng
một thanh ghi con trỏ dùng địa chỉ bộ nhớ SRAM. Thanh ghi con trỏ này chỉ là
một trong các thanh ghi con trỏ (các cặp thanh ghi X, Y, hoặc Z) có trên chip. Chu

33
Đồ án tốt nghiệp Cơ điện tử 3 - K47

trình đồng hồ thứ nhất được cần đển để truy nhập tệp thanh ghi và để thao tác trên
thanh ghi con trỏ (các lệnh truy nhập bộ nhớ SRAM cho phép tăng địa chỉ
trước/sau thao tác trên thanh ghi con trỏ). Ở thời điểm kết thúc của chu kỳ đồng hồ
thứ nhất, khố ALU thực hiện phép tính này, và sau đó địa chỉ này được sử dụng để
truy nhập ô nhớ SRAM và để ghi vào ô nhớ này (hoặc đọc ra từ đó vào thanh ghi
đích), như được minh họa trên hình 3-6.

Hình 3-6: Các chu trình truy nhập dữ liệu lên thanh ghi SRAM trên chip.

 Bộ nhớ vào/ra.
Bộ nhớ vào/ra là “xa lộ” đến với tất cả các bộ phận ngoại vi xủa bộ xử lý
AVR. Nó được thiết kế giống như SRAM và có thể được trao đổi theo hai cách:
giống như bộ nhớ SRAM hoặc như các thanh ghi I/O. Nếu giống như SRAM, các
địa chỉ ở phía bên kia S20 cho đến $5F, còn nếu giống như các thanh ghi I/O, các
địa chỉ bắt đầu từ $00 đến $3F.
Ta sẽ xem xét các thanh ghi vào/ra như các thanh ghi chứ không phải như
bộ nhớ SRAM và sẽ xem xét hầu hết các thanh ghi I/O cũng như chức năng của
các thanh ghi đó. Tuy nhiên, đối với một chip cụ thể, ta nên tra cứu hoặc đối chiếu
với các tài liệu về thống số kỹ thuật (data sheet) cụ thể để có được các thông tin
cập nhật và chính xác. Ở đây chỉ bàn luận đến các thanh ghi chung nhất và chức
năng của chúng.
Một điểm quan trọng cần chú ý ở đây là việc truy nhập lên các thanh ghi
vào/ra khác nhau. Để truy nhập lên các thanh ghi I/O, vi điều khiển AVR giới thiệu
các lệnh IN và OUT. Các lệnh này có thể truy nhập tất cả các thanh gh I/O từ $00
đến $3F. Bên cạnh các lệnh IN và OUT, vi điều khiển AVR cũng hỗ trợ việc định
địa chỉ bit lên một số trong các thanh ghi, cụ thể là từ $00 đến $1F. Với sự trợ giúp
của các lệnh bit SBI và CBI, bất cứ bit nào trên bất kỳ thanh ghi nào (từ $00 đến
$1F) đều có thể được đặt và đặt lại. Đây là một phương pháp tiết kiệm thời gian so
với việc đọc thanh ghi, thay đổi bit, và việc ghi giá trị ngược trở lại thanh ghi. Đối

34
Đồ án tốt nghiệp Cơ điện tử 3 - K47

với các thanh ghi còn lại, ta phải sử dụng một phương pháp khác, cần đến thời
gian dài hơn khoảng ba lần so với một chu kỳ đồng hồ.

 SREG: Thanh ghi trạng thái.


Thanh ghi trạng thái (status register) có chứa 8 bit cờ, đóng vai trò báo hiệu
trạng thái hiện tại của bộ xử lý. Tất cả các bit đó được xóa (nghĩa là ở mức logic 0)
khi reset và có thể được đọc hoặc ghi bởi chương trình. Các địa chỉ I/O của thanh
ghi trạng thái là $3F (địa chỉ bộ nhớ là $5F), xem hình 3-7.
Các bit khác nhau của thanh ghi trạng thái và chức năng của nó là:
1. Bit 7-I: Cho phép ngắt toàn cục (Global Interrupt Enable). Việc thiết lập bit
này cho phép tất cả các ngắt. Việc đặt lại bit này sẽ cấm tất cả các ngắt.
2. Bit 6-T: Bit Copy Storage. Được sử dụng với lệnh nạp bit BLD (Bit Load)
và lưu trữ bit BST (Bit Store) để nạp và lưu trữ các bit từ một thanh ghi vào
một thanh ghi khác.

7 6 5 4 3 2 1 0

Địa chỉ I T H S V N Z C
I/O-$3F

Giá trị 0 0 0 0 0 0 0 0
khởi tạo
Hình 3-7: Thanh ghi trạng thái bộ xử lý

3. Bit 5: H. Half Cary Flag. Chỉ báo cho thấy sự mang sang (nhớ) một nửa
trong một số lệnh số học.
4. Bit 4: S. Cờ dấu (Sing Flag). Bit này là kết quả EX – OR (hoặc loại trừ)
giữa cờ phủ định N và cờ tràn (Overflow).
5. Bit 3: V. Cờ tràn lấy bù nhị phân (Two’s Complement Overflow Flag).
6. Bit 2: N. Cờ phủ định (Negative Flag).
7. Bit 1: Z. Cờ số không (Zero Flag). Chỉ báo một kết quả bằng 0 sau khi thực
hiện một phép tính số học hoặc logic.
8. Bit 0: C. Cờ mang sang (Carry Flag), báo hiệu sự mang sang trong phép
tính số học hoặc logic.
Thanh ghi trạng thái không được lưu trữ bằng máy (machine) trong thời gian
diễn ra một thao tác ngắt. Lệnh trong một đoạn chương trình ngắt có thể sửa đổi
bit cờ trạng thái, và vì thế chương trình của người dùng phải lưu trữ và khôi phục
thanh ghi trạng thái trong thời gian có một ngắt.

35
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Thanh ghi con trỏ ngăn xếp SP.


Thanh ghi này có độ rộng bằng 1 byte đối với các bộ xử lý có đến 256 byte
SRAM và bằng 2 byte (được gọi là SPH và SPL ) đối với các bộ xử lý có bộ nhớ
SRAM nhiều hơn 256 byte. Thanh ghi này được sử dụng để chỉ đến vùng trong bộ
nhớ SRAM ở đỉnh của ngăn xếp. Ngăn xếp được sử dụng để lưu trữ địa chỉ mà bộ
xử lý trả trở lại trong thời gian một ngắt và gọi thủ tục (subroutine). Bởi vì SP
được khởi tạo về $00 (hoặc $0000 đối với một SP 2 byte) khi reset, nên chương
trình người dùng cần phải khởi tạo SP cho thích hợp, bởi vì địa chỉ bắt đầu của bộ
nhớ SRAM không phải là $00 mà là $60. Ngăn xếp sắp xếp theo trình tự từ trên
xuống dưới (grows dow) trong địa chỉ bộ nhớ, nghĩa là, việc đẩy một giá trị lên
trên ngăn xếp sẽ làm cho SP giảm đi một giá trị. Khi kéo một giá trị ra khỏi ngăn
xếp sẽ làm tăng SP thêm một giá trị.

 Thanh ghi che ngắt chung GIMSK.


Thanh ghi GIMSK (General Interrupt Mask Register) được sử dụng để cho
phép hoặc cấm các ngắt ngoài riêng biệt, cụ thể bằng cách đặt và đặt lại bit tương
ứng có liên quan. Tuy nhiên, ngắt đang cần được phục vụ, bit I trên thanh ghi trạng
thái (SREG), cũng cần phải được đặt thành “1” (xem hình 3-8).

7 6 5 4 3 2 1 0

Địa chỉ INTF1 INTF0


I/O-$3B

Giá trị 0 0 0 0 0 0 0 0
khởi tạo
Hình 3-8. Thanh ghi che (mask) ngắt chung

 Thanh ghi cờ ngắt chung GIFR.


Các bit trong thanh ghi GIFR (General Interrupt Flag Register) chỉ báo cho
thấy nếu một ngắt đã xuất hiện. Nếu một ngắt ngoài xuất hiện, thì cờ INT tương
ứng trong GIFR được đặt thành “1”. Nếu như ngắt được phục vụ (điều đó xảy ra
nếu bit I và INT tương ứng trong thanh ghi GIMKS là “1”) thì cờ được đặt lại. Cờ
cũng có thể được đặt lại (reset) bằng cách ghi giá trị logic “1” vào nó (xem hình 3-
9).

7 6 5 4 3 2 1 0

Địa chỉ INTF1 INTF0


I/O-$3A

36
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Giá trị 0 0 0 0 0 0 0 0
khởi tạo
Hình 3-9: Thanh ghi cờ ngắt chung

 Thanh ghi điều khiển toàn bộ vi điều khiển MCUCR.


Các bit trong thanh ghi điều khiển toàn bộ vi điều khiển thường được viết
tắt là MCUCR (MCU Control Register) cho phép điều khiển toàn bộ vi điều khiển.
Chức năng ghi này bao gồm việc điều khiển để cho phép/cấm truy nhập bộ nhớ
SRAM ngoài, chế độ ngủ, và điều khiển độ nhạy cảm (sense) ngắt ngoài (xem
hình 3-10).
1. Bit 7: SRE. Cho phép SRAM ngoài (External SRAM Enable). Việc thiết
lập bit này thành “1” cho phép truy nhập bộ nhớ SRAM ngoài đối với các
bộ xử lý, có khả năng này. Port A trở thành AD0 – 7, Port C trở thành A8-
A15, và các tín hiệu WR* và RD* được kích hoạt lên Port0 khi lựa chọn
chức năng của chân. Khi bit này bằng “0”, chức năng các cổng giống như
các cổng thông thường và việc truy nhập bộ nhớ SRAM ngoài bị cấm.
2. Bit 6: SRW. Bit trạng thái chờ truy nhập SRAM ngoài (External SRAM
Access Wait State Bit). Khi bit này bằng “1”, một trạng thái chờ được chèn
thêm vào chu trình truy nhập bộ nhớ SRAM. Như vậy bộ nhớ SRAM được
truy nhập trong 4 chu trình. Khi bit này bằng “0”, bộ nhớ SRAM được truy
nhập trong 3 chu trình.
3. Bit 5: SE. cho phép ngủ (Sleep Enable). Việc đặt bit này thành “1” cho
phép bộ xử lý đến chuyển sang chế độ ngủ. Sau khi đặt bit này thành “1”,
chương trình cần phải thực thi lệnh SLEEP.
4. Bit 4: SM. Chế độ ngủ (Sleep Mode). Một giá trị “1” ở bit này đặt bộ xử lý
vào chế độ ngủ. Một giá trị “0” có nghĩa là chế độ giảm dòng tiêu thụ.
5. Bit 3, 2: ISC11, ISC10. Bit điều khiển nhạy cảm nhất (Interrupt sense
control bit) dùng cho INT1 như được chỉ ra trong bảng 3-2.
6. Bit 1,0: ISC01, JS00. Bit điều khiển nhạy cảm ngắt dùng cho INT0 như
được chỉ ra trong bảng 3-3.

7 6 5 4 3 2 1 0

Địa chỉ INTF1 INTF0 H S V N Z C


I/O-$3A

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-10: Thanh ghi điều khiển chung MCU

37
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CS02 CS01 Mô tả

0 0 Mức LOW trên chân INT tạo ra ngắt

0 1 Dự trữ

1 0 Sườn dương trên chân INT1 tạo ra ngắt

1 1 Sườn âm trên chân INT1 tạo ra ngắt

Bảng 3-2: Điều khiển độ nhạy cảm ngắt interrupt1.

CS02 CS01 Mô tả

0 0 Mức LOW trên chân INT0 tạo ra ngắt

0 1 Dự trữ

1 0 Sườn dương trên chân INT0 tạo ra ngắt

1 1 Sườn âm trên chân INT0 tạo ra ngắt

Bảng 3-3: Điều khiển độ nhạy cảm ngắt Interrupt0

38
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Thanh ghi trạng thái bộ xử lý MCUSR.


Thanh ghi trạng thái MCU (MCU status rigister) cung cấp thông tin về
nguồn của tín hiệu reset (xem hình 3-11). Thanh ghi MCUSR có chứa 2 bit, bit
này chỉ cho thấy nguồn của tín hiệu reset như được chỉ ra trong bảng 3-4.

7 6 5 4 3 2 1 0

Địa chỉ EXTRF PORF


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo
Hình 3-11: Thanh ghi trạng thái MCU

 Thanh ghi điều khiển TIMER/COUNTER0 TCCR0.


Thanh ghi Timer/Counter1 được sử dụng để điều khiển các thao tác của bộ
xử lý Timer/Conter0. Đây là một bộ định thời đơn giản dùng để đếm tiến từ giá trị
đếm đã được nạp vào. Bộ đếm được làm tăng thêm một giá trị mỗi khi có thêm
một tín hiệu đồng hồ ở lối vào của nó. Tín hiệu đồng hồ có thể được lựa chọn từ
một trong 7 nguồn như được minh họa trong bảng 3-5. Tùy chọn thứ 8 cho phép
bộ Timer/Counter được ngưng hoạt động.

 Thanh ghi Timer/Counter0 TCNT0.


Đây là thanh ghi Timer/Counter hiện thời. Một giá trị đã nạp vào thanh ghi
này được sử dụng làm giá trị xuất phát (bắt đầu), và bộ định thời làm tằng giá trị
này theo từng tín hiệu xung nhịp của nó nếu bộ Counter/Timer được cho phép qua
thanh ghi TCCR0. Sau khi bộ Timer/Counter0 bị tràn, được đặt lại về $00 và tiếp
tục đếm tiến theo từng tín hiệu xung nhịp. Timer/Counter0 (hình 3-12 và 3-13).

CS02 CS01 Mô tả

0 0 Reset khi cấp điện áp nguồnnuôi

0 1 Dự trữ

1 0 Reset ngoài

1 1 Reset watchdog

Bảng 3-4: Các giá trị PORF và EXTRF sau khi reset. X có nghĩa là không xác định
còn Y có nghĩa là không thay đổi.

39
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CS02 CS01 CS00 Mô tả

0 0 0 Luôn dùng Timer/Counter0

0 0 1 Làm dừng Timer/Countero CK

0 1 0 CK/8

0 1 1 CK/64

1 0 0 CK/256

1 0 1 CK/1024

1 1 0 Chân T0 ngoài, sườn âm

1 1 1 Chân T0 ngoài, sườn âm

Bảng 3-5: Sự lựa chọn hệ số chia tần số CLOCK0.

 TCCR1A: Thanh ghi điều khiển Timer/Counter 1A.


TCCR1A là một thanh ghi điều khiển dùng cho bộ Timer/Counter1. Các tín
hiệu dùng cho các thanh ghi này là:
1. Bits 7,6: COM1A1, COM1A0: Compare Output Model, các bit 1 và 0. Các
bit điều khiển COM1A1 và COM1A0 quy định bất kỳ tác động nào của
chân lối ra kế tiếp theo là một lần so sánh trong bộ Timer/Counter1. Bất kỳ
tác động nào của chân lối ra đều ảnh hưởng đến chân OC1 (Output
Compare pin 1). Đây là một chức năng lựa chọn đối với cổng I/O, và bit
điều khiển hướng tương ứng cần phải đặt thành “1” để điều khiển một chan
lối ra. Đối với các vi mạch với 2 chức năng so sánh, các bit 5 và 4 của
thanh ghi điều khiển có các chức năng tương tự với các bit 7 và 6. Cấu hình
điều khiển được minh họa trong bảng 3-6.
2. Bit 1,0 – PWM 11, PWM 10: Các bit lựa chọn bộ điều chế độ rộng xung
(Plus Width Modulator). Các bit này lựa chọn thao tác PWM của bộ
Timer/Counter1 như được chỉ rõ trong bảng 3-7 (cũng như xem hình 3-14).

40
Đồ án tốt nghiệp Cơ điện tử 3 - K47

7 6 5 4 3 2 1 0

Địa chỉ CS02 CS01 CS00


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-12: Thanh ghi điều khiển Timer/Counter0

7 6 5 4 3 2 1 0

Địa chỉ MSB LSB


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-13: Thanh ghi Timer/Counter0

CS02 CS01 Mô tả

0 0 Thao tác PWM của Timer/Counter1 bị cấm

0 1 PWM 8 bit

1 0 PWM 9 bit

1 1 PWM 10 bit

Bảng 3-7: Sự lựa chọn chế độ so sánh 1, x là A OR B

 TCCR1B: Thanh ghi điều khiển Timer/Counter1B.


Trên thanh ghi TCCR1B có các bit sau:
1. Bit 7: ICNC1: Input Capture1 Noise Canceler (4 chu kỳ). Khi bit ICNC1 bit
bị xóa thành “0”, thì chức năng input capture trigger noise canceler bị cấm.
Mạch input capture được lật trạng thái ở sườn dương/ âm đầu tiên được lấy
mẫu trên chân ICP (Input Capture Pin), như được chỉ định. Khi bit ICNC1
được đặt thành “1”, 4 mẫu đã được lấy trọn vẹn được đo trên chân ICP và

41
Đồ án tốt nghiệp Cơ điện tử 3 - K47

tất cả các mẫu cần phải phù hợp về mức HIGH/LOW với thông số kỹ thuật
về input capture trigger quy định cho bit ICES. Tần số lấy mẫu hiện thời là
tần số đồng hồ STAL.

7 6 5 4 3 2 1 0

Địa chỉ C C C COM1 EXTRF PORF


I/O-$34 OM1 OM1 OM1 B0
A1 A0 B1

Giá trị 0 0 0 0 0 0 0 0
khởi tạo
Hình 3-14: Thanh ghi điều khiển Timer/Counter1A.

2. Bit 6: ICES 1: Lựa chọn sườn Input Capture 1 Edge Selec. Khi bit ICES1
được xóa thành “0”, thì nội dung của bộ Timer/Counter1 được truyền đến
thanh ghi ICR1 (Input Capture Register), trên sườn âm của chân ICP (Input
capture Pin). Khi bit ICES1 được đặt thành “1”, thì nội dung của bộ
Timer/Counter1 được truyền đến thanh ghi ICR1 (Input Capture), trên sườn
dương của chân ICP.
3. Bit 3: CTC1: Xóa Timer/Counter1 theo lần so sánh (Clear Timer/Counter1
on Compare Match). Khi bit điều khiển CTC1 được đặt thành “1” bộ
Timer/Counter1 được reset về $0000 trong chu trình đồng hồ sau một lần so
sánh. Nếu bit điều khiển CTC1 bị xóa, thì bộ Timer/Counter1 tiếp tục đếm
và không bị ảnh hưởng (tác động) bởi kết quả sau lần so sánh. Bởi vì mỗi
lần so sánh được phát hiện trong chu kỳ đồng hồ CPU kế tiếp theo lần
trước, nên chức năng này sẽ thực hiện một cách khó khăn khi số chia tần số
cao hơn 1 được sử dụng cho bộ định thời. Khi số chia tần số bằng 1 được
sử dụng, và thanh ghi so sánh A được đặt thành C, thì bộ Timer sẽ như sau
nếu CTC1 được đặt:
... C – 2 C – 1 C 0 1
Khi bộ chia tần số được đặt số chia thành 8, bộ định thời sẽ đếm giống như
sau đây:
… C-2, C-2, C-2, C-2, C-2, C-2, C-2, C-2 C-1, C-1, C-1, C-1, C-1, C-1, C-
1 C, 0, 0, 0, 0, 0, 0, 0 …
Trong chế độ PWM, bit này khôg có tác dụng.
4. Bit 2,1,1 – CS12, CS11, CS10: Clock Select1, bit 2, 1 và 0. Các bit
ClockSelect1 2; 1 và 0 quy định nguồn chia tần số của bộ Timer/Counter1
giống như với Timer/Counter0 (xem hình 3-15).

42
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 TCNT1 H, TCNT1 L, TIMER/COUNTER1.


Thanh ghi 16 bit này chứa giá trị được đem chia tần số của bộ
Timer/Counter1 16bit. Để đảm bảo rằng cả hai byte HIGH và LOW được đọc và
ghi đông thời thì khối CPU truy nhập các thanh ghi này, việc truy nhập được thực
hiện b ằng cách sử dụng một thanh ghi tạm thời 8bit (TEMP). Thanh ghi tạm thời
này cũng được sử dụng khi truy nhập OCR1A và ICR1. Nếu chương trình chính
và cả đoạn chương trình ngắt cũng thực hiện việc truy nhập đến các thanh ghi
bằng cách sử dụng TEM, thì các ngắt cần phải bị cấm (disable) trong khoảng thời
gian truy nhập từ chương trình chính hoặc các ngắt truy nhập nếu các ngắt được
cho phép lại (Hình 3-16).
TCNT1 Timer/Counter1 Write: Khi CPU ghi vào byte cao (HIGH) TCNT1H,
dữ liệu đã ghi được đặt vào trong thanh ghi TEMP. Tiếp theo, khi khối CPU ghi
byte LOW TCNT1L, byte dữ liệu này được kết hợp với byte dữ liệu trong thanh
ghi TEMP, và toàn bộ 16bit được ghi đồng thời vào thanh thi TCNT1
Timer.Counter1. Do đó, byte HIGH TCNT1H cần phải được truy cập trước tiên
đối với thao tác ghi trọn vẹn thanh ghi 16bit.

7 6 5 4 3 2 1 0

Địa chỉ ICNC1 ICNC0 CTC1 CS12 CS11 CS10


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-15: Thanh ghi điều khiển Timer/Counter1 B.

43
Đồ án tốt nghiệp Cơ điện tử 3 - K47

15 14 13 12 11 10 9 8

Địa chỉ MSB


I/O-$2D

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

7 6 5 4 3 2 1 0

Địa chỉ LSB


I/O-$2C

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-16. Thanh ghi điều khiển Timer/Counter1

TCNT1 Timer/Counter1 Read: Khi khối CPU đọc byte thấp (LOW)
TCNT1L, dữ liệu của byte LOW TCNT1L được gửi tới CPU và dữ liệu của byte
HIGH TCNT1H bị thay thế trong thanh ghi TEMP. Khi khối CPU đọc dữ liệu
trong byte HIGH TCNT1H, thì CPU nhận dữ liệu trong thanh ghi TEMP. Do đó,
byte LOW TCNT1L cần phải được truy nhập trước tiên đối với thao tác đọc trọn
vẹn thanh ghi 16 bit. Bộ Timer/Counter1 được thiết kế để hoạt động như một bộ
đếm tiến hoặc tiến/lùi (trong chế độ PWM) với thao tác truy nhập đọc và ghi. Nếu
bộ Timer/Counter1 được ghi vào và một nguồn xung nhịp được lựa chọn thì bộ
Timer/Counter 1 tiếp tục đếm trong chu trình đồng hồ bộ định thời sau khi nó
được đặt trước (preset) bằng giá trị đã được ghi.

 Các thanh ghi so sánh lối ra bộ Timer/Counter1: OCR1AH, OCR1AL.


Thanh ghi so sánh lối ra (Output Compare Register) là một thanh ghi
đọc/ghi 16 bit. Thanh ghi OCR bộ Timer/Counter1 chứa dữ liệu cần được so sánh
liên tục với bộ Timer/Counter1. Diễn biến của những lần so sánh (Actions on
compare matches) được chỉ định trên thanh ghi điều khiển và trạng thái
Timer/Counter.
Bởi vì thanh ghi so sánh lối ra OCR1A là một thanh ghi 16 bit, nên một
thanh ghi tạm thời TEMP được sử dụng khi ghi vào OCR1A để bảo đảm rằng cả
hai byte được cập nhật đồng thời. Khi CPU ghi byte cao (HIGH), OCR1AH, dữ
liệu được lưu trữ tạm thời trong thanh ghi TEMP. Khi khối CPU ghi byte thấp
(LOW), OCR1AH cần phải được ghi trước tiên đối với một thao tác ghi trọn vẹn

44
Đồ án tốt nghiệp Cơ điện tử 3 - K47

thanh ghi 16 bit. Thanh ghi TEMP cũng được sử dụng khi truy nhập TCNT1 và
ICR1. Nếu chương trình chính và đoạn chương trình ngắt (routine) cũng thực hiện
thao tác truy nhập lên các thanh ghi bằng cách sử dụng TEMP, các ngắt cần phải bị
cấm trong thời gian xảy ra quá trình truy nhập từ chương trình chính hoặc các ngắt
truy nhập nếu các ngắt được cho phép lại được cho phép lại.

 Các thanh ghi so sánh lối ra Timer/Counter1: OCR1 BH, OCR1 BL.
Các thanh ghi so sánh lối ra (output compare) là các thanh ghi đọc/ghi 16
bit. Các thanh ghi so sánh lối ra bộ Timer/Counter1 chứa dữ liệu được so sánh liên
tục với Timer/Counter1.
Diễn biến của những lần so sánh được chỉ định trong thanh ghi điều khiển
và trạng thái Timer/Counter1. Một lần so sánh chỉ xảy ra nếu Timer/Counter1 đếm
đến giá trị OCR. Một phần mềm thực hiện thao tác ghi, đặt TCNT1 và OCR1A
hoặc OCR1B thành cùng giá trị, sẽ không tạo ra một lần so sánh.
Một lần so sánh sẽ đặt cờ ngắt so sánh trong chu kỳ đồng hồ CPU kế tiếp
theo sự kiện so sánh. Bởi vì các thành ghi so sánh lối ra – OCR1A và OCR1B – là
các thanh ghi 16 bit, nên một thanh ghi tạm thời TEMP được sử dụng khi
OCR1A/B được ghi để đảm bảo là cả hai byte được cập nhật đồng thời. Khi CPU
ghi byte cao (HIGH), OCR1AH hoặc OCR1BH, dữ liệu được lưu trữ tạm thời vào
thanh ghi TEMP. Khi khối CPU ghi byte thập, OCR1AL hoặc OCR1BL, thanh ghi
TEMP ghi đồng thời OCR1AH hoặc OCR1BH. Do đó, byte cao (HIGH)
OCR1AH hoặc OCR1BH cần phải được ghi trước tiên đối với một thao tác ghi
trọn vẹn thanh ghi 16 bit.

7 6 5 4 3 2 1 0

Địa chỉ MSB


I/O-$2B

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

7 6 5 4 3 2 1 0

Địa chỉ LSB


I/O-$2A

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-17: Thanh ghi so sánh lối ra bộ Timer/Counter1A.

45
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Thanh ghi TEMP cũng được sử dụng khi truy nhập TCNT1 và ICR1. Nếu
chương trình chính và các đoạn chương trình ngắt thực hiện việc truy nhập đến các
thanh ghi bằng cách sử dụng TEMP, các ngắt cần phải bị cấm trong thời gian truy
nhập từ chương trình chính và từ đoạn chương trình (routine) ngắt nếu các ngắt
được cho phép từ bên trong đoạn chương trình ngắt.

7 6 5 4 3 2 1 0

Địa chỉ MSB


I/O-$29

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

7 6 5 4 3 2 1 0

Địa chỉ LSB


I/O-$28

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-18: Các thanh ghi so sánh lối ra bộ Timer/Counter1.

 ICR1H, ICR1L: Các thanh ghi Timer/Counter1 Input Capture.


Thanh ghi input capture là một thanh ghi 16 bit chỉ để đọc. Khi sườn dương
hoặc sườn âm (phù hợp với việc thiết lập sườn input capture, ICES1) của tín hiệu
ở chân input capture, ICP, được phát hiện, giá trịn hiện thời của bộ
Timer/Counter1 được truyền đến thanh ghi Input Capture, ICR1. Đồng thời, cờ
input capture ICF1, được đặt thành “1”. Bởi vì thanh Input Capture ICR1 là một
thanh ghi 16 bit, nên một thanh ghi tạm thời TEMP được sử dụng để khi ICR1
được đọc có thểm đảm bảo rằng cả hai byte được đọc đồng thời. Khi CPU đọc
byte thấp (LOW) ICR1L, dữ liệu được gửi đến khối CPU và dữ liệu của byte cao
(HIGH) ICR1H được đặt vào thanh ghi TEMP. Khi khối CPU đọc dữ liệu trong
byte cao (HIGH) ICR1H, khối CPU nhận dữ liệu trong thanh ghi TEMP. Do đó,
byte thấp (LOW) ICR1L cần phải được truy nhập trước tiên đối với một thao tác
đọc trọn vẹn thanh ghi 16 bit. Thanh ghi TEMP cũng được sử dụng khi truy nhập
TCNT1 và OCR1A. Nếu chương trình chính và cả đoạn chương trình ngắt thực
hiện việc truy nhập đến các thanh ghi bằng cách sử dụng TEMP, thì các ngắt cần
phải bị cấm trong thời gian truy nhập từ chương trình chính hoặc các ngắt truy
nhập nếu các ngắt được cho phép lại (xem hình 3-19).

46
Đồ án tốt nghiệp Cơ điện tử 3 - K47

7 6 5 4 3 2 1 0

Địa chỉ MSB


I/O-$25

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

7 6 5 4 3 2 1 0

Địa chỉ LSB


I/O-$24

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-19: Thanh ghi capture lối vào Timer/Counter1.

 WDTCR: Thanh ghi điều khiển bộ định thời Watchdog.


1. Bit 4: WDTOE. Watchdog Turn Off Enable. Bit này được sử dụng chung
với bit WDE. Bit này được đặt thành “1”, khi WDE bị xoá thành “0” để
cấm mạch watchdog timer. Bộ xử lý xoá bit này sau 4 chu kỳ đồng hồ.
2. Bit 3: WDE. Watchdog Enable. Khi đặt thành “1”, mạch watchdog timer
được cho phép. Để cấm mạch watchdog, bit này bị xoá thành “0” và
WDTOE được đặt thành “1”. Để cấm mạch watchdog timer, thủ tục sau
đây được sử dụng: Trong một thao tác đơn lẻ, đặt WDTOE và WDE thành
“1”. Xoá WDE thành “0” trong 4 chu kỳ đồng hồ tiếp theo. Sau đó, thao
tác này sẽ cấm mạch watchdog timer
3. Bit 2-0: WDP2, WDP1, WDP0. Giá trị chia tần số (Watchdog Timer
Prescaler). Các bit này được sử dụng như trong bảng 3-8 để lựa chọn
mạch watchdog timer timeouts (xem hình 3-20).

47
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Thanh ghi địa chỉ bộ nhớ EEPROM EEAR.


Thanh ghi địa chỉ bộ nhớ EEPROM có độ rộng 2 byte dùng cho các bộ xử
lý có bộ nhớ EEPROM lớn hơn 256 byte và có độ rộng một byte đối với các bộ xử
lý còn lại.

WDP1 WDP1 WDP1 Các chu kỳ WDT Timerout điển hình ở 5V

0 0 0 16K 15ms

0 0 1 32K 30ms

0 1 0 64K 60ms

0 1 1 128K 120ms

1 0 0 256K 240ms

1 0 1 512K 490ms

1 1 0 1024K 970ms

1 1 1 2048K 1,9s

Bảng 3-8: Sự lựa chọn số chia tần số của bộ định thời watchdog

7 6 5 4 3 2 1 0

Địa chỉ WDTOE WDE WDP2 WDP1 WDP0


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-20: Thanh ghi điều khiển bộ định thời watchdog.

 Thanh ghi dữ liệu bộ nhớ EEPROM EEDR.


Thanh ghi dữ liệu bộ nhớ EEPROM được sử dụng để đọc và ghi dữ liệu
từ/vào bộ nhớ EEPROM. Bộ nhớ EEPROM có độ rộng 8 bit.

48
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Thanh ghi điều khiển EEPROM EECR.


Thanh ghi EECR được sử dụng để điều khiển các thao tác đọc và ghi dữ liệu
vào bộ nhớ EEPROM (xem hình 3-21).
1. Bit 2: EEMWE: EEPROM Master Write Enable. Việc đặt EEMWE
thành “1” và sau đó thiết lập EEWE thành “1” sẽ chỉ ghi dữ liệu trên
thanh ghi EEDR vào bộ nhớ EEPROM. Nếu như EEMWE được đặt
thành “1”, thì phần cứng xoá bit này thành “0” sau 4 chu kỳ xung nhịp.
2. Bit 1: EEWE: EEPROM Write Enable. Khi đặt thành “1” trong khi
EEMWE cũng bằng “1”, dữ liệu EEDR được ghi vào bộ nhớ EEPROM
ở địa chỉ được chỉ định bởi thanh ghi địa chỉ bộ nhớ EEPROM. Bit
EEWE giữ nguyên giá trị “1” trong chu trình ghi, khoảng thời gian này
có thể chiếm đến 2,5ms ở 5V. Sau khi khoảng thời gian này trôi qua, bit
EEWE bị phần cứng xoá thành “0”. Dãy các lệnh dùng để gi dữ liệu vào
bộ nhớ EEPROM được viết như sau:

Wait till EEWE is cleared to “0”.


Write EEPROM address to EEAR.
Write EEPROM data to EEDR.
Set EEMWE to “1” và within four clock cycles set EEWE to “1”.

Đoạn chương trình này sẽ ghi dữ liệu trong thanh ghi EEDR vào ô nhớ trên
bộ nhớ EEPROM có địa chỉ bằng giá trị trong EEAR.
3. Bit0: EERE: EEPROM Read Enable (Cho phép đọc EEPROM). Để đọc
dữ liệu EEPROM, nạp EEAR với địa chỉ đúng (phù hợp), đặt EERE
thành “1”, và sau đó xoá EERE thành “0”. Thao tác này sẽ chuyển dữ
liệu vào EEDR. Trước khi bắt đầu chu trình đọc, chương trình sẽ kiểm
tra (poll) cờ EEWE cho đến khi EEWE bằng “0” để đảm bảo là không
một chu trình ghi nào được tiến hành.

7 6 5 4 3 2 1 0

Địa chỉ EEMWE EEWE EEME


I/O-$1C

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-21: Thanh ghi điều khiển bộ nhớ EEPROM

49
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Cổng B: PortB data register.


Thanh ghi PortB là một thanh ghi đọc/ghi. Nó được khởi tạo ở thời điểm
reset thành $00. Khi được lập trình thành một lối ra, thì việc ghi vào PortB sẽ cho
phép ta thay đổi trạng thái logic ở các chân PortB.

 Thanh ghi hướng dữ liệu các cổng DDRS.


Thanh ghi này được sử dụng để điều khiển hướng của từng chân của PortB.
Khi ghi một giá trị “0” (giá trị này cũng là giá trị reset) vào bất kỳ bit nào của
thanh ghi này sẽ làm bit PortB tương ứng thành lối vào, và khi giá trị “1” sẽ làm
cho nó trở thành bit lổi ra.

 Các chân lối vào trên các cổng.


Đây là các cổng chỉ để đọc, và với các cổng này ta có thể đọc trạng thái
logic ở chân vật lý của PortB. Pinkhông phải là thanh ghi, và việc đọc PinB cho
phép ta đọc giá trị logic trên các chân của PortB.

 Thanh ghi dữ liệu PortD: PortD.


Cùng chức năng như thanh ghi PortB

 Thanh ghi hướng dữ liệu PortD: DDRD.


Cùng chức năng như thanh ghi DDRB.

 Các chân lối vào trên PordD (PinD).


Cùng chức năng như cổng PinB.

 Thanh ghi dữ liệu I/O SPI.


Đây là thanh ghi đọc/ghi được sử dụng để truyền dữ liệu giữa tệp thanh ghi
và thanh ghi dịch SPI. Việc ghi vào thanh ghi này khởi tạo quá trình truyền dữ
liệu, và việc đọc từ thanh ghi này làm cho bộ đệm nhận của thanh ghi dịch được
đọc. Việc trình bày chi tiết hơn về thanh ghi này sẽ được đề cập đến trong mục viết
về cổng SPI (xem hình 3-22).

 Thanh ghi trạng thái SPI.

50
Đồ án tốt nghiệp Cơ điện tử 3 - K47

1. Bit7: SPIF. Cờ ngắt SPI. Khi một cuộc truyền nối tiếp SPI được hoàn
thành và bit SPIE trên thanh ghi SPCR được đặt thành “1”. Còn các ngắt
toàn cục được cho phép, thì cờ SPIF được đặt thành “1”. Cờ SPIF bị bộ
xử lý hoá thành “0” khi ngắt tương ứng được thực thi. Bit SPIF cũng có
thể bị xoá bằng cách đọc thanh ghi trạng thái SPI khi cờ SPIF bằng “1” và
sau đó truy nhập thanh ghi dữ liệu SPI.

7 6 5 4 3 2 1 0

Địa chỉ MSB LSB


I/O-$0F

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-22: Thanh ghi dữ liệu SP

7 6 5 4 3 2 1 0

Địa chỉ SPIF WCOL


I/O-$0E

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 2-23: Thanh ghi trạng thái SPI

2. Bit6: WCOL. Write Collision Flag (cờ xung đột khi ghi). Bit này được
đặt nếu thanh ghi dữ liệu SPI (SPDR) được ghi trong khoảng thời gian
diễn ra trong một cuộc truyền dữ liệu. Bit này bị xoá, cùng với cờ SPIF,
thành “0” bởi trước tiên là việc đọc thanh ghi trạng thái SPI khi WCOL
được đặt thành “1” và sau đó truy nhập thanh ghi dữ liệu SPI (xem hình
3-23).
 Thanh ghi điều khiển SPI.
1. Bit7: SPIE. Cho phép ngắt SPI. Bit này làm cho một ngắt SPI phải được
tạo ra nếu bit SPIF trong thanh ghi SPSR được đặt và các ngắt toàn cục
được cho phép.
2. Bit6: SPE. Cho phép SPI. Khi bit này được đặt thành “1” thì SPI được
cho phép.

51
Đồ án tốt nghiệp Cơ điện tử 3 - K47

3. Bit5: DORD. Đặt thứ tự dữ liệu. Khi đặt thành “1”. LSB của từ dữ liệu
được truyền trước tiên. Khi bị xoá thành “0”, byte MSB của từ dữ liệu
được truyền trước tiên.
4. Bit4: MSTR. Master/Slave Select. Khi đặt thành “1”, cổng SPI trong chế
độ chủ (master mode) và khi xoá thành “0”, nó là một cổng slave. Nếu
như SS được cấu hình để là lối vào và được đặt xuống mức thấp (LOW),
thì bit MSTR sẽ bị xoá thành “0” và SPIF trong SPSR sẽ được đặt. Người
dùng sẽ phải đặt MSTR thành “1” một lần nữa để bắt đầu (khởi động )
như là master.
5. Bit3: CPOL. Clock Polarity. Khi đặt thành “1”, thì SCK là cao (HIGH)
khi nghỉ (idle: không có công việc xử lý) còn khi bị xoá thành “0”, thì
SCK là thấp (LOW) khi không có công việc cần xử lý.
6. Bit2: CPHA. Clock Phase. Quy định pha kích hoạt của xung nhịp.
7. Bit1-0: SPR1, SPR0.SPI Clock Rate Select. Các bit này quy định tốc độ
đồng hồ SCK khi được đặt cấu hình như là master, phù hợp với nội dung
của bảng 3-9. Nếu như vi mạch là một slave, các bit này không ảnh hưởng
lên tần số SCK (xem hình 3-24).

 Thanh ghi dữ liệu vào/ra UART.


Các thanh ghi dữ liệu vào/ra UART trên thực tế là hai thanh ghi tách biệt
nhau, nhưng dùng chung cùng một địa chỉ vật lý. Khi dữ liệu được ghi vào địa chỉ
này, nó ghi vào thanh ghi truyền dữ liệu, và khi đọc từ địa chỉ này nó đọc từ thanh
ghi nhận dữ liệu (xem hình 3-25).

 Thanh ghi trạng thái UART.


Thanh ghi trạng thái UART được sử dụng để giám sát trạng thái của UART.
Các bit có ý nghĩa của thanh ghi trạng thái UART USR là:

CS02 CS01 Tần số SCK

0 0 Fclk/4

0 1 Fclk/16

1 0 Fclk/64

1 1 Fclk/128

Bảng 3-9: Tần số SCK, Fclk là tần số dao động của bộ xử lý.

52
Đồ án tốt nghiệp Cơ điện tử 3 - K47

7 6 5 4 3 2 1 0

Địa chỉ SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-24: Thanh ghi điều khiển SPI.

7 6 5 4 3 2 1 0

Địa chỉ MSB LSB


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-25: Thanh ghi dữ liệu vào/ra UART.

1. Bit7: RXC: UART Receive Complete. Khi bit này được đặt thành “1” có
nghĩa là UART đã nhận một byte dữ liệu từ thanh ghi dịch bộ nhận. RXC
được xoá bằng việc đọc UDR.
2. Bit6: TXC: UART Transmit Complete. Bit này được đặt thành “1” khi một
byte dữ liệu đầy đủ bao gồm bit stop được dịch chuyển ra từ thanh ghi dịch
bộ truyền và không có dữ liệu mới được ghi vào UDR. TXC bị xoá thành
“0” bằng phần cứng bằng cách thực thi trình xử lý (handler) ngắt tương ứng
hoặc bằng phần mềm bằng cách ghi giá trị “1” vào bit TXC.
3. Bit5: UDRE: UART Data Register Empty, bit này được đặt thành “1”, khi
dữ liệu đã ghi vào UDR được truyền đến thanh ghi dịch bộ truyền. Bit này
chỉ cho thấy UDR đã sẵn sàng để nhận một byte mới.
4. Bit4: FE: Framing Error (lỗi khung truyền). Bit này được đặt thành “1”, khi
bit stop được đưa đến lại có giá trị bằng “0” (lẽ ra bit này phải bằng “1”).
Bit lỗi FE bị xoá khi bit stop được đưa đến có giá trị bằng “1”.
5. Bit 3: OR:Overrung Error (lỗi tràn). Bit này được đặt thành “1”, khi một dữ
liệu trong UDR không đươợcđọc trước khi một dữ liệu mới được dịch
chuyển vào UDR từ thanh ghi dịch bộ nhận UART (xem hình 3-26).

53
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Thanh ghi điều khiển UART.


1. Bit 7: RXCIE: RX Complete Interrupt Enable. Bit này khi đặt thành “1”
sẽ gây ra ngắt Receive Complete Interrupt khi bit RXC trong USR được
đặt thành “1” và các ngắt toàn cục được cho phép.

7 6 5 4 3 2 1 0

Địa chỉ RXC TXC UDRE FE OR


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo
Hình 3-26: Thanh ghi trạng thái UART.

2. Bit 6: TXCIE: TX Complete Interrupt Enable. Bit này khi đặt thành “1” sẽ
gây ra ngắt Transmit Complete Interrupt khi bit TxC trong USR được đặt
thành “1” và các ngắt toàn cục được cho phép.
3. Bit 5: UDRIE: UART Data Register Empty Interrupt Enable. Khi bit này
được đặt thành “1” và bit UDRE trong USR đặt thành “1”, thì ngắt UDRE
(Data Register Empty Interrupt) sẽ được thực thi khi các ngắt toàn cục được
cho phép.
4. Bit 4: RXEN: Receiver Enable (cho phép bộ nhận). Khi bit này được đặt
thành “1”, thì bộ nhận UART được cho phép.
5. Bit 3: TXEN: Transmiter Enable (cho phép bộ truyền). Bit này khi đặt
thành “1” sẽ cho phép bộ truyền. Khi cấm bộ truyền bằng cách ghi một giá
trị “0” vào bit này, thì bộ truyền sẽ bị cấm nhưng không phải trước khi bất
kỳ ký tự nào trong thanh ghi dịch bộ truyền hoặc thanh ghi dịch UDR được
đẩy ra ngoài.
6. Bit2: CHR9: 9 bit Characters (các ký tự 9 bit). Khi bit này được đặt thành
“1”, nghĩa là các ký tự được truyền và nhận có độ dài 9 bit bên cạnh bit
start và bit stop. Bit thứ 9 có thể được sử dụng như là bit stop pphụ thêm
hoặc bit parity.
7. Bit1: RXB8: Receive Data Bit 8. Khi CHR9 được đặt thành “1”, thì RXB8
là bit thứ 9 của ký tự đã nhận.
8. Bit 0: TXB8: Transmit Data Bit 8. Khi CHR9 được đặt thành “1”, thì TXB8
là bit dữ liệu thứ 9 trong ký tự được truyền, (xem hình 3 – 27)

54
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 Thanh ghi tốc độ Baud Uart.


Bộ phận ấn định tốc độ baud dùng cho UART là một bộ phận lưu trữ số
chia tần số, quy định mức độ nhanh chậm đối với việc truyền và nhận dữ liệu, tuân
theo phương trình sau đây:
BaudRate = Fclk/(16*(UBRR+1))
ở đây Fclk là tần số của đồng hồ hệ thống. UBRR là nội dung của thanh ghi tốc độ
baud UART (xem hình 3 – 28).

7 6 5 4 3 2 1 0

Địa chỉ RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8
I/O-$0A

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3- 27: Thanh ghi điều khiển UART

7 6 5 4 3 2 1 0

Địa chỉ MSB LSB


I/O-$34

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-28: Thanh ghi tốc độ baund UART

 Thanh ghi trạng thái và đièu khiển bộ so sánh analog ACSR.


Thanh ghi ACSR được sử dụng để điều khiển hoạt động của bộ so sánh
cũng như để giám sát lối ra của bộ so sánh.
1. Bit7: ACD – Analog Comparator Disable (cấm bộ so sánh analog). Khi
đặt thành “1” thì nguồn nuôi cho bộ so sánh bị ngắt (swiched off).
2. Bit 5: ACO: Analog Comaprator Output. Đây là lối ra của bộ so sánh.
3. Bit4: ACI: Analog Comparator Interrupt Flag (Cờ ngắt bộ so sánh
analog). Bit này được đặt thành “1” khi một sự kiện so sánh đã trigger
một trạng thái ngắt bộ so sánh được quy định bởi ACIS1 và ACIS0.
Ngắt bộ so sánh được thực thi nếu bit ACIE được đặt thành “1” và các
ngắt toàn cục được cho phép.

55
Đồ án tốt nghiệp Cơ điện tử 3 - K47

4. Bit3: ACIE: Analog Comparator Interrupt Enable (cho phép ngắt bộ so


sánh analog). Khi thành “1” thì ngắt bộ so sánh analog được cho phép.
Khi đặt thành “0”, thì ngắt bộ so sánh bị cấm.
5. Bit2: ACIC: Analog Comparator Input Capture Enable. Khi đặt thành
“1”, lối ra bộ so sánh được nối với mạch “input capture front-end” của
bộ định thời Timer1.
6. Bit1,0: ACIS1, ACIS0: Analog Comparator Interrupt Mode Select. Việc
kết hợp của các bit này lựa chọn các chế độ ngắt như được minh hoạ
trong bảng 3-10. Xem thêm trên hình 3-29.

2.2.3. Bộ nhớ EEPROM.


Tất cả các bộ điều khiển AVR đều có một bộ nhớ EEPROM trên chip. Dung
lượng bộ nhớ EEPROM thay đổi từ 64 byte trên bộ điều khiển AT90S1200.
Tiny10/12 đến 4 kbyte trên Mega 103. Bộ nhớ EEPROM được truy nhập qua các
thanh ghi truy nhập EEPROM, cụ thể là: Thanh ghi địa chỉ EEPROM (EEAR),
thanh ghi dữ liệu EEPROM (EEDR), và thanh ghi điều khiển EEPROM (EECR).
Đối với các bộ điều khiển có bộ nhớ EEPROM trên 256 byte, thanh ghi
EEAR trên thực tế là 2 thanh ghi: EEARL và EEARH. Thanh ghi EEAR (hoặc
như là một thanh ghi đơn hoặc như là một thanh ghi kép) được sử dụng để đặt địa
chỉ của bộ nhớ EEPROM mà dữ liệu cần ghi vào đó hoặc cần đọc ra từ đó. Thanh
ghi EEAR là một thanh ghi đọc/ghi, nghĩa là thanh ghi có thể được đọc để xem cái
gì đã được đặt vào địa chỉ EEPROM.
Thanh ghi EEDR là thanh ghi dữ liệu bộ nhớ EEPROM và là một thanh ghi
đọc/ghi. Khi ta muốn ghi dữ liệu vào bộ nhớ EEPROM, ta nạp các dữ liệu cần
thiết vào thanh ghi EEDR. Khi ta muốn đọc dữ liệu từ bộ nhớ EEPROM, thì ta
phải chờ sau khi quá trình ghi thực hiện xong, ta đọc thanh ghi EEDR dùng cho dữ
liệu.

ACIS1 ACIS0 Kiểu ngắt

0 0 Ngắt theo toggle của tín hiệu lối ra

0 1 Dự trữ

1 0 Ngắt theo sườn âm của tín hiệu lối ra

1 1 Ngắt theo sườn dương của tín hiệu lối ra


Bảng 3-10: Các giá trị đặt cho ACIS1 và ACIS0

56
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Thanh ghi EECR có các bit điều khiển cần thiết cho việc đọc và việc ghi vào
bộ nhớ EEPROM. Việc ghi vào bộ nhớ EEPROM không đơn giản như, chẳng hạn,
vào bộ nhớ SRAM. Thời gian truy cập để ghi đối với bộ nhớ EEPROM trong các
bộ vi điều khiển AVR nằm trong khoảng 2,5 đến 4ms, tuỳ thuộc vào điện áp nguồn
nuôi. Bit điều khiển EEWE trong thanh ghi EECR cho phép người dùng phát hiện
khi một lượng dữ liệu được yêu cầu trước đó đã được ghi vào bộ nhớ EEPROM và
liệu một byte mới có thể được ghi.
Đoạn các dòng lệnh sau đây minh họa cho thấy một byte dữ liệu có thể được
đọc từ bộ nhớ EEPROM như thế nào.

7 6 5 4 3 2 1 0

Địa chỉ ACD ACO ACI ACIE ACIC ACISI ACISO


I/O-$08

Giá trị 0 0 0 0 0 0 0 0
khởi tạo

Hình 3-29: Thanh ghi trạng thái và điều khiển của bộ so sánh analog

-------- EEPROM Data Read Start ---------


eep_notrdy:
sbic EECR,1 ; skip if EEWE clear
rjmp eep_notrdy ; waits until EEPROM ready
read:
out EEAR, ZL ; output address
sbi EECR, 0 ; set EERE (Read_strobe) low
nop ; mandatory 2 cycle delay nop
in read_reg, EDDR ; inputs data
---------------EEPROM--------------
Một đoạn mã dưới đây minh họa cho thấy một byte dữ liệu có thể được ghi
vào bộ nhớ EEPROM như thế nào. Để tránh xảy ra bất kỳ một lỗi nào với dữ liệu
khi ghi vào bộ nhớ EEPROM thì điều quan trọng phải bảo đảm là không có ngắt
xuất hiện trong quá trình ghi vào bộ nhớ EEPROM đối với bit EEWE và bit
EEMWE đang được đặt; do đó các ngắt toàn cục phải ưu tiên được cấm để có thể
tiến hành ghi trọn vẹn các bit EEWE và EEMWE được đặt, và sau khi đó thì các
ngắt được cho phép trở lại. Tuy nhiên, yêu cầu này sẽ chỉ được thực hiện nếu tất cả
các ngắt đều đang được sử dụng trong hệ thống. Nếu như các ngắt đang không
được sử dụng thì không cần thiết phải cho phép các ngắt.

57
Đồ án tốt nghiệp Cơ điện tử 3 - K47

------------------------------EEPROM---------------------------
eep_notrdy:
sbic EECR, 1 ; skip if EEWE clear
rjmp eep_notrdy ; waits until EEPROM ready
write:
out EEAR, ZL ; output address
out EEDR, write_data
cli ; disable all interrupts
sbi EECR, 1 ; set EEWE ( write – enable )
sbi EECR, 2 ; set EENNE ( master write – enable )
sei ; enable all interrupts
-----------------------------EEPROM data write end -------------------------
Có sự sai lạc dữ liệu trong EEPROM, chủ yếu do điện áp nguồn nuôi qua
thấp so với mức để bộ nhớ EEPROM có thể hoạt động bình thường. Theo nhà
cung cấp Atmel, giải pháp để tránh sai lạc dữ liệu đối với bộ nhớ EEPROM trên
chip cũng như việc tránh sai lạc dữ liệu trong EEPROM đối với các vi mạch
không có EEPROM trên chip.
Các biện pháp để tránh sai lạc dữ liệu đối với EEPROM có thể kể ra như sau:
1. Sử dụng mạch phát hiện brown-out ( BOD) để phát hiện các chu kỳ của
thời gian khi điện áp nguồn nuôi thấp và yêu cầu reset trong những
khoảng thời gian như vậy. Tiến hành Reset hệ thống là cách tốt hơn để
tiếp tục tiến hành mà vẫn có khả năng có thể xảy ra sai lạc dữ liệu trong
EEPROM.
2. Tránh ghi vào bộ nhớ EEPROM trong thời gian điện áp nguồn nuôi bị
giảm thấp. Giải pháp này nói ra thì dễ hơn làm vì khó mà biết được đó
là thời điểm nào.
3. Không nên sử dụng bộ nhớ EEPROM một cách lạm dụng. Nên hiểu rõ
đây là một giải pháp chỉ được sử dụng khi thực sự có yêu cầu. Tuy
nhiên, nên lưu ý là các thông báo về sai lạch dữ liệu trong EEPROM ở
địa chỉ $00 đã được nhắc tới, nên cần chú ý tránh sử dụng địa chỉ $00
của bộ nhớ EEPROM.

58
Đồ án tốt nghiệp Cơ điện tử 3 - K47

3.8. Cổng vào/ra.


Tất cả các bộ điều khiển AVR đều có một lượng lớn các cổng vào/ra (I/O), nằm
trong khoảng từ 3 bit trên vi điều khiển loại AT90S2323 đến 48 bit trên loại Mega
103. Tất cả các cổng lối ra (được đặt nhờ các bit) của các bộ điều khiển AVR có
thể chịu đựng dòng điện đến 20 mA, nên rất thích hợp đối với việc điều khiển trực
tiếp các LED vì không cần đến các mạch đệm bổ xung.
Tất cả các cổng vào ra (I/O) đều có 3 địa chỉ vào ra đi kèm với chúng. Ba địa
chỉ vào/ra được cần đến để đặt cấu hình cho các bit riêng biệt thành lối vào hoặc
thành lối ra; địa chỉ khác được cần đến để xuất dữ liệu tới các bit đó (hoặc tất cả)
được đặt cấu hình thành lối ra, và địa chỉ thứ ba được cần đến để đọc dữ liệu từ
các chân đó (hoặc tất cả ) được cấu hình thành lối vào.
Các cổng đó được đánh số là DDR, PORTx, PINx cho một cổng x cho trước.
Cổng DDRx là thanh ghi hướng dữ liệu. Khi ghi một mức “1” vào một bit ở DDR
làm cho bit tương ứng thanh bit lối ra trong PORTx.. Sau đó, để xuất ra một giá trị
“1” trên bit cổng, bit tương ứng có thể được đặt hoặc reset bằng cách sử dụng lệnh
CBI hoặc SBI hoặc một lệnh OUT.
Sử dụng CBI và sai để ghi vào các cổng
sa1 DDRB, 1 ; làm cho bit 1 thanh bit lối ra ở PORTB
CB1 PORTB, 1 ; làm cho bit 1 PORTB thành “0”
Sa1 PORTB, 1 ; làm cho bit 1 PORTB thành “1”
Một cách khác để thay đổi các giá trị cổng là sử dụng các lệnh IN và OUT:
Sử dụng lệnh OUT để ghi vào các cổng.
LDI R18, 0b00000010
OUT DDRB, R18 ; làm cho bit 1 thành bit lối ra ở PORTB
LDI R18. 0b00000000
OUT PORTB, R18 ; làm cho bit 1 PORTB thành 0
LDI R18, 0b00000010
OUT PORTB, R18 ; làm cho bit 1 PORTB thành 1.
Tương tự, để đọc dữ liệu ở chân lối vào của một cổng, ta sử dụng thanh ghi
PINx. Thanh ghi PINx được nối trực tiếp với các chân của cổng. Chân cổng có thể
được cấp tín hiệu để duy trì trạng thái theo cách tạo mức điện áp cao (pull-up) bên
trong bằng cách ghi giá trị “1” vào bit cổng ở các địa chỉ PORTx. Các điện trở
pull-up này có giá trị trong khoảng từ 30 kΩ và 150 kΩ. Giá trị tương ứng của
dòng điện pull-up nằm giữa 160 μA và 33 μA.

59
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Hình 3-30: Mô tả chi tiết một trong các bit cổng (PORTD4)

Ngược lại, nếu một giá trị “0” được ghi vào bit cổng ở địa chỉ PORTx, thì trạng
thái pull-up được loại bỏ và chân lối vào rời bỏ trạng thái thả nổi chuyển sang
trạng thái trở kháng cao.
; sử dụng lệnh IN để đọc từ các cổng
LDI R18, 0b00000000
OUT DDRB, R18 ; làm cho tất cả các bit thành bit lối vào ở PORTB
IN R18, PINB ; đọc các chân trên cổng PORTB, R18 có kết quả xem hình
3-30.

60
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.4. Bộ nhớ SRAM.


Bộ nhớ SRAM có trên hầu hết các bộ xử lý có giá thành cao trong họ vi
điều khiển AVR. Dung lượng của bộ nhớ SRAM thay đổ từ 128 byte đến 4Kb. Bộ
nhớ SRAM được truy nhập bằng cách sử dụng nhiều lệnh truy nhập dữ liệu gián
tiếp hoặc trực tiếp. Bộ nhớ SRAM cũng được sử dụng cho ngăn xếp. Thời gian
truy nhập bộ nhớ SRAM bằng 2 chu kỳ đồng hồ, như được minh hoạ trong hình 3-
6.
ldi r30, $60 clr r31
st z+, temp
; init the pointer into SRAM in 2313
; 60bex is start of SRAM in 2313
; now Z pointer is pointing to the SRAM
; store a value in register temp to SRAM
; increment the address
Tương tự, để đọc bộ nhớ SRAM, đoạn mã sau đây được sử dụng:
ldi r30, $60 ; khởi tạo con trỏ trong SRAM thành 60hex
clr r31 ; khởi tạo con trỏ trong SRAM thành 60hex
id temp, Z+ ; 60 hex là chỗ start của SRAM in 2313 DOW con
trỏ Z đang trỏ đến SRAM nạp một giá trị trong
thanh ghi emp từ SRAM và tăng địa chỉ thêm 1.

61
Đồ án tốt nghiệp Cơ điện tử 3 - K47

GIAO TIẾP VỚI SRAM NGOÀI.


Trên các bộ điểu khiển AVR cỡ lớn đều có khả năng kết nối với bộ nhở
SRAM ở bên ngoài. Khả năng này được minh hoạ trên hình 3-32. Để cho phép
truy nhập bộ nhớ SRAM ngoài trên PORTA và PORTC của các bộ điều khiển
cũng như tín hiệu ALE dùng cho việc phân kênh (demultiplexung) địa chỉ/ dữ liệu,
bit SRE( bit 7) trong thanh ghi MCUCR được đặt thành “1”. Thời gian truy nhập
mặc định đối với quá trình truy nhập lên SRAM ngoài là bằng 3 chu kỳ đồng hồ.
Thời gian này có thể làm tăng lên 4 chu kỳ đồng hồ bằng cách thiết lập bit SRW
(bit 6) trong thanh ghi MCUCR. Hình 3-32 minh hoạ sự truy nhập 3 chu kỳ thông
thường, còn hình 3-33 minh hoạ chu trình truy nhập mở rộng với một trạng thái
chờ bổ sung thêm.

Hình 3-31: kết nối bộ nhớ SRAM ngoài với bộ điều khiển AVR

62
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.5. Bộ định thời.


Bộ định thời trong vi điều khiển AVR có chức năng giống như một bộ định
thời hoặc một bộ đếm. Giống như một bộ định thời, tín hiệu giữ nhịp bên trong
hoặc một dẫn xuất của tín hiệu giữ nhịp đó được sử dụng để giữ nhịp bộ định thời,
trong khi giống như một bộ đếm, một tín hiệu từ bên ngoài từ chân của một cổng
được sử dụng để giữ nhịp bộ định thời / bộ đếm. Hình 3-43 minh hoạ bộ dồn kênh
(multiplexer) đóng vai trò lực chọn một trong nhiều nguồn tín hiệu đồng hồ dùng
cho bộ timer/counter. Bộ chia tần số dùng cho cả hệ thống timer/counter0 và
timer/counter1 được minh hoạ trên hình 3-34

Hình 3-32: Chu trình truy nhập SRAM ngoài và bộ điều khiển AVR không có các trạng
thái chờ.

Hình 3-33: Chu trình truy nhập SRAM ngoài và bộ điều khiển AVR có các trạng thái chờ
bổ xung.

63
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Sơ đồ khối của bộ timer/counter0 là 8 bit được mình hoạ trên hình 3-35. Bộ
timer/counter1 8 bit có thể lựa chọn nguồn tín hiệu đồng hồ từ CK, được chia từ
CK. hoặc một chân bên ngoài.Ngoài ra nó có thể được làm ngừng bằng cách sử
dụng các bit điều khiển trong thanh ghi điều khiển timer/counter0 TCCR0
Cờ trạng thái tràn (overflow) được tìm thấy trong thanh ghi cờ ngắt bộ
timer/counter TIFR. Các tín hiệu điều khiển được tìm thấy trong thanh ghi điều
khiển bộ time/counter0 TCCR0

Hình 3-34: Một mạch chia tần số đồng hồ dùng cho Timer0 cũng như Timer1

Việc đặt cho phép/cấm ngắt đối với Timer/Counter1 được tìm thấy trong
thanh ghi che ngắt Timer/Counter TIMSK \. Khi Timer/Counter1 được giữ nhip từ
bên ngoài, tín hiệu bên ngoài được đồng bộ với tần số của bộ dao động của CPU.
Để đảm bảo lấy mẫu chính xác đối với tín hiệu giữ nhịp bên ngoài, thời gian cực
tiểu giữa 2 lần xảy ra sự chuyển mức tin hiệu đồng hồ ngoài ít nhất cũng phải bằng
một chu kỳ xung đồng hồ bên trong CPU. Tín hiệu giữ nhịp bên ngoài được lấy
mẫu theo sườn dương (dốc lên ) bằng xung đồng hồ bên trong CPU.
Bộ Timer/Counter0 8 bit thể hiện cả độ phân giải cao lẫn dộ chính xác cao và luôn
ưu tiên số chia tần số thấp hơn (xem hình 3-36)

64
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Hình 3-35: Sơ đồ khối của Timer/counter0

65
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.6. Bộ truyền nhận UART


Hình 3-37 minh hoạ sơ đồ khối truyền của bộ truyền nhận UART. Việc
truyền dữ liệu được khởi tạo bằng cách ghi dữ liệu vào thanh ghi, dữ liệu I/O, ký
hiệu là UDR. Dữ liệu đựoc truyền từ UDR đến thanh ghi dịch truyền khi :

Hình 3-36: Sơ đồ khối của bộ Timer/Counter1

+ Một ký tự mói đã được ghi vào UDR sau khi Bit stop (bit dừng) từ ký tự
trước đó đã được dịch chuyển ra. Thanh ghi dịch chuyển ra được nạp
ngay lập tức
+Một ký tự mới đã được ghi vào UDR trước ghi Bit stop từ ký tự trước đã
được dịch đi. Thanh ghi dịch được nạp khi Bit stop của ký tự đang được
truyền đã được dịch chuyển ra
Nếu thanh ghi dịch bộ truyền 10 (11) bit đang trống thì dữ liệu được truyền từ
UDR đến thanh ghi dịch. Ở thời điểm này bit UDRE (UART data register empty)

66
Đồ án tốt nghiệp Cơ điện tử 3 - K47

trong thanh ghi trạng thái UART, USR được đặt. Khí bit này đặt thành 1 bộ UART
dẵn sàng nhận ký tự tiếp theo. Vào cùng một thời điểm, khi dữ liệu được truyền từ
UDR đến thanh ghi dịch bộ truyền 10 (11) Bit, Bit 0 của thanh ghi dịch bị xoá
(start bit) và bit 9 hoặc 10 được đặt (stop bit).

Hình 3-37: Sơ đồ khối của bộ truyền trên UART


Nếu như một từ dữ liệu 9 bit được lựa chọn (bit CHR9 trong thanh ghi điều
khiển UART, UCR được đặt), bit TXB8 trong thanh ghi UCR được truyền vào bit
9 trong thanh ghi dịch bộ truyền. Theo nhịp của đồng hồ tốc độ baud sẽ diễn ra
cuộc truyền đến thanh ghi dịch, bit start bị dịch chuyển ra thanh TXD. Sau đó kế
tiếp là dữ liệu, LSB trước tiên. Khi bit stop đã được dịch chuyển ra, thanh ghi dịch
được nạp nếu bất kỹ dữ liệu nào đã được ghi vào thanh ghi UDR trong khoảng
thời gian truyền. Trong thời gian nạp bit UDRE được đặt thành 1. Nếu như không
có dữ liệu mới trong thanh ghi UDR để truyền đi khi bit stop được dịch chuyển ra,
cờ UDRE sẽ giữ nguyên trạng thái được đặt cho đến khi thanh ghi UDR được ghi
một lần nữa .

67
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Hình 3-38: Sơ đồ khối của bộ nhận UART

Khi không có dữ liệu mới cần được ghi, và bit stop đã có mặt trên TXD đối với
mỗi một chiều dài bit, cờ TX complete, TXC, trong thanh ghi USR được đặt thành
1. Bit TXEN trên thanh ghi VCR cho phép bộ truyền UART được đặt thành 1. Khi
bit này bị xoá thành 0 thì chân PDI có thể được sử dụng cho thao tác I/0 chung.
Khi đặt thành 1 bộ truyền trong UART sẽ được nối đến chân PD1, chân này bắt
buộc trở thành một chân lối ra không đếm xỉa đến việc đặt của bit 1 trong DDRD.
Hình 3-38 minh hoạ sơ đồ khối của phần bộ phận trong UART. Khối logic
front – end cuẩ bộ nhận lấy mẫu tín hiệu trên chân RXD ở tần số bằng 16 lần tần
số tốc độ baud. Khi đường dẫn không có tín hiệu truyền, một mẫu đơn lẻ của giá
trị logic 0 sẽ được dịch như sườn âm (dốc xuống) của một bit start, và dãy phát
hiện bit start được khởi tạo.
Hãy xem như mẫu 1 là mẫu 0 đầu tiên. Tiếp theo là sự chuyển mức từ 1 sang 0,
Bộ phận lấy mẫu chân RXD ở các mẫu 8, 9 và 10 .Nếu như 2 hoặc nhiều hơn

68
Đồ án tốt nghiệp Cơ điện tử 3 - K47

trong 3 mẫu đó được tìm thấy và có giá trị logic bằng 1, thì bit start bị loại bỏ như
một xung nhiễu và bộ phận bắt đầu theo dõi sự chuyển mức kế tiếp từ 1 sang 0.
Tuy nhiên nếu một bit start hợp lệ được phát hiện, thì việc lấy mẫu các bit dữ liệu
kế tiếp bit start hợp lệ được thực hiện. Các bit này cũng được lấy mẫu ở các mẫu
8, 9 hoặc 10. Giá trị logic được tìm thấy it nhất 2 trong số 3 mẫu được lấy làm giá
trị bit. Tất cả các bit đựoc dịch chuyển vào thanh ghi dịch bộ truyền giống như
chúng đã được lấy mẫu.
Khi bit stop được đưa vào bộ phận nhận, thì đa số trong số 3 mẫu cần phải
bằng 1 để tiếp nhận bit stop. Nếu như 2 mẫu hoặc nhiều hơn là các giá trị logic 0,
thì cờ lỗi khung truyền (FE) trong thanh ghi trạng thái UART (USR) được đặt
thành 1. Trước khi đọc thanh ghi UDR, người dùng sẽ phải luôn luôn kiểm tra bit
lỗi FE để phát hiện các lỗi khung truyền. Tuỳ thuộc vào việc có hay không một bit
stop hợp lệ được phát hiện ở cuối cảu một chu kỳ tiếp nhận, dữ liệu được truyền
đến UR và cờ RXC trong thanh ghi USR được đặt. UDR trên thực ttế là hai thanh
ghi tách biệt về mặt vật lý, một dùng cho dữ liệu được truyền, một dùng cho dữ
liệu được nhận. Khi UDR được đọc, thanh ghi dữ liệu nhận (Receive Data
Register) được truy nhập, và khi UDR được ghi, thanh ghi dữ liệu truyền
(Transmit Data Register) được truy nhập. Nếu như từ dữ liệu 9 bit được lựa chọn
(bit CHR9 trong thanh ghi điều khiển UART, OCR được đặt thành 1), bit RXB8
trong thanh ghi UCR được nạp bằng bit 9 trong thanh ghi dịch truyền khi dữ liệu
được truyền tới UDR. Nếu như sau khi đã nhận được một ký tự, thanh ghi UDR
không được đọc kể từ lần nhận cuối cùng, cờ tràn OverRun (OR) trong thanh ghi
UCR được đặt thành “1”. Điều này có nghĩa là byte dữ liệu cuối cùng đã dịch
chuyển vào trong thanh ghi dịch sẽ không được truyền đến UDR và bị thất lạc. Bit
OR được đệm và được cập nhật khi byte dữ liệu hợp lệ trong thanh ghi UDR được
đọc.
Như vậy người dùng luôn luôn phải kiểm tra bit OR (HOẶC) trước tiên, sau
khi đọc thanh ghi UDR, để phát hiện bất kỳ lỗi tràn nào xuất hiện. Khi bit RXEN
trong thanh ghi UCR bị xóa thành “0”, thì bộ nhận bị cấm. Điều đó có nghĩa là
chân PD0 có thể được sử dụng làm một chân I/O chung.
Khi RXEN được đặt thành “1”, bộ nhận UART sẽ được nối với PD0, chân này
bị buộc phải trở thành một chân lối vào không đếm xỉa gì đến việc đặt của bit
DDD0 trong DDRD. Khi PD0 bị bắt buộc trở thành lối vào bởi UART, bit
PORTD0 có thể vẫn được sử dụng để điều khiển điện trở pull-up trên chân. Khi bit
CHR9 trong thanh ghi UCRđược đặt, các ký tự được truyền và được nhận có độ
dài 9 bit, công them bit start và bit stop. Bit dữ liệu thứ 9 cần được truyền là bit
TXB8 trong thanh ghi UCR. Bit này cần phải được đặt thành ghía trị mong muốn
trước khi một cuộc truyền được khởi tạo bằng việc ghi vào thanh ghi UDR. Bit thứ
9 nhận được là bit RXB8 trong thanh ghi UCR.

69
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.7. Cấu trúc ngắt.


Ngắt là một cơ cấu điều khiển dòng lệnh, cơ cấu này được thiết kế trên hầu
hết các bộ điều khiển. Trong quá trình giao tiếp của hệ thống bộ xử lý với thế giới
bên ngoài, nhiều sự việc xảy ra theo cách không đồng bộ, chẳng hạn người dùng
có thể đã nhấn một công tắc để thực hiện một công việc nào đó, trong khi một byte
dữ liệu có thể đã đi đến cổng nối tiếp. Điều này gây khó khăn cho hoạt động của
bộ xử lý khi mà nó phải kiểm tra tất cả các thiết bị để giám sát sự di chuyển của dữ
liệu. Ngược lại, mọi việc sẽ trở nên tốt hơn nếu các thiết bị này có thể “loan báo”
sự đến nơi của dữ liệu. Đây là tất cả những gì mà cơ chế ngắt phải thực hiện. Thiết
bị ngoại vi sẽ “ngắt” việc thực thi của chuong trình chính, và bộ xử lý tạm thời
ngưng việc thực thi chương trình bình thường để thẩm tra nguồn ngắt và để thực
hiện những thao tác đáp ứng cần thiết. Sauk hi đã hoàn thành những thao tác cần
thiết, việc thực thi chương trình đã bị ngắt lại tiếp tục. Chương trình ngắt chỉ đơn
giản giống như một chương trình con (subrontine), ngoại trừ một đặc điểm là việc
thực thi của đoạn chương trình ngắt này không bị bộ xử lý chặn trước (đoán trước)
là sẽ xuất hiện ở một thời điểm cụ thể nào.
Bộ vi điều khiển AVR có rất nhiều cấu trúc ngắt. Khả năng ngắt đã được
chu cấp cho hầu hết các thiết bị ngoại vi sao cho chương trình chính không phải
thường xuyên kiểm tra các thiết bị này.
Một loạt các sự kiện có thể kể ra khi một ngắt xuất hiện là:
1. Thiết bị ngoại vi ngắt bộ xử lý.
2. Việc thực thi lệnh hiện tại được hoàn thành.
3. Địa chỉ của lệnh tiếp theo được lưu trữ trên ngăn xếp (hoặc một địa chỉ
ngăn xếp phần cứng hoặc mỗi ngăn xếp phần mềm)
4. Địa chỉ của ISR (đoạn chương trình ngắt) được nạp vào bộ đếm chương
trình.
5. Bộ xử lý thực thi ISR.
6. Việc hoàn thành các thao tác thực thi ISR được chỉ báo bằng lệnh RETI
(trả lại từ ngắt).
7. Bộ xử lý nạp bộ đếm chương trình với giá trị được lưu trữ trên ngăn xếp
và việc thực thi chương trình bình thường lại tiếp tục.
Bởi vì ngắt có thể xuất hiện bất kỳ lúc nào, nên trạng thái bộ xử lý (các cờ,
v.v..) cần phải được lựu trữ sao cho việc thực thi chương trình bình thường
(nomal) có thể tiếp tục ngay sau khi đoạn chương trình ISR được hoàn tất. Trạng
thái của bộ xử lý được chứa trong thanh thi SREG. Thanh ghi ISR cần phải lưu trữ
SREG trước khi thực thi bất kỳ một nệnh nào khác, và trước khi trở lại với việc
điều kiển chương trình chính, cần phải khôi phục lại thanh ghi SREG. Yêu cầu này
có thể thực hiện theo hai cách: hoặc là SREG được sao chép sang một thanh ghi

70
Đồ án tốt nghiệp Cơ điện tử 3 - K47

khác, ký hiệu là RI, thanh ghi này cần phải không được phục vụ cho bất kỳ một
mục đích nào khác, và trước khi ISR thực thi lệnh RETI, RI được sao chép ngược
trở lại SREG. Một cách khác để lưu trữ SREG là lưu nó trên ngăn xếp (bằng cách
sử dụng lệnh PUSH SREG) và su đó trước khi thực thi lệnh RETI, giá trị SREG
được sao chép ngược trở lại từ ngăn xếp (bằng cách sử dụng lệnh POP SREG).
Phương pháp này chỉ có thể áp dụng cho những bộ xử lý có ngăn xếp tổ chức bằng
phần mềm. Loại AT90S1200, chẳng hạn, không thể áp dụng phương thức này để
lưu trữ nội dung thanh ghi SREG.
Hình 3-39 minh họa chương trình chính được ngắt như thế nào. Cũng có khả
năng ngắt một ISR nếu một ngắt khác xuất hiện và cờ ngắt toàn cục đã được đặt
thành “1” bên trong ISR dùng cho ngắt 1 (bằng cách sử dụng lệnh SEI). Trong
trường hợp này, ngắt ISR1 bị ngắt và ISR khác, ISR2, thực thi. Việc thực thi ISR1
lại tiếp tục sau khi ISR2 kết thúc, và sau khi thực thi xong ISR1, chương trình
chính lại tiếp tục thực thi.
Binh thường thì sau khi một ngắt xuất hiện và đang được phục vụ bởi thanh ghi
ISR tương ứng, các ngắt toàn cục tự động bị cấm (tương đương với việc thực thi
lệnh CLI); tuy nhiên, vẫn có khả năng cho phép các ngắt khi một ISR đang thực
thi bằng việc thực thi lệnh SEI trong ISR. Nếu như ngắt khác xuất hiện trong
khoảng thời gian khi một ISR đã đang hoạt động, thì nó sẽ được phục vụ bằng việc
ngắt đoạn chương trình ISR ban đầu.
Tính ưn tiên của các ngắt được quy định bởi cách gán các vectơ ngắt. Một
vectơ ngắt ở địa chỉ thấp hơn trong bộ nhớ chương trình có mức độ ưu tiên cao
hơn. Mức độ ưu tiên của ngắt được sử dụng để quyết định xem ngắt nào sẽ được
phục vụ trước tiên nếu như có nhiều ngắt đang chờ xử lý ở bất kỳ thời điểm nào.
Tinh huống này có thể xuất hiện khi ngắt toàn cục đã bị cấm trong một hệ thống để
cho phép một số phần cấp thiết (critical) của chương trình được thực thi. Sau khi
tình huống gây khẩn cấp đã kết thúc, chương trình cho phép (enable) các ngắt toàn
cục. Bây giờ, khi phần cấp thiết đã được thực thi, hai ngắt - một ngắt Interrupt0
ngoài và ngắt UART Rx Complete - đều đã xất hiện. Khi đó, do ngắt Interrrupt0
ngoài có tính ưu việt cao hơn các ngắt UART nên ISR tương ứng với ngắt
Interrupt0 ngoài sẽ được thực thi, và tiếp đó, thanh ghi ISR dùng cho ngắt UART
sẽ được thực thi.

71
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Hình 3-39. Thực thi các lệnh ngắt lồng nhau


Địa chỉ thấp nhất của bộ nhớ chương trình được gán cho vectơ reset và ngắt.
Đối với loại AT90S2313, cá vectơ này tương ứng với địa chỉ bộ nhớ chương trình
như mô tả trên bảng 3-11 (có thể xem thêm bảng 3-1).

Địa chỉ Mã nhãn Giải thích

$000 rjmp RESET Reset Handler

$001 rjmp EXT_INT0 IRQ0 Handler

$002 rjmp EXT_INT1 IRQ1 Handler

$003 rjmp TIM_CAPT1 Timer1 Capture Handler

$004 rjmp TIM_COMP1 Timer1 Compare Handler

$005 rjmp TIM_OVF1 Timer1 Overflow Handler

$006 rjmp TIM_OVF0 Timer0 Overflow Handler

$007 rjmp UART_RXC UART RX Complete Handler

$008 rjmp UART_DRE UDR Emplty Handler

$009 rjmp UART_TXC UART TX Complete Handler

$00a rjmp ANA_COMP Analog Comparator Handler

Bảng 3-11: Địa chỉ trên bộ nhớ chương trình

72
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Một điều rất đáng quan tâm khi sử dụng các ngắt là bộ xử lý có thể đáp ứng
một ngắt nhanh đến mức nào. Câu trả lời phụ thuộc rất nhiều vào kiến trúc của bộ
xử lý. Đối với các bộ điều khiển AVR, việc thực thi ngắt đáp ứng đối với tất cả các
ngắt AVR đã được cho phép ít nhất là 4 chu kỳ đồng hồ. Bốn chu kỳ đồng hồ sau
khi cờ ngắt đã được đặt, chương trình vectơ địa chỉ dùng cho đoạn chương trình
xử lý ngắt hiện tại được thực thi. Trong khoảng thời gian 4 chu kỳ này, bộ đếm
chương trình (2 byte) được đẩy lên ngăn xếp, và con trỏ ngăn xếp bị giảm đi 2.
Vectơ thường là một lệnh nhẩy tương đối đến đoạn chương trình ngắt, và thao tác
nhảy này chiếm 2 chu kỳ đồng hồ. Nếu như một ngắt xuất hiện khi đang thực thi
một lệnh chiếm nhiều chu kỳ (multil cycle), lệnh này được hoàn thành trước khi
ngắt được phục vụ. Việc quay trở lại từ một đoạn chương trình xử lý ngắt chiếm 4
chu kỳ đồng hồ. Trong 4 chu kỳ đồng hồ này bộ đếm chương trình (2 byte) được
đẩy ngược trở lại từ ngăn xếp, con trỏ ngăn xếp được tăng thêm 2 và cờ I trong
SREG được đặt. Khi vi điều khiển AVR thoát ra khỏi một ngắt, nó sẽ luôn trở về
với chương trình chính và chấp nhận lệnh kế tiếp trước khi bất kỳ ngắt đang chờ
xử lý được phục vụ.

73
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.8. Bộ so sánh Analog.


Bộ so sánh analog so sánh các giá trị điện áp ở lối vào, cụ thể là ở lối vào
AIN0 (AC+) và AIN1 (AC-) với nhau. Nếu như điện áp ở lối vào AIN0 lớn hơn lối
vào AIN1 thì lối ra của bộ so sánh analog ACO (Analog Comparator Out) được
đặt lên mức 1. Lối ra này có thể được sử dụng cho bộ timer/counter1 để triger
hoặc xoá ngắt bộ so sánh analog trên hình 3-40 là sơ đồ khối của bộ so sánh
analog.

Hình 3-40: Sơ đồ khối của bộ so sánh analog

Bộ so sánh analog được điều khiển qua thanh ghi điều khiển và trạng thái bộ so
sánh analog, thường được viết tắt là ACSG, ở địa chỉ $08 trong vùng địa chỉ vào/ra
hoặc ở địa chỉ $28 trong vùng địa chỉ bộ nhớ dữ liệu.
Sự xắp xếp chân lối vào bộ so sánh analog ở các vi điều khiển khác nhau được
liệt kê trong bảng 3-12.

Loại vi điều khiển AIN0 (AC+) AIN1 (AC-)

AT$90S1200/2313 PB0 PB1

AT90S 4414/8515-8535 PB1 PB3

Atmega 103/603 PE2 PE3

Bảng 3-12: Sự xắp xếp các chân lối vào của bộ so sánh analog

74
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.9. Bộ biến đổi A/D bên trong.


Các vi điều khiển AVR loại AT90S4434-8535/8535 và ATMEGA 103/603 có một
bộ biến đổi tương tự/số ADC với độ phân giải là 10bit. Ngoài ra, bên cạnh bộ biến đổi
ADC còn có bộ dồn kênh với 8 lối vào, mỗi lối có thể được dẫn riêng lẻ tới bộ hiển thị
ADC. Xem hình 3-41.

Hình 3-41: Sơ đồ khối của bộ biến đổi ADC 10 bit với 8 lối vào.

75
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Thanh ghi lựa chọn bộ dồn kênh ADC: ADMUX $07 ($27)

Thanh ghi trạng thái và điều khiển ADC: ADCSR $06 ($26)

Thanh ghi dữ liệu ADC (HIGH): ADCH $05 ($25)

Thanh ghi dữ liệu ADC (LOW): ADCL $04 ($24)

Hình 3-42: Các thanh ghi điều khiển của bộ biến đổi ADC

Bộ biến đổi ADC được điều khiển qua 4 thanh ghi ADMUX, ADCSR, ADCH và
ADCL trong vùng địa chỉ vào/ra (xem hình 3-43). Bằng thanh ghi ADMUX một trong 8
kênh được lựa chọn để biến đổi tương tự/số. Bộ biến đổi ADC có thể hoạt động trong 2
chế độ:
- Quá trình biến đổi được người dùng khởi động.
- Quá trình biến đổi diễn ra liên tục.

Tín hiệu AT90S4434/8535 Atmega 103/603

ADC0 PA0 PF0

ADC1 PA1 PF1

ADC2 PA2 PF2

ADC3 PA3 PF3

ADC4 PA4 PF4

ADC5 PA5 PF5

ADC6 PA6 PF6

ADC7 PA7 PF7

Bảng 3-13: Sắp xếp các chân lối vào của bộ biến đổi ADC.

Việc kết thúc quá trình biến đổi, nghĩa là thời điểm mà một tín hiệu analog
được số hoá và sẵn sàng chờ xử lý tiếp tục, sẽ được báo hiệu qua một số cờ trong
thanh ghi trạng thái ADC (ADCSR). Trong thanh ghi ADCSR này, người dùng có
thể lựa chọn một trong hai chế độ. Kết quả của quá trình biến đổi A/D được đặt ở
các thanh ghi ADCH (bit 8 và 9) và ADCL (bit 0 đến 7).
Sự sắp xếp các chân lối vào của bộ biến đổi ADC được liệt kê trong bảng 3-13.

76
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.10.Bộ định thời Watchdog bên trong.


Bộ định thời watchdog là một bộ định thời điều khiển được và được sử
dụng làm thiết bị đánh thức trong trường hợp phần mềm bị rơi vào một hoặc một
số vòng lặp vô tận hoặc trong trường hợp việc thực thi chương trình bị mắc lỗi. Bộ
định thời mạch watchdog có một lối ra, có khả năng đặt lại bộ điều khiển. Hình 3-
43 minh hoạ sơ đồ khối của bộ định thời mạch watchdog.

Hình 3-43: Sơ đồ khối của bộ định thời watchdog

Mạch định thời watchdog timer được giữ nhịp từ một bộ dao động RC riêng biệt trên
chip. Bằng cách điều khiển mạch chia tần số watchdog timer, khoảng thời gian reset
mạch watchdog có thể được hiểu chính như minh hoạ trong bảng 3-8 (trang 64). Các
khoảng reset mạch watchdog cũng phụ thuộc vào điện áp nguồn nuôi.
Mạch watchdog đặt lại lệnh. WDR, reset mạch watchdog timer. Tám chu kỳ chu trình
đồng hồ khác nhau có thể được lựa chọn để xác định chu kỳ đặt lại (reset). Nếu như
khoảng thời gian reset kết thúc mà không có sự xuất hiện các thao tác reset watchdog
khác, thì bộ điều khiển AVR được đặt lại và khởi động quá trình thực hiện chương trình
từ vectơ reset. Để tránh việc cấm không được định trước của mạch watchdog, một dãy
lệnh ngắt mạch (turn-off) đặc biệt cần phải được tieps theo khi mạch watchdog bị cấm,
như được minh hoạ trong phần mô tả về mạch watchdog, phần về thanh ghi điều khiển bộ
định thời (Timer Control Register).

77
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2.2.11.Chế độ hoạt động tiết kiệm năng lượng.


Bộ điều khiển AVR có nhiều khả năng để giảm năng lượng tiêu thụ. Để
chuyển sang trạng thái ngủ (sleep mode), bit SE trong MCUCR (thanh ghi điều
khiển bộ xử lý) phải được đặt, nghĩa là có giá trị bằng “1” và một lệnh SLEEP cần
phải được thực thi. Nếu một ngắt đã cho phép xuất hiện trong khi MCU đang
trong trạng thái ngủ, thì MCU sẽ thức dậy, thực thi đoạn chương trình (rountine)
ngắt, và lại tiếp tục thực thi lệnh kế tiếp theo SLEEP. Nội dung của thanh ghi,
SRAM, và bộ nhớ I/O vẫn được giữ nguyên. Nếu một tín hiệu reset xuất hiện
trong trạng thái ngủ, thì MCU sẽ thức dậy và thực thi từ vectơ reset.
Khi bit SM bị xóa (bằng 0), thì lệnh SLEEP bắt buộc MCU chuyển sang
chế độ nghỉ, làm ngừng hoạt động của CPU nhưng cho phép bộ Timer/count
watchdog, và ngắt hệ thống tiếp tục hoạt động. Đặc tính này cho phép MCU đánh
thức từ các ngắt được trigger từ bên ngoài cũng như ngắt bên trong giống như ngắt
trành bộ định thời và đặt lại (reset) watchdog. Nếu sự đánh thức từ ngắt bộ so sánh
analog không được yêu cầu, thì bộ so sánh analog có thể bị ngắt nguồn nuôi bằng
cách đặt bit ACD vào thanh ghi điều khiển và trạng thái bộ so sánh analog ACSR.
Biện pháp này làm giảm dòng tiêu thụ trong chế độ nghỉ (idle). Khi MCU bị đánh
thức khỏi chế độ nghỉ, đơn vị CPU khởi động chương trình chấp hành ngay lập
tức.
Khi bit SM được đặt (giá trị bằng “1”), lệnh SLEEP bắt buộc MCU chuyển
sang chế độ tiết kiệm năng lượng hay giảm dòng tiêu thụ (power-down). Trong
chế độ này, bộ dao động ngoài bị dừng hoạt động, trong khi các ngắt ngoài và
mạch watchdog (nếu đang ở trạng thái cho phép hoạt động) vẫn tiếp tục hoạt động.
Chỉ thao tác đặt lại (reset) bên ngoài, thao tác đặt lại watchdog (nếu đang ở trạng
thái cho phép hoạt động), hoặc ngắt theo mức ngoài lên INT0 hoặc INT1 mới có
thể đánh thức (wake up) MCU. Chú ý rằng khi một ngắt trigger theo mức (level-
triggered) được sử dụng cho việc đánh thức khỏi trạng thái tiết kiệm năng lượng
(để đánh thức từ trạng thái tiết kiệm năng lượng, thì mức thấp hơn cần phải được
giữ trong một khoảng thời gian dài hơn thời gian trễ dài nhất (time-out) đối với
thao tác reset TOUT. Nếu không thì thiết bị sẽ không thức dậy. Hình 3-44 minh
họa mức tiêu thụ dòng điện của bộ xử lý Tinny22 trong chế độ hoạt động kích hoạt
và chế độ tiết kiệm năng lượng.

78
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Hình 3-44: Dòng điện tiêu thụ bởi bộ xử lý Tinny22 trong chế độ hoạt động đang hoạt
động bình thường và chế độ tiết kiệm năng lượng.

79
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CHƯƠNG 3.
CÁC LINH KIỆN SỬ DỤNG TRONG MẠCH
3.1. C1815.
Tran C1815 là một khóa đóng mở thông thường ứng với mạch công suất
nhỏ gồm 3 cực C,B,E ( collector,base,emitter).. Khi có tín hiệu điều khiển vào cực
B thì sẽ có dòng chảy từ C->E. Thông số điện áp và dòng điện khi nối mạch được
tra theo bảng dưới.
Collector

Base Emitter

3.2. A1015.
Tran A1015 là một khóa đóng mở thông thường ứng với mạch công suất
nhỏ gồm 3 cực C,B,E( collector,base,emitter). Khi có tín hiệu điều khiển vào cực

80
Đồ án tốt nghiệp Cơ điện tử 3 - K47

B thì sẽ có dòng chảy từ E->C. Thông số điện áp và dòng điện khi nối mạch được

tra theo bảng dưới.

3.3. IC 74HC14.
* Giới thiệu IC74HC14:
74HC14 là IC dùng trong việc chuyển đổi mức logic với tốc độ cao được
sản xuất trên công nghệ CMOS IC hoạt động tương tự như LSTTL trong khi vẫn
duy trì được sự tiêu tán công suất thấp .
74HC14 giống như nhiều đường nhận tín hiệu đầu vào, nó sẽ nhận các tín
hiệu đầu vào và có trễ tại đầu ra.
Tất cả tín hiệu đầu vào của 74HC14 phải được bảo vệ bởi mạch chống sự
xả tĩnh hoặc áp vượt quá qui định
* Các thuộc tính cơ bản 74HC14:
- Tốc độ cao……………. tpd = 11ns (typ.) at Vcc=5v
- Tiêu tán công suất thấp
- Đầu ra có thể kích được 10 tải TTL
- Có trở kháng đầu ra đối xứng : IOH = IOL = 4mA (min)
- Khoảng hoạt động của áp rộng từ 2v-6v
- Giảm tạp nhiễu cao
- Chân và chức năng tương thích với 74LS14
* Cấu trúc chân của 74HC14: * Bảng giá trị :

81
Đồ án tốt nghiệp Cơ điện tử 3 - K47

H : High Level Voltage


L : Low Level Voltage
* Chức năng các chân:
Gồm có 2 chân Vcc(14) và GND(7) nối lên
nguồn và mass ,chân 14 được nối lên 5v còn chân 7
được nối 0v
Gồm 6 đường tín hiệu đầu vào và 6 đường
tín hiệu đầu ra như hình bên:

3.4. OPTO P521.

Đối với động cơ bước dùng dòng chỉ 0,5 A trở xuống thì vi điều khiển có
thể điều khiển trực tiếp qua con phân kênh 8243 ,nhưng đối với mạch điều khiển
động cơ bước dùng dòng khoảng từ 0,5 đến 20A thì vi điều khiển không thể điều
khiển trực tiếp mà nó phải điều khiển gián tiếp qua cách ly quang (như hình vẽ ).
Nó cách ly hai nguồn hoàn toàn đó là nguồn bên vi điều khiển và nguồn bên cung
cấp cho động cơ vì vậy mà vi điều khiển vẫn hoạt động bình thường mà không bị
ảnh hưởng của nguồn cấp cho động cơ.

3.5. Rơle cuộn hút.

82
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Cấu tạo như 1 rơle thông thường khi cung câp điện cho cuộn hút thi role sẽ
đảo tiếp điểm :bình thường 3 tiếp xúc với 4 , 6 tiếp xúc với 5 ,khi cấp điện cho
cuộn hút 1-8 thi 3 tiếp xúc với 2, 6 tiếp xúc với 7

3.6. MAX232.

Vì tín hiệu cổng COM thường ở mức +12V,-12V không tương thích với
điện áp của mạch điều khiển bên ngoài là +5V nên ta phảI chọn vi mạch chuyển
đổi điện áp cho phù hợp , ta chọn vi mạch có sử dụng Max 232

83
Đồ án tốt nghiệp Cơ điện tử 3 - K47

3.7. MAX485.

Đặc tính của Max485:


U ?
8

4 6
D I A
VC C

7
3 B
D E
G N D

2 1
R E R O

< V a lu e >
5

Trên hình vẽ là sơ đồ chân Max485/SN75176 chúng ta có thể sử dụng


Max485 hoặc SN75176 đều được cả 2 đều có đặc tính giống nhau, nhung chúng
do 2 hãng khác nhau sản xuất Max485 do hang Maxim sản xuất còn SN75176 do
Texas sản xuất, nhưng khi sử dụng Max485 thi tiết kiệm được năng luợng hơn do
no it tốn dung hơn so với SN75176 nhung giá thành thì cao hơn gấp 4 lần .
Chúng ta có thể xem sơ đồ chân của Max485:
- 2 chân 5,8 được dung để cấp nguồn cho Max485 hoạt động.
- Chân 5 được nối lên (+) nguồn cấp cho nó (4.75v<V<5.25v).
- Chân 8 được nối xuống đất (-) nguồn.
- 2 Chân 2,3 là 2 chân điều khiển cho phép quá trình truyền nhận.
- Chân 1 chân nhận data.
- Chân 4 truyền data.
- 2 chân A,B là 2 chân so sánh điện áp.

84
Đồ án tốt nghiệp Cơ điện tử 3 - K47

3.8. ATMEGA16

- Có 16 K (Flash).
- 512 B( EEPROM).
- 1 K (SRAM).
- Loại này 40 chân trong đó có 32 chân vào ra dữ liệu chia làm 4 port
A,B,C,D. các chân này đều có chế độ pull_up resitors.
- Giao tiếp ISP .
- Giao diện I2C.
- Có 8 kênh ADC 10 bit .
- Một bộ so sánh analog.
- Có 4 kênh băm xung (PWM).
- 3 bộ timer. bộ timer 0 và 2 ở chế độ 8 bit, bộ timer 1 16 bit.
- Một bộ định thời watchdog.
- Một bộ truyền nhận UART lập trình được.

Cách sử dụng và tính năng các chân khi tính toán thiết kế mạch:
+ Vcc và Gnd 2 chân cấp nguồn cho vi điều khiển hoạt động
+ Reset chân khởi động lại mọi hoạt động của vi diều khiển
+2 chân XTAL1, XTAL2 các chân tạo bộ dao động ngoài cho vi điêù khiển
, các chân này được nối với thạch anh (thường sử dụng loại 4M) , tụ gốm
(thường sử dụng loại 22p).

85
Đồ án tốt nghiệp Cơ điện tử 3 - K47

+ chân Vref chân này thường được nối lên 5v(Vcc) , nhưng khi sử dụng bộ
ADC thì chân này làm điện thế so sánh , khi đó chân này phải cấp cho nó
điện áp cố định , Có thể sử dụng diod zener.
+Chân Avcc chân này bình thường được nối lên Vcc nhưng khi sử dụng bộ
ADC thì chân này được nối qua 1 cuộn cảm lên Vcc với mục đích ổn định
điện áp cho ADC.
+PortA (PA0, PA1, PA2, …, PA7) gồm 8 chân có thể sử dụng làm đầu vào
hoặc ra có trở kéo bên trong lập trình được . Có thể sử dụng cả 8 chân làm
8 kênh đầu vào cho bộ biến đổi ADC 10 bit, khi sử dụng tuỳ vào nhu cầu có
thể chỉ sử dụng 1 hoặc 2 kênh..vv.
+PortB
- Gồm 8 chân có thể sử dụng làm đầu vào hoặc ra (PB0…PB7)
- Các chân PB3->PB7 là các chân được sử dụng trong giao tiếp SPI.
- PB0,PB1 2 chân sử dụng cho bộ timer/ counter 0,1 (input).
- PB2, PB3 còn được sử dụng làm đầu vào cho bộ so sanh analog .
- PB3(OC0) còn được sử dụng làm chân WPM của timer0.
+PortC: Các chân (PC0->PC7) có thể dùng làm đầu vào , ra có trở kéo bên
trong.
+PortD: (các chân PD0->PD7) có thể sử dụng làm đầu vào hoặc ra lập trình
được có trở kéo bên trong.
- PD7(OC2) có thể làm chân WPM của bộ timer2.
- PD5(OC1A) có thể làm chân WPM của bộ timer1.
- PD4(OC1B) có thể làm chân WPM của bộ timer1.
- PD1(TXD)(USART Ouput pin).
- PD0(RXD)(USART Input pin).
2 chân PD1, PD0 dùng để truyền thông nối tiếp máy tinh qua chuẩn RS232.

3.9. ATMEGA88.

 8 KBytes bộ nhớ flash.


 512 Bytes bộ nhớ EEPROM.
 1 KBytes RAM.
 2 bộ định thời timer/counter 8 bit
 1 bộ định thời timer/counter 16 bit
 6 kênh băm xung PWM.
 1 bộ đồng hồ thời gian thực REAL TIME clock
 8 kênh ADC 10 bit

86
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 1 bộ so sánh tương tự.


 1 bộ định thời Watchdog.
 Giao tiếp UART.
 23 cổng vào(I/O) ra có thể lập trình được

3.10. ATTINY 2313.

 2KBytes bộ nhớ flash.


 128 Bytes bộ nhớ EEPROM.
 128 Bytes RAM.
 1 bộ định thời timer/counter 8 bit
 1 bộ định thời timer/counter 16 bit
 4 kênh băm xung PWM.
 1 bộ so sánh tương tự.
 1 bộ định thời Watchdog.
 Giao tiếp UART.

87
Đồ án tốt nghiệp Cơ điện tử 3 - K47

 18 cổng vào(I/O) ra có thể lập trình được .

3.11. IRF 540.

Đối với động cơ bước dùng công suất lớn thì ta dùng loại mossfet để điều
khiển cụ thể là dùng loại IRF540 đây là transitor trường NPN có thể chịu được
dòng 20 A nên rất thích hợp cho điều khiển động cơ bước có công suất lớn.
Một số thuộc tính cơ bản của IRF540:
- Chịu dòng:20A
- áp là :200v
- SOA là giới hạn công suất tiêu tán nguồn
- Tốc độ chuyển mạch là Nanosecond
- Đặc tính chuyển đổi là tuyến tính
- Trở kháng đầu vào cao
Sơ đồ nguyên lý của IRF540: Gồm có 3 chân:
- G:Gate đây là cổng dùng để điều khiển đóng mở của IRF540
- D:Drain đây là cực máng của IRF540 dùng để nối tới ngoại vi để điều
khiển

88
Đồ án tốt nghiệp Cơ điện tử 3 - K47

- S:Soure tức là cực nguồn được nối tới nguồn tuỳ vào thiết bị cần áp bao
nhiêu .

3.12. LM 7805.
Hầu hết mạch số và vi xử lý đều dùng nguồn 5v. Vì vậy mà trong các
Project ta phải thiết kế nguồn nuôi 5v riêng. Do nguồn một chiều ta dùng thường
khoảng 9 đến 24v nên việc để tạo ra nguồn 5v nuôi cho mạch số hay vi xử lý ta
thường dùng IC LM7805
Hình ảnh của IC như sau:

LM 7805 được dùng rất đơn giản,chân input sẽ cho phép các nguồn 1 chiều
khác từ (9v-24v) vào còn chân Common dùng để chung đất cho đầu vào và đầu ra
,tức là nối mass. Còn chân output sẽ là đầu ra 5v để nuôi mạch

89
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CHƯƠNG 4.
GIỚI THIỆU MỘT SỐ PHẦN MỀM ĐÃ SỬ DỤNG

4.1. Giới thiệu phần mềm thiết kế mạch OrCad 10.


Phần mềm ORCAD là một phần mềm dùng để thiết kế mạch in,đây là một
phần mềm rất thân thuộc với những người vẽ mạch chuyên nghiệp và cả sinh viên.
Phần mềm này gồm có 2 phần chính:
- Phần vẽ mạch nguyên lý (Orcad capture).
- Phần vẽ mạch in(Orcad layout).
Cả hai phần này gắn liền với nhau, người thiết kế phải thiết kế xong phần
mạch nguyên lý nếu không có gì sai sót thì chuyển sang layout để vẽ mạch in.
* Phần vẽ mạch nguyên lý như sau:

Đầu tiên mở phần mềm ORcad phần Capture sau đó cửa sổ xuất hiện:

90
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Để tạo một dự án từ cửa sổ màn hình ta chọn File>New>Project

Khi hộp thoại xuất hiện trong khung name ta chọn tên đề án

Để lấy linh kiện cho mạch nguyên lý ,nhấp chuột vào biểu tượng Place
Part trên thanh công cụ, khi hộp thoại xuất hiện ta tiến hành lấy các linh kiện cần
dùng để thiết kế mạch, ví dụ ta lấy IRF 250 dùng để thiết kế mạch điều khiển động
cơ bước

91
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Nhưng mỗi linh kiện nằm ở các thư viện khác nhau trong Orcad nên ta phải
chọn đúng thư viện trong Orcad thì ta mới tìm thấy linh kiện ,để thêm thư viện ta
ấn vào nút Add Library trong hộp thoại Place Part và đánh dấu toàn bộ thư viện
trong Orrcad để thêm vào cho dễ trong quá trình thiết kế:

92
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Sau khi xong các bước ta dùng chuột nhấc linh kiện ra màn hình Capture để
thiết kế mạch nguyên lý :

Khi lấy xong linh kiện cần thiết kế ta lần lượt nối các chân lại với nhau để
được mạch nguyên lý như mạch nguyên lý
Sau khi vẽ xong mạch nguyên lý ta nhấp chuột vào biểu tượng Creat
nestlist trên thanh công cụ để tạo tập tin có đuôi *.MNL

Sau khi hộp thoại xuất hiện ta chọn tab layout và ấn OK

93
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Kết thúc phần một tạo


mạch nguyên lý và xếp dưới
File *.MNL dùng để vẽ mạch
in. Tiếp theo vẽ mạch in bằng
Orcad layout.

Sau khi màn hình layout


xuất hiện ta chọn File>New và
hộp thoại load template File
xuất hiện ta dữ nguyên mặc
định DEFAULT còn trong
input MNL netlist file ta chọn
mạch nguồn mà ta thiết kế trong
mạch nguyên lý :

Sau khi ấn vào nút Apply ECO ta có bảng lựa chọn để chọn chân linh kiện
cho phù hợp với linh kiện thực tế:

94
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Sau đó ta ấn vào "link existing footprint to component" để chọn chân cho


linh kiện thích hợp:

Ví dụ đối với điện trở ta chọn như sau trong thư viện Libraries : ta chọn
jumper và dưới Footprints chọn Jumper200

Tiếp tục chọn các linh kiện còn lại cho phù hợp với linh kiện thực tế sau đó
các linh kiện xuất hiện ở màn hình layout .
Sau đó sắp xếp linh kiện cho hợp lý và dùng chế độ tự động của máy hoặc
là vẽ tay nếu cần tối ưu hơn. Dùng chế độ tự động của máy thì sắp xếp xong linh
kiện ta dùng chế độ 2 :

95
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Khi đó các đường mạch sẽ tự động được vẽ, hoặc ta có thể tự vẽ các đường
mạch, kết quả ta sẽ thu được :

4.2. Giới thiệu phần mềm Visual C++.


Khi ngôn ngữ C ra đời các nhà lập trình đã thấy lợi ích rất lớn từ việc sử
dụng ngôn ngữ C bởi nó được hỗ trợ bởi các hệ điều hành,tuy nhiên từ khi ngôn
ngữ C++ ra đời nó đã thay đổi hình thức lập trình từ trước cho đến khi gặp
C++.Đây là ngôn ngữ lập trình theo hướng đối tượng,tuy nhiên việc viết chương
trình trên nền hệ điều hành dot rất bất tiện.Do vậy từ khi hệ điều hành Window ra
đời thì hãng phần mềm nổi tiếng Microsoft tung ra phiên bản Visual Studio bao
gồm môi trường Visual Basic,và đặc biệt là môi trường VisualC++ cho phép lập
trình C++ trên nền Window và việc tạo giao diện rất dễ dàng.
Trong đồ án sử dụng môi trường Microsoft Visual C++6.0 để lập trình tính
toán và truyền dữ liệu qua COM.
Các bước tạo dự án (project)
Sau khi cài đặt vc++,cửa sổ màn hình cho ta giao diện :

96
Đồ án tốt nghiệp Cơ điện tử 3 - K47

97
Đồ án tốt nghiệp Cơ điện tử 3 - K47

98
Đồ án tốt nghiệp Cơ điện tử 3 - K47

99
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Môi trường làm việc được chia làm 4 phần cơ bản:

1>Workspace
Không gian làm việc bên trái : có 3 lựa chọn

a> ClassView : Đây là phần hiển thị cây các lớp được sử dụng trong chương
trình.
b> Resource View : Các tệp mã nguồn, là phần cơ bản để soạn thảo, xâydựng
các yếu tố chương trình như hộp thoại (Dialog), thanh thực đơn(Menu) ...
c> File View : Đây là phần hiển thị các file *.cpp và *.h được tạo ra.

100
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2>Vùng soạn thảo


Đây là vùng hiển thị để đưa các điều khiển (Controls) vào Dialog để thiết
kế giao diện của chương trình và cũng là nơi viết mã lệch cho ứng dụng

101
Đồ án tốt nghiệp Cơ điện tử 3 - K47

3>Vùng thông báo


Hiện thông báo kết quả khi biên dịch và chạy chương trình.

4>Các thanh công cụ


Để gọi các thanh công cụ được sử dụng trong chương trình chọn Tool trên
thanh menu và chọn Customer để chọn các thanh công cụ cần sử dụng:
- Standard Tooolbar:Đây là thanh công cụ chuẩn trong Visual C++.Nó
bao gồm chức năng mở File,lưu File và tìm kiếm

- Winzard Bar:Đây là thanh công cụ hiển thị lớp đang sử dụng và các hàm
được sử dụng trong lớp đó

- Build minibar:đây là thanh công cụ cho phép thực hiện thao tác biên
dịch và chạy chương trình

- ControlToolbar:Đây là thanh công cụ rất quan trọng để xây dựng


chương trình.Lập trình viên sử dụng các điều khiển trên thanh công cụ
này để thiết kế giao diện của chương trình.

102
Đồ án tốt nghiệp Cơ điện tử 3 - K47

4.3. Phần mềm lập trình cho vi điều khiển :CODEVISION AVR.
Đây là phần mềm lập trình cho vi điều khiển AVR được sử dụng trong
mạch thiết kế.Phàn mềm tích hợp phần lựa chọn thiết lâp(khởi tao) ban đầu cho vi
điều khiển: chọn vi điều khiển,chon bộ định thời,……giúp công việc lập trình trở
lên đơn giản hơn
Giao diện phần mềm:

Các bước tạo Project(dự án) cho chương trình:

103
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Chọn New từ File.

104
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Chọn Project

105
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Nhấn Yes.

106
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Chọn khởi tạo ban đầu cho chương trinh điẻu khiển.

107
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Chọn Generate, Save and Exit.

108
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Đặt tên cho dự án.

Môi trường làm việc được chia làm 4 phần cơ bản:


1>Không gian làm việc bên trái
Đây là vùng hiển thị các file *.c và *.h

109
Đồ án tốt nghiệp Cơ điện tử 3 - K47

2>Vùng soan thảo


Là vùng hiển thi CODE cửa chương trình

3>Vùng thông báo


Hiện thông báo kết quả khi biên dịch và chạy chương trình.

4>Các thanh công cụ


Hiển thị các Toolbox ding đề chỉnh sửa ,thiết lập, biên dịch chương trình

110
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CHƯƠNG 5.
THIẾT KẾ MẠCH ĐIỀU KHIỂN

5.1. Nhiệm vụ thiết kế.


Nhiệm vụ cần thực hiện là thiết kế một mạch có thể giao tiếp với máy tính
để nhận dữ liệu và điều khiển các động cơ bước ,động cơ DC , xylanh khí nén theo
đúng dữ liệu đã nhận được.
Yêu cầu đặt ra là :
- Thiết kế hệ thống giao tiếp với máy tính.
- Thiết kế bộ xử lý dữ liệu và tạo tín hiệu điều khiển
- Thiết kế bộ giao tiếp giữa mạch tín hiệu và mạch công suất.
Thiết kế mạch công suất cho động cơ bước

5.2. Sơ đồ và chức năng từng khối.

Máy tính PC
( tính toán số liệu điều khiển )

Cổng COM<->RS485
( trao đổi thông tin hai chiều )

Vi điều khiển
(nhận dữ liệu từ máy tính, tính
toán và truyền cho mạch công
suất )

Mạch công suất điều khiển

Nhiệm vụ từng khối :


- Khối máy tính PC : có nhiệm vụ tính toán ra dữ liệu điều khiển. Giao
tiếp và truyền dữ liệu cho vđk qua cổng COM

111
Đồ án tốt nghiệp Cơ điện tử 3 - K47

- Khối giao tiếp COM<->RS485: thực hiện giao tiếp nối tiếp giữa máy
tính và VĐK
- Khối vi điều khiển : nhận dữ liệu điều khiển và tạo tín hiệu điều khiển
cho mạch công suất.
- Mạch công suất : từ tín hiệu điều khiển khuếch đại công suất lên để
động cơ có thể chạy tốt. Mạch có nhiệm vụ đóng mở nguồn cho động
cơ,xylanh.

5.3. Thiết kế và phân tích hoạt động từng khối.


5.3.1. Khối máy tính PC.
Máy tính PC hỗ trợ một số cổng giao tiếp với bên ngoài như cổng nối tiếp
( RS232 ) , hay cổng song song (LPT) hoặc giao tiếp qua Slot card hay USB.
Trong điều kiện cho phép về mặt kỹ thuật có hai giao tiếp có thể thực hiện
dễ dàng đó là giao tiếp nối tiếp và giao tiếp qua cổng song song, giao tiếp bằng
Slot card hay USB rất khó thực hiện đòi hỏi công nghệ cao và một số IC chuyên
dụng.
Với yêu cầu của bộ điều khiển là giao tiếp dữ liệu đỏi hỏi tốc độ truyền lớn
khoảng 10Kbyte/1s và truyền từng cụm data. Tốc độ của port nối tiếp lớn nhất mà
vi điều khiển có thể thực hiện được là 9600bit/s hay 1,2Kbyte/s.

5.3.2. Chuyển đổi RS232-RS485.


Nhiệm vụ: chuyển đổi tín hiệu từ cổng RS232(COM) của máy tính sang
cổng RS485, do chuẩn của máy tính là cổng COM và muốn truyền thông data đi
xa thì phải chuyển đổi sang RS485(ứng dụng mạng truyền thông công nghiệp).
Sơ đồ nguyên lý kết nối MAX232

112
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Sơ đồ nguyên lý kết nối MAX485

Mạch sử dụng IC 74HC14 để chuẩn tín hiệu cho data ở mức 0 vá 1 với sườn
xung lên hoặc xuống luôn dựng đứng. IC 74HC14 với mỗi căp in/out được
thiết kế bởi mạch Schmitt trigger. Khi tín hiệu ngõ vào có chuyển tiếp chậm thì
tín hiệu ngõ ra thường bị rung nhiều lần trước khi thay đổi trạng thái logic, còn
tín hiệu ra ở mạch Schmitt trigger thay đổi trạng thái dứt khoát khiến dạng
sóng ra vuông vức. Chính điều này làm giảm ảnh hưởng của nhiễu trong quá
trình truyền thông.
- Để tín hiệu lấy ra giống với tín hiêu ban đầu ta phải sử dụng 2 cổng đảo mắc
nối tiếp: 232RX->485TX và 485RX->232TX
- 2 chân cho phép nhận và truyền data được nối chung vơi nhau 485CTRL và
được nối như sơ đồ dưới. luôn cho phép truyền và nhận data cùng 1 lúc , vì

113
Đồ án tốt nghiệp Cơ điện tử 3 - K47

chân DE luôn được nối lên dương nguồn,con chân RE chỉ khi nào có tin hiệu
nhận data mới cho phép nhận.
-Giữa 2 tín hiệu A,B ta mắc các đi ốt zener để chống dòng ngược.

U 8C
U 8A

232R X 1 2 5 6 485TX
D 2
D 14
74H C 14 74H C 14
D 13 485R X
D IO D E 1 n 4 1 4 8
U 8F
485TX
LED R 1 R 2
13 12
LED 33k R 220
R 5 C 10P
R 10K C AP N P
74H C 14

G N D
VC C

U 8B U 8E
U 8D
232TX 4 3 10 11 485R X

9 8 485C TR L

74H C 14 74H C 14
74H C 14
C 13
G N D
VC C

VC C

R 11
G N D

R S485+ VC C
R 13 R 6 U 1
R R _4K7 C 2 D 3 D 15
2 8 VC C C AP N P R J13
R E VC C D IO D E D IO D E
485R X 1
R D 4
485C TR L 3 6 D 1 1
D E A
G N D

485TX 4 7 G N D G N D 2
D B
D 02C Z 12 D 02C Z 12
SN 75176 D 5 D 16 C O N 2
5

D IO D E D IO D E
G N D

R S485- R 12 G N D

R
2R 1 I N _ J
3T 1 O U T

R 9
1R 1 I N

R 1 IN _ J N O N O
R 8
R 4K7
J12 232R X VC C
R 4K7 J6 J8
JU M PER 3
1 1
U 3
C O N 1 C O N 1
T 1 O U 5T _ J

R 1 IN _ J 1 3 12 232R X
T 1 O U 6T

R 1 IN R 1O U T
R 1 IN 4

8 9
R 2 IN R 2O U T J10 J9
P1
232TX 11 14 T1O U T_J 1 1
1 10 T1 IN T1O U T 7 N O N O
6 T2 IN T2O U T C O N 1 C O N 1
2 T1O U T C 6 10uF 1
C 1 +
7
3
R TS /C TS
R 1 IN C 7 10uF 4
3
C
C
1
2
-
+
D R IL L S
8 R TS /C TS 5
4 C 8 10uF 2 C 2 -
VC C V +
9 6
5 G N D C 9 V -
M A X232
10uF
R S 2 3 2 C o n n e c te r

D 11
R 4
VC C G N D

PO W ER D 6
U 2 R LED
2 1 3 VC C
1 470u IN O U T 1000u C 10 C 11 C 12

D IO D E C AP L M 7 8 0 5 C /TO G NC DA P 104 104 104


J11

Sơ đồ nguyên lí mạch chuyển đổi RS232-485

114
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Sơ đồ layout Mạch chuyển đổi RS232-RS485

Đối với mạch trên chúng ta đã chuyển đổi giao thức truyền nhận RS232
thông thường sang giao thức RS485, đây là 1 chuẩn giao tiếp hổ trợ giao tiếp theo
mạng được sử dụng trong các mạng truyền thông trong công nghiệp.
Đối với mạch chuyển đổi RS232-RS485 này thì 2 chân DI và RO được đưa
vào 2 chân RX và TX của Max232 truyền và nhận tín data từ máy tính.
Còn trong các mạch giao tiếp với Vi điều khiển thì 2 chân này được đưa
vào 2 chân RX và TX của vi điều khiển truyền và nhận dữ liệu với vi điều khiển.

115
Đồ án tốt nghiệp Cơ điện tử 3 - K47

U 8E U 8C

485R X 11 10 5 6 232R X

74H C 14 74H C 14

U 8B U 8D
U 8F

232TX 3 4 9 8 485TX D 2
13 12 485C TR L

74H C 14 D IO D E 1 n 4 1 4 8
74H C 14 U 8A
74H C 14
R 1 R 2
1 2

R 220 C 1
33k C AP N P
74H C 14

G N D
G N D

R S485+
U 111
C 2 D 30 D 40
2 8 VC C C AP N P J4
R E VC C J59 D IO D E D IO D E
485R X 1
485C TR L 3 R 6 2 1 D 109 D 80 1
D E A
G N D

485TX 4 7 G N D G N D 2
D B
JU M PER R 3 D 02C Z 12
SN 75176 R D 50 D 0 2 DC 7Z 0 1 2 C O N 2
5

D IO D E D IO D E
G N D

R S485-

serial _rs232_Rs485

J55

R ST P C 6 (R E S E T ) 1 2 8 P C 5 S te p _ 4
232R X P D 0 (R X D ) 2 2 7 P C 4 S te p _ 3
232TX P D 1 (T X D ) 3 2 6 P C 3 S te p _ 2
J56 D C 2_EN PD 2 4 2 5 P C 2 S te p _ 1
D C 2 _ D IR P D 3 5 2 4 P C 1 D C 1 _ EN
G N D 1 2 PD 4 6 2 3 P C 0 D C 1 _ D IR
VC C 7 2 2 G N D
G N D 8 2 1 A R EF VC C
JU M PER PB6 X t a l _ 91 2 0 A VC C VC C
PB7 X t a l1_ 02 1 9 P B5 S ta tu s_1
D ir e c t _ 5 P D 5 1 1 1 8 P B4 S ta tu s_2
D ir e c t _ 4 P D 6 1 2 1 7 P B3 S ta tu s_3
D ir e c t _ 3 P D 7 1 3 1 6 P B2 S ta tu s_4
D ir e c t _ 2 P B 0 1 4 1 5 P B1 D ir e c t_ 1

A TM E G A 88

Sơ đồ nguyên lí mạch giao tiếp RS485-Vi điều khiển

Như vậy trong sơ đồ này 2 chân DI và DO của max 485 được đưa vào 2
chân RX và TX của Atmega88-Attiny2313.
Khi muốn giao tiếp nhiều mạng 485 với nhau chúng ta chỉ việc phân địa chỉ
cho từng mạng để thuận tiện cho quá trình truyền nhận Data vì tại 1 thời điểm thì
chỉ có 1 mạng 485 được truyền nếu không các mạng khi cùng truyền sẽ xảy ra
xung đột.

Như vậy khi lập trình cho các địa chỉ (driver) chúng ta phải đặt dịa chỉ rõ ràng
cho từng (driver) nếu như không muốn các dữ liệu bị truyền sai địa chỉ hoặc
truyền nhầm (driver) hoặc không đến được do xung đột.

116
Đồ án tốt nghiệp Cơ điện tử 3 - K47

5.3.3. Khối vi điều khiển.


a) Sơ đồ nguyên lý mạch vi điều khiển ATMEGA88.
Nhiệm vụ: truyền , nhận data từ vi điều khiển đên PC và ngược lại, xử lý
data để đưa tín hiệu điều khiển đến mạch công suất.

-Vi điều khiển atmega88 có thể hoạt được nhơ bộ tạo dao động gồm : thạch anh
20M , 2 tụ 22p nối với 2 chân PB6,PB7
-PB1->PB5 được nối với 4 công tác lựa chọn trạng thái.
-PB0,PD5->PD7 nối với tín hiệu công tắc hành trình
-PD0,PD1 giao tiếp với PC.
-PD2,PD3 tạo tín hiệu điều khiển động cơ 2 tương ứng quay thuận và ngịch.
-PC0,PC1 tạo tín hiệu điều khiển động cơ 1 tương ứng quay thuận và ngịch
-PC2->PC5 tạo tín hiệu điều khiển xylanh khí nén.
-PC6 nối với chân reset
b) Sơ đồ nguyên lý mạch vi điều khiển ATTINY2313.
Nhiệm vụ: truyền , nhận data từ vi điều khiển đên PC và ngược lại, xử lý
data để đưa tín hiệu điều khiển đến mạch công suất.
-Vi điều khiển attiny2313 có thể hoạt được nhơ bộ tạo dao động gồm :
thạch anh 20M , 2 tụ 22p nối với 2 chân PA1,PA0
-PB0->PB3 được nối với 4 công tác lựa chọn trạng thái.
-PD2->PD6 nối với tín hiệu công tắc hành trình
-PD0,PD1 giao tiếp với PC.

117
Đồ án tốt nghiệp Cơ điện tử 3 - K47

-PB4->PB7 nối tín hiệu điều khiển động cơ bước

5.3.4. Khối mạch công suất.


a) Sơ đồ nguyên lý mạch công suất điều khiển động cơ bước.

118
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Mạch công suất được thiết kế nhằm khuếch đại công suất điều khiển. Từ tín
hiệu điều khiển có dòng thấp cỡ mA , áp 5V lên áp 12V hoặc 24V với dòng vài A.
Vì khác biệt mức điện điều khiển và công suất nên ta sử dụng cách ly quang
để cách ly hai phần với nhau.
Cách ly quang sử dụng loại P521, Sơ đồ gồm 4 cách ly quang :
Khóa công suất sử dụng Tran trường IRF 540 với điện trở kéo giữa chân 1
và chân 3 là 10k
Để tạo tín hiệu ổn định cho Tran trường IRF 540 ,trong mạch có sử dụng 2
tran thường C1815 và A1015 được mắc theo kiểu khuếch đại đẩy kéo làm cho góc
mở của Tran trường IRF 540 luôn ổn định. Tạo ra từ trường và tốc độ động cơ
bước luôn có xu hướng ổn định.

119
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Sơ đồ nguyên lý:

120
Đồ án tốt nghiệp Cơ điện tử 3 - K47

b) Sơ đồ nguyên lý mạch công suất điều khiển động cơ 1 chiều

Cũng đươc thiết kế giống với động cơ bước nhưng nối thêm RƠ_LE cuộn
hút để có thể đảo chiều đông cơ

c) Sơ đồ nguyên lý mạch công suất điều khiển val của xylanh.


(giống động cơ bước)

121
Đồ án tốt nghiệp Cơ điện tử 3 - K47

d) Mạch điều khiển.

122
Đồ án tốt nghiệp Cơ điện tử 3 - K47

5.3.5. Khối nguồn cho hệ thống.


Mạch sử dụng nguồn 1 chiều 24V qua diot D6 và tụ loc vào chân IN của
LM7805 cho ra nguồn 5V vào vi điều khiển

123
Đồ án tốt nghiệp Cơ điện tử 3 - K47

CHƯƠNG 6.
LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG.

6.1. Thiết kế giao diện.


6.1.1. Sử dụng thư viện Serial.
Đây là thư viện hỗ trợ cho việc giao tiếp với máy tính, trong thư viện có sẵn
các hàm truyền, nhận …, việc sử dụng vô cùng đơn giản chúng ta chỉ việc copy
thư viện vào trong bài lập trình sau đó include thư viện ra là có thể sử dụng được.
Ví dụ:
#include"Serial_Port/Serial.h"

Sau đó chúng ta có thể sử dụng ngay các hàm có sẵn như:

int CSerial::ReadDataWaiting( void )


{

if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

DWORD dwErrorFlags;
COMSTAT ComStat;

ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );

return( (int) ComStat.cbInQue );

int CSerial::ReadData( void *buffer, int limit )


{

if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat;

ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );


if( !ComStat.cbInQue ) return( 0 );

124
Đồ án tốt nghiệp Cơ điện tử 3 - K47

dwBytesRead = (DWORD) ComStat.cbInQue;


if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;

bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead,


&dwBytesRead, &m_OverlappedRead );
if( !bReadStatus ){
if( GetLastError() == ERROR_IO_PENDING ){
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return( (int) dwBytesRead );
}
return( 0 );
}

return( (int) dwBytesRead );

Đây là các hàm hay được sử dụng ngoài ra con các hàm khác nhưng ít sử
dụng hơn.

6.1.2. Thuật toán nội suy.


Nội suy khi điều khiển các trục của máy CNC chính là việc chúng ta tính
toán tốc độ và số bước của động cơ. Trong một khoảng thời gian tốc độ sẽ luôn bị
thay đổi nếu chúng ta nội suy cung tròn.
Khai báo các biến và vác hàm ba đầu:

#if !
defined(AFX_MANH_DADLG_H__19EC97BA_1724_4060_983E_E84F1A3492B
1__INCLUDED_)
#define
AFX_MANH_DADLG_H__19EC97BA_1724_4060_983E_E84F1A3492B1__INC
LUDED_

#if _MSC_VER > 1000


#pragma once
#endif // _MSC_VER > 1000

#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))


#define SND_NODEFAULT 0x0002 /* silence (!default) if sound not found */
#define SND_NOWAIT 0x00002000L /* don't wait if the driver
is busy */

125
Đồ án tốt nghiệp Cơ điện tử 3 - K47

#define SND_RESOURCE 0x00040004L /* name is resource name or


atom */
#define SND_FILENAME 0x00020000L /* name is file name */
#define SND_SYNC 0x0000 /* play synchronously (default) */
#define SND_ASYNC 0x0001 /* play asynchronously */

/////////////////////////////////////////////////////////////////////////////
// CManh_daDlg dialog
//---
#include "Serial_Port/Serial.h"
//--

#include "Gcode_class/Gcode_File.h"
#include "Gcode_class/Gcode_Ext.h"
//#include "Gcode_class/Gcode_Cmd.h"
//--
/*
#include "Grid_Ctrl/GridCtrl.h"
#include "Grid_Ctrl/GridCellCombo.h"
#include "Grid_Ctrl/GridCellNumeric.h"
*/
//--

//--

class CManh_daDlg : public CDialog

// Construction

public:

void Command(int stepx, int vx, int stepy, int vy, int stepz, int vz);
//-------------------------
// Gcode_Cmd aaa;
Gcode_File G_File;
bool
m_bCheck,m_bCheckHardware,m_bSend,m_bHardware,m_bReady;
CString m_sStr,m_sRec,m_sHardware;
CString Dirx,stra1;

126
Đồ án tốt nghiệp Cơ điện tử 3 - K47

int sd1,sj;
CString strz;
int si,ti;

// Gcode_File G_File;
Gcode_Ext G_Ext;
int m_Line,m_Cmd;
int m_index,m_type,m_temp;
bool m_bOnData,m_bChayDao,m_bStep;

// bool m_bCheck,m_bCheckHardware,m_bHardware;//,m_bSend
// CString m_sStr,m_sRec,str;
char m_buffer[1024];
int m_buflen;
char m_byterec,fag1,fag2;

//--------------------------------
int m_test;
int s_Index;
int s_Col;
CString m_sOutput;
//void Convert_num(CString m_sInput,CString &m_sOutput);

VARIANT v_data;
bool s_start,s_stop;

//------------
CSerial m_Com;

CString m_sResult;
//---------------------

//-------------------------
int sel;
//---------------------------

CHAR fag_rb;
CString fag_bt1;
char fag_bt;
// flagbt var;
CManh_daDlg(CWnd* pParent = NULL); // standard constructor

127
Đồ án tốt nghiệp Cơ điện tử 3 - K47

// Dialog Data
//{{AFX_DATA(CManh_daDlg)
enum { IDD = IDD_MANH_DA_DIALOG };
CButton m_Open;
CListBox m_listGcode;
CEdit m_Edit2;
CEdit m_Gcode;
CButton m_checkrb;
CButton m_checkbt;
int m_edit1;
CString m_htbt;
CString m_htrb;
CString m_Gcodetext;
CString m_ttbt;
CString m_stringEdit2;
CString m_lsGcode;
// CString m_edit2;
//}}AFX_DATA

// ClassWizard generated virtual function overrides


//{{AFX_VIRTUAL(CManh_daDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV
support
//}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;

// Generated message map functions


//{{AFX_MSG(CManh_daDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnChangeEdit1();
afx_msg void OnCheckBt();
afx_msg void OnCheckRb();
afx_msg void OnBUTTONRun();
afx_msg void OnBUTTONStop();
afx_msg void OnRBStop();

128
Đồ án tốt nghiệp Cơ điện tử 3 - K47

afx_msg void OnOpen();


afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT
lpDrawItemStruct);
afx_msg void OnAxitX1();
afx_msg void OnAxitX2();
afx_msg void OnAxitY1();
afx_msg void OnAxitY2();
afx_msg void OnAxitZ1();
afx_msg void OnAxitZ2();
afx_msg void OnMachinRun();
afx_msg void OnHomeCNC();
afx_msg void OnStopCNC();
afx_msg void OnRunRB();
afx_msg void OnHomeRB();
afx_msg void OnNagTay();
afx_msg void OnHaTay();
afx_msg void OnVuonTay();
afx_msg void OnThuTay();
afx_msg void OnMoKep();
afx_msg void OnDongKep();
afx_msg void OnQuayTrai();
afx_msg void OnQuayPhai();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
CObList m_Array;
BOOL m_tadd;

};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the
previous line.

#endif // !
defined(AFX_MANH_DADLG_H__19EC97BA_1724_4060_983E_E84F1A3492B
1__INCLUDED_)

129
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Chương trình kiểm tra đọc lệnh Gcode:


#if !
defined(AFX_GCODE_EXT_H__A15D9DEF_8CF0_4F35_B9D4_52EA87E793C
8__INCLUDED_)
#define
AFX_GCODE_EXT_H__A15D9DEF_8CF0_4F35_B9D4_52EA87E793C8__INC
LUDED_

#if _MSC_VER > 1000


#pragma once
#endif // _MSC_VER > 1000
#include <math.h>
#include "Gcode_Cmd.h"

#define pi 3.1415926535897932

class Gcode_Ext
{
public:
Gcode_Ext();
virtual ~Gcode_Ext();

public:
//- Bien ve vi tri hien tai-------------
doubleCur_X,Cur_Y,Cur_Z; // vi tri hien tai - de tinh so
voi lenh
//- Bien ve tham so tinh toan-----------
int V_chuan; // van toc chuan khi
noi suy - duoc tinh tham chieu
int V_max; // van toc hay
lenh G00 --
doubleRev_X,Rev_Y,Rev_Z; // rev_x = n buoc/ 1 mm
doubleDelta_l; // buoc de dung noi suy -
hai diem noi suy co l = delta_long
//- Bien ve mang du lieu noi suy ---------
int m_NoiSuy; // so nut duoc noi
suy
int

Step_X[1000],Step_Y[1000],V_X[1000],V_Y[1000],Step_Z[1000],V_Z[1000];

public:
//- Ham tinh toan noi suy -------------

130
Đồ án tốt nghiệp Cơ điện tử 3 - K47

void Init_pos(double x0, double y0, double z0);


void Init_rev(double revx, double revy, double revz);
void Init_vdl(int vchuan, double deltal);

int Ext_Cmd(Gcode_Cmd G_cmd);


void Calc_ns(int index, double X, double Y, double Z);
doubleCalc_angle(double I, double J);
void Clear();

};

#endif // !
defined(AFX_GCODE_EXT_H__A15D9DEF_8CF0_4F35_B9D4_52EA87E793C
8__INCLUDED_)
int Gcode_Ext::Ext_Cmd(Gcode_Cmd G_cmd){
double
t_x,t_y,t_z,x0=Cur_X,y0=Cur_Y,z0=Cur_Z,x1,y1,z1,R,a1,a2,C,delta_a,tamx,tamy,
temp;
int i;
//-------------------------
switch(G_cmd.G) {
case 0 :// lenh G00 - khong noi suy ---
m_NoiSuy = 1; // chi co mot lenh

if(G_cmd.x){
Step_X[1] = int(G_cmd.X*Rev_X) -
int(Cur_X*Rev_X); // loai bo sai so tich luy
Cur_X = G_cmd.X;
// update vi tri moi
}else Step_X[1] = 0;
//---------------
if(G_cmd.y){
Step_Y[1] = int(G_cmd.Y*Rev_Y) -
int(Cur_Y*Rev_Y); // loai bo sai so tich luy
Cur_Y = G_cmd.Y;
}else Step_Y[1] = 0;
//---------------
if(G_cmd.z){
Step_Z[1] = int(G_cmd.Z*Rev_Z) -
int(Cur_Z*Rev_Z); // loai bo sai so tich luy
Cur_Z = G_cmd.Z;
}else Step_Z[1] = 0;

131
Đồ án tốt nghiệp Cơ điện tử 3 - K47

//-----------------
//double temp; // khong noi suy - chay to do Max
//temp = sqrt(Step_X[1]*Step_X[1] + Step_Y[1]*Step_Y[1]);
V_X[1] =
V_chuan;//int(abs(Step_X[1])*V_chuan/temp);
V_Y[1] =
V_chuan;//int(abs(Step_Y[1])*V_chuan/temp);
V_Z[1] = V_chuan/5;
break;
case 1 :// Lenh G01 - Noi suy duong thang ---
Delta_l=50;
if(G_cmd.x) t_x = G_cmd.X-Cur_X; else t_x = 0;
if(G_cmd.y) t_y = G_cmd.Y-Cur_Y; else t_y = 0;
if(G_cmd.z) t_z = G_cmd.Z-Cur_Z; else t_z = 0;

temp = sqrt((long)t_x*t_x+ (long)t_y*t_y+(long)t_z*t_z);


if(temp>Delta_l) m_NoiSuy = int(temp/Delta_l);
else m_NoiSuy = 1;

for(i=1;i<m_NoiSuy+1; i++){
x1 = x0 + (t_x/m_NoiSuy)*i;
y1 = y0 + (t_y/m_NoiSuy)*i;
z1 = z0 + (t_z/m_NoiSuy)*i;
Calc_ns(m_NoiSuy-i+1,x1,y1,z1);
}
//-------------------------

break;
case 2 :// Lenh G02 - Noi suy cung tron - thuan ---
Delta_l=5;
R = sqrt(G_cmd.I*G_cmd.I + G_cmd.J*G_cmd.J);// ban
kinh cung tron noi suy
a1 = Calc_angle(G_cmd.I,G_cmd.J); // goc
bat dau ns
tamx = Cur_X+G_cmd.I; tamy = Cur_Y+G_cmd.J;
a2 = Calc_angle(tamx-G_cmd.X,tamy-G_cmd.Y); // goc
ket thuc
if(a2>=a1) a2 = a2 - 2*pi;
C = R*(a1-a2); // chu vi cung tron
m_NoiSuy = int(C/Delta_l); // so buoc noi suy
delta_a = (a1-a2)/m_NoiSuy;// delta goc noi suy
for(i=1;i<m_NoiSuy+1; i++){
x1 = tamx + R*cos(a1-delta_a*i);

132
Đồ án tốt nghiệp Cơ điện tử 3 - K47

y1 = tamy + R*sin(a1-delta_a*i);
Calc_ns(m_NoiSuy-i+1,x1,y1,0);
}
break;
case 3 :// Lenh G03 - Noi suy cung tron - nguoc ---
R = sqrt(G_cmd.I*G_cmd.I + G_cmd.J*G_cmd.J);// ban
kinh cung tron noi suy
a1 = Calc_angle(G_cmd.I,G_cmd.J); // goc
bat dau ns
tamx = Cur_X+G_cmd.I; tamy = Cur_Y+G_cmd.J;
a2 = Calc_angle(tamx-G_cmd.X,tamy-G_cmd.Y); // goc
ket thuc
if(a1>=a2) a2 = a2 + 2*pi;
C = R*(a2-a1); // chu vi cung tron
m_NoiSuy = int(C/Delta_l); // so buoc noi suy
delta_a = (a2-a1)/m_NoiSuy;// delta goc noi suy
for(i=1;i<m_NoiSuy+1; i++){
x1 = tamx + R*cos(a1+delta_a*i);
y1 = tamy + R*sin(a1+delta_a*i);
Calc_ns(m_NoiSuy-i+1,x1,y1,0);
}
break;
}
//-----------------------------
return 1;
}

Trong đoạn chương trình trên sẽ phân biệt các lệnh nội suy đường thẳng và
nội suy cung tròn.

Chúng ta có chương trình nội suy đường thẳng như sau:


void Gcode_Ext::Calc_ns(int index, double X, double Y,double Z){
//-------------------
Step_X[index] = (int(X*Rev_X) - int(Cur_X*Rev_X))*200; // loai
bo sai so tich luy
Cur_X = X; // update vi
tri moi (30)
//---------------
Step_Y[index] = (int(Y*Rev_Y) - int(Cur_Y*Rev_Y))*200; // loai
bo sai so tich luy
Cur_Y = Y; //(60)
//-----------------

133
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Step_Z[index] = (int(Z*Rev_Z) - int(Cur_Z*Rev_Z))*200; // loai


bo sai so tich luy
Cur_Z = Z;
//-----------------
double temp; // khong noi suy - chay to do Max

temp = sqrt(Step_X[index]*Step_X[index] +
Step_Y[index]*Step_Y[index]+Step_Z[index]*Step_Z[index]);

V_X[index] = int(abs(Step_X[index])*V_chuan/temp);
V_Y[index] = int(abs(Step_Y[index])*V_chuan/temp);
V_Z[index] = int(abs(Step_Z[index])*0.5*V_chuan/temp);

Chương trình nội suy cung tròn chúng ta chia cung tròn thành các đoạn thẳng nhỏ,
số đoạn thẳng phụ thuộc vào bán kính cung tròn :
Delta_l=5;
R = sqrt(G_cmd.I*G_cmd.I + G_cmd.J*G_cmd.J);// ban
kinh cung tron noi suy
a1 = Calc_angle(G_cmd.I,G_cmd.J); // goc
bat dau ns
tamx = Cur_X+G_cmd.I; tamy = Cur_Y+G_cmd.J;
a2 = Calc_angle(tamx-G_cmd.X,tamy-G_cmd.Y); // goc
ket thuc
if(a2>=a1) a2 = a2 - 2*pi;
C = R*(a1-a2); // chu vi cung tron
m_NoiSuy = int(C/Delta_l); // so buoc noi suy
delta_a = (a1-a2)/m_NoiSuy;// delta goc noi suy
for(i=1;i<m_NoiSuy+1; i++){
x1 = tamx + R*cos(a1-delta_a*i);
y1 = tamy + R*sin(a1-delta_a*i);
Calc_ns(m_NoiSuy-i+1,x1,y1,0);
}

Tính toán ra các đoạn thẳng nhỏ sau đó gọi hàm nội suy đường thẳng như
trên.

134
Đồ án tốt nghiệp Cơ điện tử 3 - K47

6.1.3. Chương trình điều khiển hệ thống.


Giao diện chung điều khiển hệ thống:

Trên màn hình giao diện điều khiển chúng ta đã tích hợp được hệ thống
điều khiển chung trong 1 giao diện, việc điều khiển theo mạng sẽ giúp cho việc lập
trình trở nên đơn giản hơn, chương trình sẽ bớt phức tạp hơn.
Trong chương trình chính chúng ta quản lý toàn bộ hệ thống bằng cách liên
tục truyền lệnh kiểm tra quá trình hoạt động của tùng môdul trong hệ thống CIM
ngay sau khi truyền lệnh cho chạy chúng ta truyền ngay lệnh hỏi đáp nếu mô dul
nào hoạt động xong sẽ báo lên chương trinh phân biệt chúng bằng giá trị data
chúng gửi lên để hệ thống có thể hoạt động độc lập, song song, hoặc tuần tự, nếu
không quản lý -> không có mối lien hệ trong hệ thống và quá trình làm việc trở
nên rời rạc có thể xảy ra các hiện tượng va đập trong hệ thống khi modul thứ 1
chưa làm việc xong modul thứ 2 đã chạy.
Tất cả việc quản lí này đều được thực hiện trong hàm:
void CManh_daDlg::OnTimer(UINT nIDEvent)
Trong hàm này tục hiện quá trình truyền và kiểm tra, chúng ta có thể truyền
lệnh kiểm tra như sau:
strz.Format(">1 S");
strz.Format(">1 S");
strz += 0x0d;

135
Đồ án tốt nghiệp Cơ điện tử 3 - K47

strz += 0x0A;
m_buflen = strlen(strz);

for( si=0; si<m_buflen; si++) m_buffer[si] = strz[si];


m_Com.SendData(m_buffer,m_buflen);

Đoạn truyền lệnh trên chúng ta đang thực hiện quá truyền xuống dịa chỉ
thứ1
Kí tự ‘S’ theo chuẩn chung giữa chương trình trên Window và chương trình
phía dưới đó là hỏi đáp, nếu chương trình phía dưới(phàn cúng) thực hiện xong nó
sẽ gửi lên (>11) ngược lại(>10), lúc này chúng ta phải thực hiện quá trình đọc
data:
m_buflen=0;
m_buflen = m_Com.ReadDataWaiting();

if(m_buflen){
m_Com.ReadData(m_buffer,m_buflen);

lúc này chúng ta chỉ việc kiểm tra buffer :


if(m_buffer[1]=='1') // dung dia chi 1
hàm truyền Data:
void CManh_daDlg::Command(int stepx, int vx, int stepy, int vy, int stepz, int vz)
{
bool Dirx= 1, Diry = 1, Dirz = 1;
// if(stepx<0){ Dirx = 0; stepx = -stepx;}

CString Dir_x,Dir_y,Dir_z;
CString strx,stry,strz;
KillTimer(ID_CLOCK_TIMER);

//----------truyen toc do va so buoc xuong truc X------


// stepx=100;
// vx=10;

if(stepx<0){ stepx = -stepx;

136
Đồ án tốt nghiệp Cơ điện tử 3 - K47

strx.Format(">1 D %d %d",vx,stepx);
strx += 0x0d;
strx += 0x0A;
m_buflen = strlen(strx);
for( si=0; si<m_buflen; si++) m_buffer[si] = strx[si];
m_Com.SendData(m_buffer,m_buflen);
}
else{
strx.Format(">1 M %d %d",vx,stepx);
strx += 0x0d;
strx += 0x0A;
m_buflen = strlen(strx);
for( si=0; si<m_buflen; si++) m_buffer[si] = strx[si];
m_Com.SendData(m_buffer,m_buflen);
}

//------------truyen van toc so buoc xuong truc Y-----

if(stepy<0){ stepy = -stepy;


stry.Format(">2 D %d %d",vy,stepy);
stry += 0x0d;
stry += 0x0A;
m_buflen = strlen(strx);
for( si=0; si<m_buflen; si++) m_buffer[si] = strx[si];
m_Com.SendData(m_buffer,m_buflen);
}
else {
stry.Format(">2 M %d %d",vy,stepy);
stry += 0x0d;
stry += 0x0A;
m_buflen = strlen(stry);

137
Đồ án tốt nghiệp Cơ điện tử 3 - K47

for( si=0; si<m_buflen; si++) m_buffer[si] = stry[si];


m_Com.SendData(m_buffer,m_buflen);
}

// end off

//------------truyen van toc so buoc xuong truc z-----

if(stepz<0){ stepz = -stepz;


strz.Format(">3 D %d %d",vz,stepz);
strz += 0x0d;
strz += 0x0A;
m_buflen = strlen(strz);
for( si=0; si<m_buflen; si++) m_buffer[si] = strz[si];
m_Com.SendData(m_buffer,m_buflen);
}
else{
strz.Format(">3 M %d %d",vz,stepz);
strz += 0x0d;
strz += 0x0A;
m_buflen = strlen(strz);
for( si=0; si<m_buflen; si++) m_buffer[si] = strz[si];
m_Com.SendData(m_buffer,m_buflen);
}

// end off

SetTimer(ID_CLOCK_TIMER,100,0);
}

138
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Hàm void CManh_daDlg::OnTimer(UINT nIDEvent)


Là hàm kiểm soát quá trình truyền nhận Data, nó sẽ kiểm tra khi nào 3 trục
của CNC đều kết thúc quá trình chạy bước sau đó mới truyền lệnh mới:
void CManh_daDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
UpdateData(TRUE);

m_bStep = FALSE;
strz.Format(">2 S");
strz += 0x0d;
strz += 0x0A;
m_buflen = strlen(strz);
for( si=0; si<m_buflen; si++) m_buffer[si] = strz[si];
m_Com.SendData(m_buffer,m_buflen);
m_buflen=0;
m_buflen = m_Com.ReadDataWaiting();
if(m_buflen){
m_Com.ReadData(m_buffer,m_buflen);
strz = "";
for(int ti=0; ti<m_buflen; ti++)
{
if((unsigned char)m_buffer[ti]==0x0a) ti = m_buflen;
else strz += m_buffer[ti];
}
}else strz="";

if(m_buffer[2]='0')
{
fag1=1;
}

139
Đồ án tốt nghiệp Cơ điện tử 3 - K47

else{
//m_bSend=0;//SetTimer(ID_CLOCK_TIMER,200,0);;
fag1=0;
}

strz.Format(">1 S");
strz += 0x0d;
strz += 0x0A;
m_buflen = strlen(strz);
for( si=0; si<m_buflen; si++) m_buffer[si] = strz[si];
m_Com.SendData(m_buffer,m_buflen);
m_buflen=0;
m_buflen = m_Com.ReadDataWaiting();

if(m_buflen){
m_Com.ReadData(m_buffer,m_buflen);
strz = "";
for(int ti=0; ti<m_buflen; ti++){
if((unsigned char)m_buffer[ti]==0x0a) ti = m_buflen;
else strz += m_buffer[ti];
}
}else strz="";

// m_edit2=m_buffer[4];
if(m_buffer[2]='0')
{
//m_bSend=1;
fag2=1;
}
else{
//m_bSend=0;//SetTimer(ID_CLOCK_TIMER,200,0);;

140
Đồ án tốt nghiệp Cơ điện tử 3 - K47

fag2=0;
}
if((fag1)&&(fag2)) m_bSend=1;
else m_bSend=0;

//UpdateData(FALSE);

if(m_bSend){
// m_edit2=1;
// KillTimer(ID_CLOCK_TIMER);
//---------------------------
// doan chuong trinh truyen data---
if(m_index==0){ // khoi tao lenh moi

if(m_Cmd<m_Line){
Gcode_Cmd g_lenh;
g_lenh.G_code =
G_File.m_pArrCode[m_Cmd]->G_code;
g_lenh.Gcode_Data();
G_Ext.Ext_Cmd(g_lenh);
// dat lai gia tri m_index
m_index = G_Ext.m_NoiSuy;

Command(G_Ext.Step_X[m_index],G_Ext.V_X[m_index],G_Ext.Step_Y[m_index
],G_Ext.V_Y[m_index],G_Ext.Step_Z[m_index],G_Ext.V_Z[m_index]);

//Command('k',G_Ext.Step_X[m_index],G_Ext.Step_Y[m_index]);
m_index--;
m_Cmd++;
if(m_bStep) if(m_index==0)
m_bSend = 0; // chay tunglenh

141
Đồ án tốt nghiệp Cơ điện tử 3 - K47

}else{
m_bSend = 0; // ket thuc truyen
du lieu
// MessageBox(" Da thuc hien
xong chuong trinh","CNC 2.5D Controler",MB_OK|MB_ICONINFORMATION);
}
}else{// chay du lieu da noi suy

Command(G_Ext.Step_X[m_index],G_Ext.V_X[m_index],G_Ext.Step_Y[m_index
],G_Ext.V_Y[m_index],G_Ext.Step_Z[m_index],G_Ext.V_Z[m_index]);

//Command('k',G_Ext.Step_X[m_index],G_Ext.Step_Y[m_index]);
m_index--;
if(m_bStep) if(m_index==0) m_bSend=0;
}
}

UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}

Chương trình viết cho các nút điều khiển:


void CManh_daDlg::OnAxitX1()
{
// TODO: Add your control notification handler code here

stra1.Format(">1 M %d %d",100,200);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];

142
Đồ án tốt nghiệp Cơ điện tử 3 - K47

m_Com.SendData(m_buffer,m_buflen);
}
void CManh_daDlg::OnAxitX2()
{
// TODO: Add your control notification handler code here
//
stra1.Format(">1 D %d %d",100,300);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnAxitY1()
{
// TODO: Add your control notification handler code here
//
stra1.Format(">2 M %d %d",100,300);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnAxitY2()
{
// TODO: Add your control notification handler code here
//
stra1.Format(">2 D %d %d",100,300);

143
Đồ án tốt nghiệp Cơ điện tử 3 - K47

stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnAxitZ1()
{
// TODO: Add your control notification handler code here

Dirx.Format(">3 D %d",1);
Dirx += 0x0d;
Dirx += 0x0a;
m_buflen = strlen(Dirx);
for( sd1=0; sd1<m_buflen; sd1++) m_buffer[sd1] = Dirx[sd1];
//
stra1.Format(">3 M %d %d",100,10);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnAxitZ2()
{
// TODO: Add your control notification handler code here

Dirx.Format(">3 D %d",0);
Dirx += 0x0d;

144
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Dirx += 0x0a;
m_buflen = strlen(Dirx);
for( sd1=0; sd1<m_buflen; sd1++) m_buffer[sd1] = Dirx[sd1];
//
stra1.Format(">3 M %d %d",100,10);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnMachinRun()
{
// TODO: Add your control notification handler code here

// m_bSend = 1; // cho phep truyen du lieu


m_Line = G_File.m_Num; // so lenh G-code
m_Cmd = 0;
// m_bStep = FALSE;
m_index = 0; //
// m_type = 0; // =0 chay lien tuc lenh = 1 chay tung lenh

SetTimer(ID_CLOCK_TIMER,100,0);
}

void CManh_daDlg::OnHomeCNC()
{
// TODO: Add your control notification handler code here

stra1.Format(">2 D %d %d",100,300);

145
Đồ án tốt nghiệp Cơ điện tử 3 - K47

stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
stra1.Format(">1 D %d %d",100,300);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
stra1.Format(">3 D %d %d",100,300);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnStopCNC()
{
// TODO: Add your control notification handler code here

stra1.Format(">2 D %d %d",0,0);
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
stra1.Format(">1 D %d %d",0,0);
stra1 += 0x0d;

146
Đồ án tốt nghiệp Cơ điện tử 3 - K47

stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnRunRB()
{
// TODO: Add your control notification handler code here
if (fag_rb==1)
{
stra1.Format(">4 R");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}
else
{
stra1.Format(">4 R");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}
}

void CManh_daDlg::OnHomeRB()
{

147
Đồ án tốt nghiệp Cơ điện tử 3 - K47

// TODO: Add your control notification handler code here

stra1.Format(">0 H");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnNagTay()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 L");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnHaTay()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 X");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

148
Đồ án tốt nghiệp Cơ điện tử 3 - K47

void CManh_daDlg::OnVuonTay()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 V");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnThuTay()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 T");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnMoKep()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 M");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];

149
Đồ án tốt nghiệp Cơ điện tử 3 - K47

m_Com.SendData(m_buffer,m_buflen);
}
void CManh_daDlg::OnDongKep()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 D");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnQuayTrai()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 t");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);
for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];
m_Com.SendData(m_buffer,m_buflen);
}

void CManh_daDlg::OnQuayPhai()
{
// TODO: Add your control notification handler code here
stra1.Format(">4 p");
stra1 += 0x0d;
stra1 += 0x0A;
m_buflen = strlen(stra1);

150
Đồ án tốt nghiệp Cơ điện tử 3 - K47

for( sj=0; sj<m_buflen; sj++) m_buffer[sj] = stra1[sj];


m_Com.SendData(m_buffer,m_buflen);}
Hàm Command lấy giá trị Vx,Vy,Vz , và số bước stepx, stepy, stepz và truyền
xuống các địa chỉ (1,2,3) tương ứng 3 mạch điều khiển 3 trục CNC.

Thiết lập Firmware.


Trong chương trình điều khiển chung luôn có truyền nhân data:
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if(rs_bReset){ // cho nhan byte >
if(data=='>'){ // dung byte khoi dau
rs_index = 0;
rx_buffer[rs_index] = data; rs_index++;
rs_bReset = 0;
}else rs_bReset = 1;
}else{
if(data == 0x0A){ // CR LR ?
if(rx_buffer[rs_index-1]==0x0D){
rx_buffer[rs_index] = data; ;// rs_index++;
if(rx_buffer[1]==rs_ID){
for(rs_i=0; rs_i<rs_index; rs_i++) rs_Cmd[rs_i] =
rx_buffer[rs_i];
rs_bCmd = 1;
rs_nCmd = rs_index;
}
}
rs_bReset = 1;
rs_index = 0;
}else{
rx_buffer[rs_index] = data;
rs_index++;
}
}
};
}

151
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Đây là một ngắt giao tiếp khi có data truyền xuống tất cả được lưu vào bộ
đệm:
rx_buffer[rs_index]
Trong ngắt này có đoạn kiểm tra nếu đúng địa chỉ thì đọc toàn bộ buffer
vào mảng rs_Cmd[rs_i] , như vậy dữ liệu khi truyền từ máy tính xuống nếu đúng
địa chỉ nó sẽ lưu vào mảng rs_Cmd[rs_i] sau đó chúng ta chỉ việc lấy giá trị từ
mảng ra để dung.
Đoạn chương trình đọc giá trị từ mảng ra:
void ExtCmd(){
switch(rs_Cmd[3]){
case 'S': // lenh kiem -----------------------------------------------
putchar('>');
if(m_Step) {putchar(m_Status+'0');putchar('1');}

else {putchar(m_Status+'0'); putchar('0');}


putchar(0x0d);
break;
case 'M': // lenh chay buoc voi van toc ----------------------------------------
tempNum = 0;
m_bDir=1;
for(m_i=5; rs_Cmd[m_i] != ' '; m_i++) tempNum = 10*tempNum +
rs_Cmd[m_i]-'0';
tempNum = 0xFFFF - m_cal/tempNum;
V_H = tempNum>>8;
V_L = tempNum;
tempNum = 0;
m_j = m_i+1;
for(m_i=m_j; rs_Cmd[m_i] !=0x0D; m_i++) tempNum =
10*tempNum + rs_Cmd[m_i]-'0';
m_Step = tempNum; TIMSK = 0x80;
break;
case 'D': // lenh chieu quay cho Test --------------------------------------
tempNum = 0;
m_bDir=0;
for(m_i=5; rs_Cmd[m_i] != ' '; m_i++) tempNum = 10*tempNum +
rs_Cmd[m_i]-'0';
tempNum = 0xFFFF - m_cal/tempNum;
V_H = tempNum>>8;
V_L = tempNum;
tempNum = 0;
m_j = m_i+1;
for(m_i=m_j; rs_Cmd[m_i] !=0x0D; m_i++) tempNum =
10*tempNum + rs_Cmd[m_i]-'0';

152
Đồ án tốt nghiệp Cơ điện tử 3 - K47

m_Step = tempNum; TIMSK = 0x80;


break;
}
//--- xoa co co lenh moi -- doi lenh tiep theo ---
rs_bCmd = 0;
}

Đoạn chưong trình trên đọc giá trị từ mảng rs_Cmd[].


Trong chương trình điều khiển CNC chúng ta có sử dụng 1 ngắt Timer1.
Các ngắt trong vi điều khiển hoạt động độc lập với nhau, và chúng luôn được ưu
tiên dù đang hoạt động trong bất kì chương trình nào, chính vì vậy chúng ta sử
dụng timer để tính toán thời gian chuyển bước chính xác.
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
//--- Toc do buoc ---
TCNT1H=V_H;
TCNT1L=V_L;
//--- Dieu khien buoc ---
if(m_Step!=0){
if(m_bDir) { if(Limit_A){if(m_Index++>3) m_Index = 1;}
else {m_bDir=~m_bDir; m_Step = 400;}
}
else { if(Limit_Z){if(m_Index--<1) m_Index = 4;}
else {m_bDir=~m_bDir;m_Step = 400;}
}
Out_Step();
m_Step --;
}else TIMSK &= 0x0F;
}

void Out_Step()
{
PORTB = step[m_Index];
}

Chương trình điều khiển ROBOT:


void ExtCmd(){
switch(rs_Cmd[3]){

case 'S': // lenh kiem tra -----------------------------------------------

153
Đồ án tốt nghiệp Cơ điện tử 3 - K47

putchar('>');
if(m_Step) putchar('1');
else{
if(!Limit_A) putchar('A');
else if(!Limit_Z) putchar('Z');
else {putchar(m_Status+'0'); putchar('0');}
}
break;

case 'L': // lenh chay buoc voi van toc ----------------------------------------


Step_1=0;
break;
case 'X': // lenh chay buoc voi van toc ----------------------------------------
Step_1=1;
break;
case 'V': // lenh chay buoc voi van toc ----------------------------------------
Step_2=0;
break;
case 'T': // lenh chay buoc voi van toc ----------------------------------------
Step_2=1;
break;
case 'M': // lenh chay buoc voi van toc ----------------------------------------
Step_3=0;
break;
case 'D': // lenh chay buoc voi van toc ----------------------------------------
Step_3=1;
break;
case 'R': // lenh chieu quay cho Test --------------------------------------
//rs_rb=1;
Robotoutorun();
break;

154
Đồ án tốt nghiệp Cơ điện tử 3 - K47

case 't': // lenh chay buoc voi van toc ----------------------------------------


DC1_DIR=1 ;
delay_ms(10);
DC1_EN=0;
delay_ms(100);
DC1_EN=1;
break;
case 'p': // lenh chay buoc voi van toc ----------------------------------------
DC1_DIR=0 ;
delay_ms(10);
DC1_EN=0;
delay_ms(100);
DC1_EN=1;
break;
case 'Z': //---- Stop tuc thoi ---
rs_rb=0;
rs_home=0;
rs_bReset = 1;
DC1_EN=1;
DC1_DIR=1;
Step_1=Step_2=Step_3=1;
break;
default : //---- mac dinh thi reset
rs_bReset = 1;
break;
}
//--- xoa co co lenh moi -- doi lenh tiep theo ---
rs_bCmd = 0;
}
Hàm ExtCmd(): kiểm tra Data đọc được do máy tính truyền xuống, phân
tích lệnh và thực thi.

155
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Chương trình cho ro bot chạy tự động khi nhận lệnh từ máy tính:
void Robotoutorun(void)
{
DC1_DIR=1;
delay_ms(10);
while(Direct_1)
{
DC1_EN=0;
}
DC1_EN=1;//tat dong co quay
delay_ms(1000);
Step_1=0;//---nang tay may len--------
delay_ms(3500);
Step_2=0;//----dua tay mmay ra--------
delay_ms(1000);
Step_3=0;//----mo kep-----
delay_ms(1000);
Step_1=1;//-----ha tay may xuong----
delay_ms(4000);
Step_3=1;//-----dong kep----
delay_ms(1000);
Step_1=0;//-----nang tay may len-----
delay_ms(3500);
//--dao chieu dong co quay---
DC1_DIR=0;//-----dao chieu dong co------
delay_ms(10);
while(Direct_2)
{
DC1_EN=0;//------quay khi nao cham sensor-----
}
DC1_EN=1;//tat dong co quay khi cham CT---

156
Đồ án tốt nghiệp Cơ điện tử 3 - K47

delay_ms(1000);//---dung cho on dinh---


Step_4=0;
delay_ms(3000); // mo eto
Step_1=1;
delay_ms(4000);//---ha tay may xuong---
Step_4=1;
delay_ms(3000); // mo eto
Step_3=0;
delay_ms(3000);//---mo tay kep ra-------
Step_1=0; //---nang tay may len------
delay_ms(4000);
Step_2=1; //----thu tay may ve-------
delay_ms(2000); }

Chương trình điều khiển băng tải:


void Bangtai_Auto(void)
{
PORTB=0xff;
while(Direct_1)
{
Step_1=1;
}
delay_ms(2000);
Step_1=0;
delay_ms(2000);
Step_1=1;
delay_ms(2);
while(Direct_2)
{
Step_2=1;
}

157
Đồ án tốt nghiệp Cơ điện tử 3 - K47

Step_2=0;
delay_ms(20000);
Step_2=1;
while(Direct_3)
{
Step_3=1;
}
Step_3=0;
delay_ms(4000);
Step_3=1;
while(Direct_4)
{
Step_4=1;
}
delay_ms(2000);
Step_4=0;
delay_ms(2000);
Step_4=1;
delay_ms(2000);
}

158

You might also like