Mục lục:

Hướng dẫn lắp ráp AVR 6: 3 bước
Hướng dẫn lắp ráp AVR 6: 3 bước

Video: Hướng dẫn lắp ráp AVR 6: 3 bước

Video: Hướng dẫn lắp ráp AVR 6: 3 bước
Video: Lắp mạch AVR cho củ phát Hữu Toàn | Máy phát điện Hoàng Kim 2024, Tháng mười một
Anonim
Hướng dẫn lắp ráp AVR 6
Hướng dẫn lắp ráp AVR 6

Chào mừng đến với Hướng dẫn 6!

Hướng dẫn hôm nay sẽ là một bài hướng dẫn ngắn, nơi chúng ta sẽ phát triển một phương pháp đơn giản để giao tiếp dữ liệu giữa một atmega328p và một atmega328p khác bằng cách sử dụng hai cổng kết nối chúng. Sau đó, chúng tôi sẽ lấy con lăn xúc xắc từ Hướng dẫn 4 và Máy phân tích đăng ký từ Hướng dẫn 5, kết nối chúng với nhau và sử dụng phương pháp của chúng tôi để thông báo kết quả của các cuộn xúc xắc từ con lăn đến máy phân tích. Sau đó, chúng tôi sẽ in ra cuộn ở dạng nhị phân bằng cách sử dụng các đèn LED mà chúng tôi đã xây dựng cho máy phân tích trong Hướng dẫn 5. Khi chúng tôi đã làm việc này, chúng tôi sẽ có thể xây dựng phần tiếp theo của dự án tổng thể của chúng tôi trong hướng dẫn tiếp theo.

Trong hướng dẫn này, bạn sẽ cần:

  1. Bảng tạo mẫu của bạn
  2. Con lăn xúc xắc của bạn từ Hướng dẫn 4
  3. Trình phân tích đăng ký của bạn từ Hướng dẫn 5
  4. Hai dây kết nối
  5. Bản sao của Bảng dữ liệu hoàn chỉnh (bản sửa đổi năm 2014):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Bản sao của Hướng dẫn Bộ Hướng dẫn (bản sửa đổi năm 2014):

    www.atmel.com/images/atmel-0856-avr-instruc…

Đây là liên kết đến bộ sưu tập đầy đủ các hướng dẫn về trình biên dịch AVR của tôi:

Bước 1: Làm thế nào chúng ta có thể làm cho hai bộ vi điều khiển nói chuyện với nhau?

Làm thế nào chúng ta có thể có được hai bộ vi điều khiển để nói chuyện với nhau?
Làm thế nào chúng ta có thể có được hai bộ vi điều khiển để nói chuyện với nhau?

