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

pdf27 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2558 | Lượt tải: 1download
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:

  • pdfTruyền thông giữa 3 vi điều khiển (MCU) bằng atmega8.pdf