Truyền thông giữa 3 vi điều khiển (MCU) bằng atmega8
LỜI MỞ ĐẦU
Điện tử đang trở thành một ngành khoa học đa nhiệm vụ. Điện tử đã đáp ứng được những đòi hỏi không ngừng từ các lĩnh vực Công – Nông – Lâm – Ngư nghiệp, cho đến các nhu cầu thiết yếu nhất trong hoạt động đời sống hằng ngày.
Một trong những ứng dụng rất quan trọng của công nghệ điện tử là kỹ thuật truyền thông và ứng dụng về đèn giao thông.
Vào thập kỷ 90, công nghệ truyền thông được đưa vào các sản phẩm cơ-điện tử, đã tạo nên các sản phẩm có khả năng kết nối mạng. Cũng trong giai đoạn này, các vi cảm biến và cơ cấu chấp hành siêu nhỏ được phát triển và ứng dụng trong nhiều sản phẩm như các hệ thống vi cơ-điện tử. Có thể nói rằng, chức năng của các máy móc và hệ thống cơ kỹ thuật hiện nay phụ thuộc chủ yếu vào phần mềm (có thể là một thuật toán, mạng nơron, hệ mờ) trong máy tính của sản phẩm. Riêng điều này đã là một sự khác biệt về chất so với các sản phẩm cơ điện cách đây 25-30 năm trước.
MỤC LỤC
Mục lục
Danh sách các hình
LỜI MỞ ĐẦU .
CHƯƠNG 1: TRUYỀN THÔNG GIỮA 3 vi điều khiển MCU
1.1 các kiểu truyền thông .
1.1.1 Điểm – nối – điểm (Point-to-point) .
1.1.2 Điểm – nối – nhiều điểm (Point-to-multipoint) .
1.1.3 Quảng bá (broadcasting) .
1.1.4 Truyền đơn công (simplex)
1.1.5 Truyền bán song công (Half-duplex)
1.1.6 Truyền song công (Full-duplex) .
1.2 Truyền song công (Full-duplex) giữa các MCU
1.2.1 Thanh ghi
1.2.2 Sử dụng UART
1.3 Truyền thông 3 vi điều khiển (MCU) .
1.3.1 nguyên lý hoạt động của truyền thông 3 boad .
1.3.2 sơ đồ nguyên lý boad mạch
1.3.3 chương trình giải thuật
1.3.3.1 chương trình (truyền đi)master) .
1.3.3.2 Chương trình nhận (dữ liệu) savle1
1.3.3.3Chương trình nhận dữ liệu(savle2) .
TÀI LIỆU THAM KHẢO
DANH SÁCH CÁC HÌNH
Hình 1.1 Điểm – nối – điểm (Point-to-point)
Hình 1.2 Điểm – nối – nhiều điểm (Point-to-multipoint)
Hình 1.3 Quảng bá (broadcasting) .
Hình 1.4 Truyền đơn công (simplex) .
Hình 1.5 Truyền bán song công (Half-duplex)
Hình 1.6 Truyền song công (Full-duplex .
Hình 1.7 Atmega8 . .
Hình 1.8 thanh ghi USART
Hình 1.9 thanh ghi UCSRC .
Hình 1.10 hai thanh ghi UBRRL và UBRRH
Hình 1.11 kết nối giữa 3 MCU .
Hình 1.12 sơ đồ nguyên lý boad mạch
27 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2558 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Truyền thông giữa 3 vi điều khiển (MCU) bằng atmega8, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Trang 1
MỤC LỤC Trang
Mục lục ................................................................ ................. ........ ................. 1
Danh sách các hình .......................................... ................ ........................ 2
LỜI MỞ ĐẦU ................................................ ................ ........................ 3
CHƯƠNG 1: TRUYỀN THÔNG GIỮA 3 vi điều khiển MCU
1.1 các kiểu truyền thông......................... .............. ........................ 4
1.1.1 Điểm – nối – điểm (Point-to-point)………… ........................ 4.
1.1.2 Điểm – nối – nhiều điểm (Point-to-multipoint)… .................. 4
1.1.3 Quảng bá (broadcasting)………………………. .................... 4
1.1.4 Truyền đơn công (simplex)………………… ........................ 5
1.1.5 Truyền bán song công (Half-duplex)………… ...................... 5
1.1.6 Truyền song công (Full-duplex)………………...................... 5
1.2 Truyền song công (Full-duplex) giữa các MCU……… ............... 6
1.2.1 Thanh ghi……………………………………......................... 7
1.2.2 Sử dụng UART……………………………… ........................ 8
1.3 Truyền thông 3 vi điều khiển (MCU)………….. . ........................ 9
1.3.1 nguyên lý hoạt động của truyền thông 3 boad…………........... 9
1.3.2 sơ đồ nguyên lý boad mạch……………. ........ ........................ 10
1.3.3 chương trình giải thuật…………….. .............. ........................ 10
1.3.3.1 chương trình (truyền đi):(master)…………........................ 12
1.3.3.2 Chương trình nhận (dữ liệu) savle1……………................. 17
1.3.3.3 Chương trình nhận dữ liệu(savle2)………………………...23
TÀI LIỆU THAM KHẢO………………………………………………....45
DANH SÁCH CÁC HÌNH
Hình 1.1 Điểm – nối – điểm (Point-to-point)......... ……………………………4
Hình 1.2 Điểm – nối – nhiều điểm (Point-to-multipoint)……………………....4
Hình 1.3 Quảng bá (broadcasting)……………………………………………...5
Hình 1.4 Truyền đơn công (simplex) ………………………………………….5
Hình 1.5 Truyền bán song công (Half-duplex)……………………………........5
Hình 1.6 Truyền song công (Full-duplex………………………………….........6
Hình 1.7 Atmega8 ……………………………………………………….….....6
Hình 1.8 thanh ghi USART……………………………………………………7
Hình 1.9 thanh ghi UCSRC……………………………………………….........8
Hình 1.10 hai thanh ghi UBRRL và UBRRH……………………………........8
Hình 1.11 kết nối giữa 3 MCU………………………………………………...9
Hình 1.12 sơ đồ nguyên lý boad mạch ……………………………………10
Trang 2
LỜI MỞ ĐẦU
Ngày nay, với những ứng dụng của khoa học kỹ thuật tiên tiến, thế giới của
chúng ta đã và đang một ngày thay đổi, văn minh và hiện đại hơn. Sự phát triển của
kỹ thuật điện tử đã tạo ra hàng loạt những thiết bị với các đặc điểm nổi bật như sự
chính xác cao, tốc độ nhanh, gọn nhẹ đó cũng là những yếu tố rất cần thiết góp
phầncho hoạt động của con người đạt hiệu quả cao.
Điện tử đang trở thành một ngành khoa học đa nhiệm vụ. Điện tử đã đáp ứng
được những đòi hỏi không ngừng từ các lĩnh vực Công – Nông – Lâm – Ngư
nghiệp, cho đến các nhu cầu thiết yếu nhất trong hoạt động đời sống hằng ngày.
Một trong những ứng dụng rất quan trọng của công nghệ điện tử là kỹ thuật
truyền thông và ứng dụng về đèn giao thông.
Vào thập kỷ 90, công nghệ truyền thông được đưa vào các sản phẩm cơ-
điện tử, đã tạo nên các sản phẩm có khả năng kết nối mạng. Cũng trong giai đoạn
này, các vi cảm biến và cơ cấu chấp hành siêu nhỏ được phát triển và ứng dụng
trong nhiều sản phẩm như các hệ thống vi cơ-điện tử. Có thể nói rằng, chức năng
của các máy móc và hệ thống cơ kỹ thuật hiện nay phụ thuộc chủ yếu vào phần
mềm (có thể là một thuật toán, mạng nơron, hệ mờ) trong máy tính của sản phẩm.
Riêng điều này đã là một sự khác biệt về chất so với các sản phẩm cơ điện cách đây
25-30 năm trước.
Trang 3
CHƯƠNG 1: TRUYỀN THÔNG GIỮA 3 MCU
1.1 CÁC KIỂU TRUYỀN THÔNG:
1.1.1 Điểm – nối – điểm (Point-to-point): truyền thông diễn ra giữa 2 điểm đầu
cuối. Ví dụ, trong trường hợp của truyền thông bằng giọng nói sử dụng điện thoại,
có một bên thực hiện cuộc gọi và bên còn lại nhận cuộc gọi. Vì thế truyền thông
dạng này được gọi là điểm-tới-điểm.
Hình 1.1
1.1.2 Điểm – nối – nhiều điểm (Point-to-multipoint): Trong kiểu truyền thông
này, có một bên gửi và nhiều bên nhận. Lấy ví dụ, trong một cuộc hội thoại (voice
conferencing), một người sẽ nói và nhiều người khác lắng nghe. Thông điệp từ
người gửi được truyền tải tới nhiều người nghe (multicast).
Hình 1.2
1.1.3 Quảng bá (broadcasting): có một điểm trung tâm mà từ đó thông tin
được gửi tới nhiều người nhận, ví dụ như việc quảng bá hình ảnh từ đài truyền hình
hoặc quảng bá âm thanh từ đài phát thanh. Trong một hệ thống quảng bá, những
người nhận ở trạng thái thụ động (chỉ lắng nghe hoặc chỉ xem nhìn…), và không có
một tuyến đường dành riêng cho việc truyền thông.
Trang 4
Hình 1.3
1.1.4Truyền đơn công (simplex): việc truyền thông chỉ xảy ra theo một
chiều duy nhất. Có một bên gửi và một bên nhận; bên gửi chỉ có nhiệm vụ gửi
thông tin, bên nhận chỉ việc nhận thông tin và 2 bên không thể thay đổi vai trò cho
nhau.
Hình 1.4
1.1.5 Truyền bán song công (Half-duplex): Truyền thông giữa 2 thực thể
(máy tính hoặc con người) có thể xảy ra theo cả 2 chiều, nhưng tại một thời điểm
một thực thể chỉ có thể gửi hoặc nhận thông tin. Máy bộ đàm cầm tay (walkie-
talkie) sử dụng phương thức truyền tin này. Khi một người muốn nói thì anh ta nhấn
nút “nói” trên bộ đàm để bắt đầu nói, và bộ đàm của người còn lại sẽ ở trong chế độ
nhận tín hiệu. Khi người gửi hoàn thành việc gửi tin, anh ta gửi một thông điệp báo
hiệu kết thúc việc gửi. Lúc này, người còn lại mới có thể nhấn nút “nói” và bắt đầu
nói. Những hệ thống kiểu này yêu cầu băng thông kênh truyền giới hạn, vì vậy đây
là những hệ thống có chi phí thấp.
Hình 1.5
1.1.6 Truyền song công (Full-duplex): Trong một hệ thống truyền song
công, 2 bên – gửi và nhận – trong một thời điểm có thể đồng thời gửi và nhận tín
hiệu cho nhau, ví dụ hệ thống điện thoại. Tuy nhiên, cần lưu ý rằng hệ thống truyền
thông này cho phép truyền nhận dữ liệu đồng thời, nhưng khi có 2 người đồng thời
Trang 5
cùng “nói” thì việc truyền thông kém hiệu quả đi rất nhiều! Một hệ thống truyền
thông mà cùng lúc có khả năng vận chuyển dữ liệu theo cả 2 chiều được gọi là hệ
thống truyền song công.
Hình 1.6
Trong truyền thông kiểu đơn công, việc truyền thông chỉ xảy ra theo 1 chiều
duy nhất. Trong truyền thông kiểu bán song công, việc truyền thông xảy ra theo cả
2 chiều, nhưng tại một thời điểm chỉ có duy nhất một chiều được hoạt động. Trong
truyền thông kiểu song công toàn phần, việc truyền thông xảy ra đồng thời theo cả 2
chiều.
Dựa trên loại thông tin được truyền tải, chúng ta có các hệ thống truyền
thông như: thoại, fax, hình ảnh, dữ liệu… Khi nhiều loại thông tin được gộp chung
lại với nhau, chúng ta có hệ thống truyền thông đa phương tiện (multimedia).
1.2 Truyền song công (Full-duplex) giữa các MCU: còn được gọi là truyền
thông nối tiếp không đồng bộ, ở đây ta dùng atmega8.
Hình 1.7 Atmega8
Vi điều khiển Atmega8 có 1 module truyền thông nối tiếp USART. Có 3 chân
chính liên quan đến module này đó là chân xung nhịp - XCK (chân số 1), chân
truyền dữ liệu – TxD (Transmitted Data) và chân nhận dữ liệu –RxD (Reveived
Data). Trong đó chân XCK chỉ được sử dụng như là chân phát hoặc nhận xung giữ
nhịp trong chế độ truyền động bộ. Tuy nhiên bài này chúng ta không khảo sát chế
Trang 6
độ truyền thông đồng bộ, vì chỉ cần quan tâm đến 2 chân TxD và RxD.Vì các chân
truyền/nhận dữ liệu chỉ đảmnhiệm 1 chức năng độc lập (hoặc là truyền, hoặc là
nhận), để kết nối các chip AVR với nhau (hoặc kết nối AVR với thiết bị hỗ trợ
UART khác) bạn phải đấu “chéo” 2 chân này. TxD của thiết bị thứ nhất kết nối với
RxD của thiết bị 2 và ngược lại. Module USART trên chip Atmega32 hoạt động
“song công” (Full Duplex Operation), nghĩa là quá trình truyền và nhận dữ liệu có
thể xảy ra đồng thời.
1.2.1 Thanh ghi:
Cũng như các thiết bị khác trên AVR, tất cả hoạt động và tráng thái của module
USART được điều khiển và quan sát thông qua các thanh ghi trong vùng nhớ I/O.
Có 5 thanh ghi được thiết kế riêng cho hoạt động và điều khiển của USART, đó là:
UDR: hay thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa giá trị nhận được và phát
đi của USART. Thực chất thanh ghi này có thể coi như 2 thanh ghi TXB (Transmit
data Buffer) và RXB (Reveive data Buffer) có chung địa chỉ. Đọc UDR thu được
giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR tương đương đặt giá trị vào
thanh ghi đệm phát, chuẩn bị để gởi đi. Chú ý trong các khung truyền sử dụng 5, 6
hoặc 7 bit dữ liệu, các bit cao của thanh ghi UDR sẽ không được sử dụng
UCSRA (USART Control and Status Register A): là 1 trong 3 thanh ghi điều
khiển hoạt động của module USART.
Hình 1.8 thanh ghi USART
Thanh ghi UCSRA chủ yếu chứa các bit trạng thái như bit báo quá trình nhận
kết thúc (RXC), truyền kết thúc (TXC), báo thanh ghi dữ liệu trống (UDRE), khung
truyền có lỗi (FE), dữ liệu tràn (DOR), kiểm tra parity có lỗi (PE)…Bạn chú ý một
số bit quan trọng của thanh ghi này
UCSRC (USART Control and Status Register C): thanh ghi này chủ yếu quy
định khung truyền và chế độ truyền. Tuy nhiên, có một rắc rối nho nhỏ là thanh ghi
này lại có cùng địa chỉ với thanh ghi UBRRH (thanh ghi chứa byte cao dùng để xác
lập tốc độ baud), nói một cách khác 2 thanh ghi này là 1. Vì thế bit 7 trong thanh
ghi này, tức bit URSEL là bit chọn thanh ghi. Khi URSEL=1, thanh ghi này được
chip AVR hiểu là thanh ghi điều khiển UCSRC, nhưng nếu bit URSEL=0 thì thanh
ghi UBRRH sẽ được sử dụng.
Trang 7
Hình 1.9 thanh ghi UCSRC
UCPOL (Clock Pority) là bit chỉ cực của xung kích trong chế độ truyền
thông đồng bộ. nếu UCPOL=0, dữ liệu sẽ thay đổi thay đổi ở cạnh lên của xung
nhịp, nếu
UCPOL=1, dữ liệu thay đổi ở cạnh xuống xung nhịp. Nếu bạn sử dụng chế
độ truyền thông không đồng bộ, hãy set bit này bằng 0..
UBRRL và UBRRH (USART Baud Rate Register): 2 thanh ghi thấp và cao
quy định tốc độ baud.
Hình 1.10 hai thanh ghi UBRRL và UBRRH
Nhắc lại là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC, bạn phải
set bit này bằng 0 nếu muốn sử dụng thanh ghi UBRRH. Như bạn quan sát trong
hình trên, chỉ có 4 bit thấp của UBRRH được dùng, 4 bit này kết hợp với 8 bit trong
thanh ghi UBRRL tạo thành thanh ghi 12 bit quy định tốc độ baud. Chú ý là nếu bạn
viết giá trị vào thanh ghi UBRRL, tốc độ baud sẽ tức thì được cập nhật, vì thế bạn
phải viết giá trị vào thanh ghi UBRRH trước khi viết vào thanh ghi UBRRL.
Giá trị gán cho thanh ghi UBRR không phải là tốc độ baud, nó chỉ được
USART dùng để tính tốc độ baud.
1. 2.2 Sử dụng UART:.
Thông thường, để sử dụng module USART trên AVR bạn phải thực hiện 3 việc
quan trọng, đó là: cài đặt tốc độ baud (thanh ghi UBRR), định dạng khung truyền
(UCSRB, UCSRC) và cuối cùng kích hoạt bộ truyền, bộ nhận, ngắt…Như đã đề
cập, trong tài liệu này tôi chủ yếu đề cập đến phương pháp truyền thông không đồng
bộ, việc xác lập các thông số hoạt động chủ yếu dựa trên chế độ này. Trong hầu hết
các ứng dụng, tốc độ baud và khung truyền thường không đổi, trong trường hợp này
chúng ta có thể khởi tạo trực tiếp USART ở phần đầu trong main và sau đó chỉ cần
truyền hoặc nhận dữ liệu mà không cần thay đổi các cài đặt. Tuy nhiên, nếu trường
hợp giao tiếp “linh hoạt” ví dụ bạn đang chế tạo một thiết bị có khả năng giao tiếp
với một thiết bị đầu cuối khác (như máy tính chẳng hạn), lúc này bạn nên cho phép
người dùng thay đổi tốc độ baud hoặc các thông số khác để phù hợp với thiết bị đầu
cuối. Đối với những ứng dụng kiểu này bạn nên viết 1 chương trình con để khởi
động USART và có thể gọi lại nhiều lần khi cần thay đổi. Phần tiếp theo chúng ta
Trang 8
sẽ viết một số chương trình ví dụ minh họa cách sử dụng module truyền thông
USART từ đơn giản đến phức tạp. Các ví dụ sẽ được thực hiện cho chip Atmega32
với giả sử nguồn xung nhịp hệ thống là 8MHz.
1.3 Truyền thông 3 vi điều khiển (MCU):
RxD TxD
TxD RxD
TxD
RxD
Hình 1.11 kết nối giữa 3 MCU
1.3.1 nguyên lý hoạt động của truyền thông 3 boad:
Trong truyền thông 3 boad có 2 con tớ(savel) va 1 con chủ (master) bộ điều
khiển atmega 8 được nối chung lại với nhau bằng 2 chân txd và rxd là 2 chân truyền
thông được truyền dữ liệu đi.
con master sẽ chọn địa và chỉ truyền dữ liệu đi ,con master quy định với địa
chỉ mà con savle thứ nhất sẽ làm công việc này và con savle thứ hai sẽ làm công
việc kia.
Khi truyền dữ liệu bit stop được dần đẩy về sau cùng.
start stop add data1 data2
station
MCU2
(savle1)
MCU3
(savle2)
MCU1
(master)
Trang 9
1.3.2 sơ đồ nguyên lý boad mạch
J15
CON1
1
J16
CON1
1
J17
CON1
1
J18
CON1
1
Reset
J12
CON2
1
2
5V5V
R3
330
U1 ATMEGA8
PD0/RXD2
PD1/TXD
3
PD2/INT04
PD3/INT15
PD4/SCK/T06
VCC7
G
N
D
8
XTAL19
XTAL2
10
PD5/T111
PD6/AN012
PD7/AN113
PB0/ICP 14
OC1A/PB1 15
SS/OC1B/PB2 16
PB3/MOSI/OC2
17PB4/MISO
18PB5/SCK
19
AVCC20
AREF21 AG
N
D
22
PC0/ADC0 23
PC1/ADC1 24
PC2/ADC2 25
PC3/ADC3 26
PC4/ADC4/SDA 27
PC5/ADC5/SCL
28RESET
1
MOSI
SCK
MISO
J8
CON2
1
2
5V
5V
5V
J11
POWER
1
2
J14
CON6
1
2
3
4
5
6
D10
2A
RxD
TxD
J9
CON2
1
2
J10
Nap
1
2
3
4
5
6
SW4 SW5 SW6
RxD
C11
1100u/16V C12
470uF/16V
5V
TxD
U4
LM7805
+ in1
-
2
+ out 3
MOSI
MISO
SCK
Reset
C13
104
J19
CON2
1
2
TxD
RxD
C14
104
J20
CON2
1
2
U3
MAX232
C1 +1
R1IN 13
G
N
D
15
R2 IN 8R2 OUT9
T1 IN11
C2 +4
T1 OUT 14
Vc
c
16
C1 -3
V - 6
V + 2
C2 -5
T2 IN
10
T2 OUT
7
R1 OUT12
C6
30p
C10
4.7u/50V
C7
30p
SCL
SDA
P1
DB9
5
9
4
8
3
7
2
6
1
C1
0.1uF
C8
104
5V
J21
CON2
1
2
SDA
SCL
R4
10K
C9
104
SCL
5V
SDA
Y1
8MHz
1
2
C2
0.1uF
D11 LED
Reset
C3
0.1uF
R5 1K
Reset
C4
0.1uF
5V
5V
C5
104
TxD
RxD
Hình 1.12
1.3.3 chương trình giải thuật
1.3.3.1 chương trình (truyền đi):(master):
#include
#include
#include
#include
#define len_F 2
#define led PORTC
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
Trang 10
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
char ktra=0,ktra2=0,ch;
unsigned char index_F,start_F,received;
unsigned char frame_Rx[100];
//unsigned char len_F;
unsigned char data1,data2,i;
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
Trang 11
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
Trang 12
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Standard Input/Output functions
#include
// Declare your global variables here
void truyen(char station,char data1,char data2)
{
putchar('s');
putchar('t');
putchar(station);
putchar(data1);
putchar(data2);
delay_ms(100);
Trang 13
}
void nhan()
{
ch=getchar();
if((index_F>=1)&&(ch=='t')&&(frame_Rx[index_F-1]=='s'))
{
index_F=0;
start_F=1;
}
else
frame_Rx[index_F++]=ch;
if((start_F)&&(index_F>len_F))
{
start_F=0;
received=1;
}
if(index_F>RX_BUFFER_SIZE)
{
frame_Rx[0]=frame_Rx[index_F-2];
frame_Rx[1]=frame_Rx[index_F-1];
index_F=2;
}
if(received)
{
data1=frame_Rx[0];
data2=frame_Rx[1];
}
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
Trang 14
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State6=T State5=T State4=T State3=1 State2=1 State1=1 State0=1
PORTC=0x0F;
DDRC=0x0F;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
Trang 15
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
Trang 16
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
truyen(0x00,1,2);
delay_ms(10);
truyen(0x01,3,4);
delay_ms(10);
};
}
1.3.3.2 Chương trình nhận (dữ liệu) savle1:
#include
#include
#include
#include
#define len_F 3
#define led PORTC
#define station 0x00
// #define station 0x01
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
Trang 17
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
char ktra=0,ktra2=0,ch;
unsigned char index_F,start_F,received;
unsigned char frame_Rx[100];
//unsigned char len_F;
unsigned char data1,data2,i;
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
Trang 18
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
Trang 19
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Standard Input/Output functions
#include
// Declare your global variables here
void truyen()
{
putchar('s');
putchar('t');
putchar(1);
putchar(2);
delay_ms(100);
}
void nhan()
{
{
ch=getchar();
Trang 20
if((index_F>=1)&&(ch=='t')&&(frame_Rx[index_F-1]=='s'))
{
index_F=0;
start_F=1;
}
else
frame_Rx[index_F++]=ch;
if((start_F)&&(index_F>len_F))
{
start_F=0;
if(frame_Rx[0]==station)
{
received=1;
}
}
if(index_F>RX_BUFFER_SIZE)
{
frame_Rx[0]=frame_Rx[index_F-3];
frame_Rx[1]=frame_Rx[index_F-2];
frame_Rx[2]=frame_Rx[index_F-1];
index_F=3;
}
if(received)
{
data1=frame_Rx[1];
data2=frame_Rx[2];
}
if(data2==2)
{
led=0XFF;
for(i=0;i<4;i++)
{
led<<=1;
delay_ms(500);
}
led=0XFF;
for(i=0;i<4;i++)
{
led>>=1;
Trang 21
delay_ms(500);
}
}
}
}
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x0F;
DDRC=0x0F;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
ACSR=0x80;
Trang 22
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
if(rx_counter!=0)
{
nhan();
}
else
received=0;
data1=0;
data2=0;
};
}
1.3.3.3 Chương trình nhận dữ liệu(savle2):
#include
#include
#include
#include
#define len_F 3
#define led PORTC
#define station 0x01
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
Trang 23
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
char ktra=0,ktra2=0,ch;
unsigned char index_F,start_F,received;
unsigned char frame_Rx[100];
//unsigned char len_F;
unsigned char data1,data2,i;
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
Trang 24
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
Trang 25
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
#include
void truyen()
{
putchar('s');
putchar('t');
putchar(1);
putchar(2);
delay_ms(100);
}
void nhan()
{
{
ch=getchar();
if((index_F>=1)&&(ch=='t')&&(frame_Rx[index_F-1]=='s'))
{
index_F=0;
start_F=1;
}
Trang 26
else
frame_Rx[index_F++]=ch;
if((start_F)&&(index_F>len_F))
{
start_F=0;
received=1;
}
if(index_F>RX_BUFFER_SIZE)
{
frame_Rx[0]=frame_Rx[index_F-3];
frame_Rx[1]=frame_Rx[index_F-2];
frame_Rx[2]=frame_Rx[index_F-1];
index_F=3;
}
if((received)&&(frame_Rx[0]==station))
{
data1=frame_Rx[1];
data2=frame_Rx[2];
}
if(data1==3)
{
for(i=0;i<10;i++)
{
led=~led;
delay_ms(400);
}
}
}
}
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x0F;
DDRC=0x0F;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
Trang 27
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
ACSR=0x80;
SFIOR=0x00;
#asm("sei")
while (1)
{
if(rx_counter!=0)
{
nhan();
}
else
received=0;
data1=0;
data2=0;
};
} TÀI LIỆU THAM KHẢO
Các file đính kèm theo tài liệu này:
- Truyền thông giữa 3 vi điều khiển (MCU) bằng atmega8.pdf