Vì chúng tôi đang bắt đầu mở rộng dự án của mình để sản phẩm cuối cùng của chúng tôi được tạo thành từ một tập hợp các bộ phận nhỏ hơn, chúng tôi sẽ cần nhiều chân hơn so với một chiếc Atmega328P duy nhất có thể cung cấp. Do đó, chúng tôi sẽ thực hiện từng phần của dự án tổng thể trên một bộ vi điều khiển riêng biệt và sau đó yêu cầu chúng chia sẻ dữ liệu giữa chúng. Vì vậy, vấn đề mà chúng ta cần giải quyết là làm thế nào chúng ta có thể đưa ra một phương pháp đơn giản để các bộ điều khiển nói chuyện với nhau và truyền dữ liệu giữa chúng? Chà, một điều về các bộ điều khiển này là chúng thực hiện 16 triệu lệnh mỗi giây. Đây là thời gian rất chính xác và vì vậy chúng tôi có thể sử dụng thời gian này để truyền dữ liệu. Nếu chúng ta sử dụng độ trễ mili giây để cấu thành dữ liệu thì chúng ta không thực sự phải chính xác đến như vậy vì CPU đang thực hiện 16.000 lệnh trong một mili giây. Nói cách khác, một phần nghìn giây là vĩnh cửu đối với CPU. Vì vậy, chúng ta hãy thử nó với các cuộn xúc xắc. Tôi muốn truyền kết quả của một lần cuộn xúc xắc từ chip lăn xúc xắc đến chip phân tích. Giả sử bạn đang đứng bên kia đường và tôi muốn báo hiệu cho bạn kết quả khi tôi tung một cặp xúc xắc. Một điều tôi có thể làm, nếu cả hai chúng tôi đều có đồng hồ, là tôi có thể bật đèn pin, sau đó khi bạn sẵn sàng nhận dữ liệu của tôi, bạn bật đèn pin lên và cả hai chúng tôi đều khởi động đồng hồ. Sau đó, tôi bật đèn pin theo số mili giây chính xác khi viên xúc xắc lăn và sau đó tắt nó đi. Vì vậy, nếu tôi cán mốc 12, tôi sẽ giữ đèn sáng trong 12 mili giây. mili giây. Nhưng còn điều này thì sao: Giả sử chúng tôi quyết định rằng tôi sẽ bật đèn trong vòng một năm cho mọi số trên xúc xắc? Sau đó, nếu tôi tung ra con số 12, tôi sẽ chiếu ánh sáng cho bạn trong 12 năm và tôi nghĩ bạn sẽ đồng ý rằng không có khả năng bạn sẽ mắc sai lầm khi tìm ra con số phải không? Bạn có thể nghỉ ngơi và đi chơi bóng chày, thậm chí bạn có thể chơi craps ở Vegas trong 6 tháng, miễn là vào một thời điểm nào đó trong năm, liếc qua đường để xem đèn có bật hay không, bạn sẽ không bỏ sót số điểm. Đó chính xác là những gì chúng tôi đang làm cho các bộ vi điều khiển! Một mili giây đối với CPU giống như một năm. Vì vậy, nếu tôi bật tín hiệu trong 12 mili giây thì hầu như không có khả năng bộ vi điều khiển khác nhầm lẫn với nó trong 10 hoặc 11 cho dù điều gì bị gián đoạn và điều gì không xảy ra trong thời gian chờ đợi. Đối với các bộ vi điều khiển, một phần nghìn giây là vĩnh cửu, vì vậy đây là những gì chúng ta sẽ làm. Đầu tiên chúng ta sẽ chọn hai cổng trên bộ điều khiển để làm cổng giao tiếp. Tôi sẽ sử dụng PD6 để nhận dữ liệu (chúng tôi có thể gọi nó là Rx nếu chúng tôi thích) và tôi sẽ chọn PD7 để truyền dữ liệu (chúng tôi có thể gọi nó là Tx nếu chúng tôi muốn). Chip phân tích sẽ kiểm tra định kỳ chân Rx của nó và nếu nó thấy tín hiệu, nó sẽ giảm xuống "chương trình con giao tiếp" và sau đó truyền tín hiệu trở lại con lăn xúc xắc thông báo rằng nó đã sẵn sàng nhận. Cả hai sẽ bắt đầu tính thời gian và con lăn xúc xắc sẽ truyền tín hiệu (tức là 5V) trong một phần nghìn giây trên mỗi số trên xúc xắc. Vì vậy, nếu cuộn gấp đôi sáues hoặc 12, thì con lăn xúc xắc sẽ đặt PD7 của nó thành 5V trong 12 mili giây và sau đó đặt nó trở lại 0V. Máy phân tích sẽ kiểm tra chân PD6 của nó mỗi mili giây, đếm từng lần và khi nó quay về 0V thì nó sẽ xuất ra số kết quả cho màn hình máy phân tích, hiển thị số mười hai ở dạng nhị phân trên đèn LED. Hãy xem nếu chúng ta có thể thực hiện nó.

Bước 2: Chương trình con Truyền thông

Điều đầu tiên chúng ta cần làm là kết nối hai bộ điều khiển. Vì vậy, lấy một dây từ PD6 trên một và kết nối nó với PD7 trên một dây và ngược lại. Sau đó khởi tạo chúng bằng cách đặt PD7 thành OUTPUT trên cả hai và PD6 thành INPUT trên cả hai. Cuối cùng đặt tất cả chúng thành 0V. Cụ thể, hãy thêm phần sau vào phần Init hoặc Reset của mã trên mỗi bộ vi điều khiển:

sbi DDRD, 7; PD7 được đặt thành đầu ra

cbi PortD, 7; PD7 ban đầu 0V cbi DDRD, 6; PD6 đặt thành đầu vào cbi PortD, 6; PD6 ban đầu 0V clr tổng; tổng số trên xúc xắc ban đầu là 0

Bây giờ chúng ta hãy thiết lập chương trình con giao tiếp trên chip con lăn xúc xắc. Đầu tiên, xác định một biến mới ở trên cùng được gọi là "tổng", biến này sẽ lưu trữ tổng số được lăn trên cặp xúc xắc và khởi tạo nó bằng 0.

Sau đó, viết một chương trình con để giao tiếp với máy phân tích:

giao tiếp:

cbi PortD, 7 sbi PortD, 7; Gửi tín hiệu sẵn sàng chờ: sbic PinD, 6; đọc PinD và bỏ qua nếu độ trễ chờ 0V rjmp 8; trì hoãn để đồng bộ hóa (tìm thấy điều này bằng thực nghiệm) gửi: tổng độ trễ 2 dec 2; độ trễ cho mỗi tổng số lần đếm khuôn cpi, 0; 0 ở đây có nghĩa là "tổng số" sự chậm trễ đã được gửi breq PC + 2 rjmp gửi cbi PortD, 7; Tổng PD7 đến 0V clr; đặt lại tổng số xúc xắc thành 0 ret

Trong trình phân tích, chúng tôi thêm một cuộc gọi từ quy trình chính vào quy trình con giao tiếp:

máy phân tích clr; chuẩn bị cho số mới

sbic PinD, 6; kiểm tra PD6 để biết tín hiệu 5V truyền tín hiệu rcall; nếu 5V đi đến giao tiếp bộ phân tích mov, tổng số; đầu ra cho máy phân tích hiển thị rcall analyzer

và sau đó viết chương trình con giao tiếp như sau:

giao tiếp:

tổng số clr; đặt lại tổng số về 0 độ trễ 10; trì hoãn để thoát khỏi trang bị trả lại PortD, 7; đặt PB7 thành 5V để sẵn sàng nhận tín hiệu: trễ 2; đợi cho tổng số tiếp theo; tăng tổng số sbic PinD, 6; nếu PD6 quay trở lại 0V, chúng tôi đã nhận xong rjmp; ngược lại vòng lặp sao lưu để có thêm dữ liệu cbi PortD, 7; thiết lập lại PD7 khi hoàn thành ret

Làm đi! Giờ đây, mỗi bộ vi điều khiển được thiết lập để giao tiếp kết quả của lần tung xúc xắc và sau đó hiển thị nó trên máy phân tích.

Chúng tôi sẽ thực hiện một cách giao tiếp hiệu quả hơn nhiều sau này khi chúng tôi cần chuyển nội dung của một thanh ghi giữa các bộ điều khiển thay vì chỉ một cuộn xúc xắc. Trong trường hợp đó, chúng tôi sẽ vẫn chỉ sử dụng hai dây kết nối chúng nhưng chúng tôi sẽ sử dụng 1, 1 có nghĩa là "bắt đầu truyền"; 0, 1 có nghĩa là "1"; 1, 0 có nghĩa là "0"; và cuối cùng là 0, 0 có nghĩa là "kết thúc truyền".

Bài tập 1: Xem liệu bạn có thể thực hiện phương pháp tốt hơn không và sử dụng nó để chuyển cuộn xúc xắc dưới dạng số nhị phân 8 bit.

Tôi sẽ đính kèm một video cho thấy tôi đang hoạt động.

Bước 3: Kết luận

Phần kết luận
Phần kết luận

Tôi đã đính kèm mã hoàn chỉnh để bạn tham khảo. Nó không sạch sẽ và gọn gàng như tôi muốn, nhưng tôi sẽ dọn dẹp nó khi chúng tôi mở rộng nó trong các bài hướng dẫn trong tương lai.

Từ bây giờ tôi sẽ chỉ đính kèm các tệp chứa mã thay vì gõ tất cả ra đây. Chúng tôi sẽ chỉ đánh ra các phần mà chúng tôi muốn thảo luận.

Đây là một hướng dẫn ngắn trong đó chúng tôi đưa ra một phương pháp đơn giản để cho bộ vi điều khiển phân tích của chúng tôi biết kết quả của việc cuộn xúc xắc của chúng tôi từ bộ vi điều khiển con lăn xúc xắc trong khi chỉ sử dụng hai cổng.

Bài tập 2: Thay vì sử dụng một tín hiệu sẵn sàng để hiển thị khi con lăn xúc xắc sẵn sàng truyền và một tín hiệu khác khi bộ phân tích sẵn sàng nhận, hãy sử dụng một "ngắt bên ngoài" được gọi là "Ngắt thay đổi pin". Các chân trên atmega328p có thể được sử dụng theo cách này, đó là lý do tại sao chúng có PCINT0 qua PCINT23 bên cạnh chúng trong sơ đồ chân. Bạn có thể thực hiện điều này như một ngắt theo cách tương tự như chúng ta đã làm với ngắt tràn bộ định thời. Trong trường hợp này "trình xử lý" ngắt sẽ là chương trình con giao tiếp với con lăn xúc xắc. Bằng cách này, bạn không cần thực sự gọi chương trình con giao tiếp từ main: nó sẽ chuyển đến đó bất cứ lúc nào có ngắt do thay đổi trạng thái trên chân đó.

Bài tập 3: Một cách tốt hơn nhiều để giao tiếp và truyền dữ liệu giữa một bộ vi điều khiển với một bộ vi điều khiển khác là sử dụng giao diện nối tiếp 2 dây tích hợp trên chính bộ vi điều khiển. Hãy thử đọc phần 22 của biểu dữ liệu và xem liệu bạn có thể tìm ra cách triển khai nó hay không.

Chúng tôi sẽ sử dụng các kỹ thuật mềm hóa hơn này trong tương lai khi chúng tôi thêm các bộ điều khiển khác.

Thực tế là tất cả những gì chúng tôi đã làm với máy phân tích của mình là lấy tổng số cuộn xúc xắc và sau đó in nó ra dưới dạng nhị phân bằng cách sử dụng đèn LED không phải là điều quan trọng. Thực tế là bây giờ máy phân tích của chúng tôi "biết" cuộn xúc xắc là gì và có thể sử dụng nó cho phù hợp.

Trong hướng dẫn tiếp theo, chúng tôi sẽ thay đổi mục đích của "máy phân tích", giới thiệu thêm một số phần tử mạch và sử dụng cuộn xúc xắc theo cách thú vị hơn.

Cho đến lần sau…

Đề xuất: