Kiến thức cơ bản về vi điều khiển đã khám phá

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





Một điều tuyệt vời về IC vi điều khiển, chúng có sẵn hầu như ở mọi nơi trên toàn cầu và các nhà bán lẻ điện tử.

Giới thiệu

Về cơ bản, các thiết bị vi điều khiển được sử dụng phổ biến trong các ứng dụng liên quan đến việc đánh giá môi trường xung quanh và trong các thiết bị điện tử tương tự.



Bạn có thể thấy các thiết bị này được sử dụng để hiển thị một thông số nhất định, trong các ứng dụng điều khiển động cơ, đèn LED, cảm biến thuộc nhiều loại khác nhau như cảm biến độ nghiêng, gia tốc kế, đồng hồ đo vận tốc, bộ ghi dữ liệu, bộ điều khiển nhiệt độ, bàn phím, v.v.

Bạn có thể hiểu cơ bản về bộ vi điều khiển bằng cách tham khảo bộ vi điều khiển AVR Amega32 tiên tiến đến mức đôi khi nó được gọi là máy tính trong chip.



Thiết bị này được chỉ định thực hiện một loạt lệnh để tạo thành một chương trình.

Ngôn ngữ của chương trình mà bạn sẽ thấy ở đây là C ++. Bạn sẽ học ngôn ngữ này chuyên sâu hơn trong khóa học tại đây.

Khi nói đến MCU, bạn sẽ có cơ sở có tùy chọn kiểm soát và cấu hình tất cả các sơ đồ chân của nó.

Nếu bạn cảm thấy hơi mệt mỏi với việc này, hãy cứ bình tĩnh vì nó không có gì phức tạp cả, bạn sẽ được xoa dịu mọi khía cạnh một cách ổn định nhưng vững chắc khi chúng ta tiến lên phía trước.

Trong một chip MCU, tất cả các chân ngoại trừ Vdd và Vss là các chân nguồn của chip, có thể được chỉ định bằng các ký hiệu riêng.

Chi tiết sơ đồ chân

Nếu bạn nhìn vào con chip từ trên xuống, bạn sẽ tìm thấy một rãnh nhỏ hình tam giác cho biết điểm bắt đầu từ nơi các sơ đồ chân bắt đầu. Đó là chân số 1 của chip bắt đầu ngay dưới rãnh này.

Bắt đầu từ ghim này, bạn sẽ tìm thấy 20 ghim từ dưới lên trên ở bên đó (trái) và 20 ghim khác ở phía bên kia (phải), tiếp tục từ dưới lên trên ở phía bên tay phải.

8 chân đầu tiên bắt đầu từ rãnh là PBO-7 tạo thành chân chỉ mục của vi mạch vì tất cả các chương trình ở đây đều bắt đầu bằng chỉ số 0.

Chuỗi sơ đồ chân ở trên được gọi là CỔNG B, trong khi có những bộ cổng giống hệt nhau khác được gán A cho D.

Các cổng này có thể được chỉ định để chấp nhận và nhận dạng dữ liệu được cung cấp gọi là INPUT và cũng để truyền dữ liệu ở một số dạng cụ thể được gọi là OUTPUT.

Hai trong số các chân thuộc loại chung là chân (+) / (-), còn được gọi là Vdd và GND.

Có thể thấy một chân từ PORT D (PDO-6) nằm ở phía bên trái của chip ở khu vực dưới cùng.

PD7 là chân số 7 của PORT D có thể được truy tìm khi đứng một mình và bắt đầu chuỗi sơ đồ chân bên phải.

Bây giờ chuyển sang từ phía bên phải của chip nơi PORT D kết thúc, PORT C bắt đầu đếm ngược lên theo thứ tự.

Những điều này góp phần tạo ra nhiều chân cắm thú vị của MCU ngay từ chân analog sang chân kỹ thuật số.

Các chân này được đặc trưng để trở thành đầu vào cảm biến để phát hiện nhiều tham số thông qua các giai đoạn mạch tương tự được cấu hình bên ngoài.

Các chân trên tạo thành CỔNG A.

Việc chuyển đổi tương tự sang kỹ thuật số trên các chân ở trên có thể được hiểu với sự trợ giúp của một ví dụ trong đó mức nhiệt độ tương tự được phát hiện bằng cách sử dụng một cảm biến thông thường chẳng hạn như một bộ đo nhiệt được áp dụng cho một trong các chân PORT A được MCU chấp nhận và bộ chuyển đổi dễ dàng để tạo ra một số đọc từ 0 đến 255 độ F (con số 8 bit có thể được nâng cấp để đạt được đầu ra 10 bit).

Một tính năng khác có thể được chứng kiến ​​trong MCUs là không gian lập trình có sẵn hoặc bộ nhớ xác định không gian cho các biến và chương trình được chỉ định cho vi điều khiển.

Hơn nữa, MCU có một đồng hồ tích hợp được chỉ định để đếm các tham số liên quan.

Các tính năng đồng hồ cho phép MCU tự áp dụng cho nhiều quy trình đếm khác nhau, có thể nhanh trong phạm vi micro giây tùy thuộc vào đặc điểm kỹ thuật của thiết bị cụ thể và cũng có thể chậm hơn ở bất kỳ phạm vi mong muốn nào.

Đến đây bạn có thể đã hiểu khái niệm vi điều khiển ở một mức độ nào đó và liên quan đến các cổng và chân của nó.

Cách tạo Trình kết nối SPI từ Bộ lập trình đến Bộ vi điều khiển

Bây giờ đã đến lúc đi sâu hơn một chút vào chủ đề này và khám phá thế giới lập trình.

Phải nói rằng, trước khi tham gia vào quy trình tải chương trình vào chip, chúng ta cần tìm một cách thích hợp để tích hợp đầu nối SPI (Giao diện ngoại vi nối tiếp) với MCU.

Tuy nhiên, ngay cả sau đó, chúng ta không thể chỉ đẩy SPI vào sơ đồ MCU, đúng không? Chúng ta cũng không thể cho phép các dây nối dài từ SPI cắm trực tiếp vào bảng mạch bánh mì. Điều này cũng có thể gây ra cài đặt dây không chính xác được kết nối với các chân không chính xác làm cho kết nối kém.

Vì vậy, để làm cho mọi thứ hoàn toàn hoàn hảo, chúng tôi thực hiện các quy trình trên một tấm veroboard nhỏ trong đó chúng tôi nhận được các chân kim loại kết nối cần thiết còn được gọi là 'tiêu đề' được hàn. Các chân tiêu đề này hiện có thể được sử dụng để kết nối với đầu nối SPI. Các kết nối từ tiêu đề này có thể được kết thúc với một chân tiêu đề song song khác có thể được sử dụng cho các kết nối bảng mạch.

Do đó, phần lắp ráp trên hiện tạo thành một nền tảng kết nối trung gian vừa khít và đáng tin cậy cho SPI với MCU.

Uptil giờ đây mọi thứ đều đẹp, quảng cáo hoàn hảo, vì vậy hãy tiếp tục kiếm tiền liên quan đến lập trình viên được yêu cầu giữa PC của bạn và MCU.

Có thể có một loạt các công ty sản xuất và bán các đơn vị lập trình viên này, vì vậy việc mua sắm các đơn vị này không phải là vấn đề đối với bạn, chẳng hạn như Adafruit Industries, USBtinyISP hoặc Sparkfun, v.v.

Một vài trong số này có thể trông hoàn toàn khác với các loại thông thường, nhưng về cơ bản thì mọi thứ đều giống hệt nhau và tuân theo các quy tắc lập trình tiêu chuẩn và có thể được sử dụng làm giao diện giữa PC của bạn và vi điều khiển AVR.

Tuy nhiên, hãy chắc chắn rằng nếu bạn đang sử dụng một số MCU khác mà không phải là AVR Atmega32, bạn có thể phải kiểm tra một lập trình viên tương thích tương ứng cho chip MCU cụ thể đó.

Có thể quan sát thấy rằng khá nhiều lập trình viên này sử dụng các trình điều khiển giống hệt nhau, điều gì đó cần được quan tâm và chúng ta sẽ tìm hiểu thêm về nó trong các chương tiếp theo của chúng tôi.

Kết nối PC của bạn với chip vi điều khiển thực sự rất cơ bản và bạn sẽ rất vui khi biết quy trình này được yêu cầu đơn giản như thế nào. Vì vậy, hãy nhấn nút ngay lập tức

Tạo bảng giao diện SPI được giải thích ở trên không khó, tất cả chỉ là việc làm cho sắt hàn của bạn hoạt động thông qua tất cả các kết nối trên hai hàng chân cắm được hiển thị trên bảng mục đích chung nhỏ.

Hình trên cho thấy các chi tiết kết nối mà bạn sẽ phải tuân theo khi kết nối các dây giữa các tiêu đề.

Để làm cho mọi thứ đơn giản hơn nữa, hãy cùng tìm hiểu chi tiết kết nối sau đây bằng cách tham khảo hình ảnh ở trên:

Chân SPI bắt đầu từ trên cùng bên trái đi đến “Master IN, Slave OUT” (MISO)

Chân SPI từ giữa bên trái kết nối với chân đồng hồ (SCK)

Chân SPI ở dưới cùng bên trái kết hợp với Đặt lại. (Chúng ta sẽ tìm hiểu tỉ mỉ về ghim này trong các bài hướng dẫn sau)

SPI liên quan đến phía dưới bên phải kết nối với chân GND của MCU, GND đề cập đến chân tạo thành đường cung cấp 0 hoặc đường ray âm (tương đối) của nguồn cung cấp.

SPI kết thúc từ tiêu đề giữa bên phải liên kết với chân “Master Out, Slave IN” (MOSI) của MCU.

SPI đi ra từ tiêu đề trên cùng bên phải được nối với dấu (+) của MCU, rõ ràng là Vdd hoặc chân cung cấp tích cực của MCU.

Đó là nó.

Kết nối hai đầu nối như được giải thích và bảng giao diện SPI của bạn đã sẵn sàng cho các hành động cần thiết.

Để được trợ giúp thêm, bạn có thể tham khảo hình minh họa ở trên, bảng giao diện cuối cùng của bạn sẽ trông như thế này sau khi tất cả các kết nối dây được thực hiện một cách thích hợp với sự trợ giúp của cuộc thảo luận ở trên.

Tôi hy vọng bạn có thể đã xây dựng giao diện SPI như được giải thích trong hướng dẫn trước và bây giờ đã đến lúc đảm bảo rằng máy tính của chúng tôi chấp nhận trình lập trình mà chúng tôi cần tích hợp giữa PC và MCU.

Tạo mã lập trình đơn giản cho MCU

Chúng tôi sử dụng bộ USBTinyISP có sẵn từ Sparkfun để liên kết máy tính với bộ vi điều khiển.

Chúng tôi biết rằng bất kỳ hệ điều hành máy tính nào chẳng hạn như Windows sẽ yêu cầu trình điều khiển mà không có trình điều khiển sẽ vô ích để tải bất kỳ thứ gì vào máy tính, do đó lập trình viên của chúng tôi sẽ cần trình điều khiển để tải vào máy tính của bạn.

Hãy xem xét các quy trình cần thiết để cài đặt trình điều khiển trong hệ điều hành máy tính của bạn, ở đây chúng tôi lấy ví dụ về Hệ điều hành Windows 7 với thông số kỹ thuật 32 bit hoặc 64 bit.

Mở sparkfun.com và nhấp vào “trang lập trình AVR bỏ túi”. Liên kết có thể được trực quan hóa trong trang.

Tiếp theo, tìm 'Trình điều khiển Windows' trong tài liệu và chỉ cần nhấp vào nó.

Thao tác này sẽ cung cấp cho bạn tệp pocketprog-driver.zip trong máy tính của bạn.

Vào máy tính của bạn, tìm vị trí tải xuống và chỉ cần giải nén tệp đã tải xuống vào một thư mục.

Trong trường hợp máy tính của bạn là HĐH 64 bit, bạn cần thực hiện thêm một số bước như đã nêu dưới đây, với HĐH 32 bit, bạn có thể bắt đầu cài đặt trực tiếp từ tệp đã giải nén.

Đối với 64-bit, hãy làm theo những điều này, đối với 32-bit chỉ cần bỏ qua:

Google “libusb sourceforge” và nhấp vào liên kết này phiên bản mới nhất.

Bạn sẽ gặp một vài tệp bổ sung, tuy nhiên bạn muốn tìm tệp yếm, đó là: libusb-win32-bin - #. #. #. #. Zip

Bây giờ, hãy tìm vị trí tải xuống này trong máy tính của bạn, giải nén và lưu nó vào một trong các thư mục.

Vào thư mục này, điều hướng qua thư mục bin, tiếp tục đến thư mục amd64.

Bạn sẽ thấy một vài thư mục ở đây như: ghcalled libusb0.dll và libusb0.sys.

Bạn muốn đổi tên chúng thành: libusb0_x64.dll và libusb0_x64.sys.

Bây giờ bạn sẽ cần phải sao chép các tệp trên vào thư mục pocketprog-driver, chỉ cần ghi đè các tệp trên phiên bản hiện có.

Để cài đặt các trình điều khiển trên, bạn sẽ quan tâm đến phương pháp sau đây không phải là phương pháp thông thường.

Đó là chế độ “thêm phần cứng kế thừa”.

Nhấp vào 'Start Menu'

Sau đó, tiếp tục bằng cách nhấp chuột phải vào “máy tính”

Nhấp vào “Quản lý” và cuối cùng nhấp vào “trình quản lý thiết bị”

Tiếp theo, bên trong menu, chọn “Thêm phần cứng kế thừa”

Tiếp tục nhấn “tiếp theo”, cho đến khi trình hướng dẫn được đưa vào

Làm theo hướng dẫn, nhấp vào “Cài đặt phần cứng mà bạn cần chọn từ danh sách Nâng cao”, thao tác này sẽ nhắc biểu tượng nút radio vào lựa chọn cụ thể đó. Nó thực sự là một nút điều khiển cửa sổ mà bây giờ sẽ xuất hiện giống như một vòng tròn nhỏ có một hình tròn màu xanh lam bên trong.

Bây giờ chỉ cần nhấp vào “Tiếp theo”

Thao tác này sẽ hiển thị cho bạn menu 'Hiển thị tất cả thiết bị' mà bạn sẽ cần nhấp vào.

Sau đó, nhấp vào biểu tượng “Có đĩa”.

Với sự trợ giúp của biểu tượng “Duyệt qua”, hãy chuyển đến vị trí của thư mục trình điều khiển pocketprog. Nếu việc lựa chọn được thực hiện chính xác bởi bạn, bạn sẽ hình dung tệp pocketprog.inf được đặt trong thư mục cụ thể đó.

Nhấp đúp vào tệp này và bạn chắc chắn sẽ chứng kiến ​​trình điều khiển được cài đặt vào PC của bạn.

Hết và hết !! Hãy bắt đầu với hướng dẫn tiếp theo của chúng tôi trên trang tiếp theo.

Bây giờ bạn có thể đã cài đặt phần mềm cần thiết và xây dựng giao diện SPI.

Cách chuyển một chương trình thành chip vi điều khiển

Bước tiếp theo sẽ gọi một vài thành phần như bảng mạch, đèn LED và điện trở được tính toán cho ứng dụng dự kiến.

Trong phần này, chúng ta sẽ tìm hiểu phương pháp kiểm tra của người lập trình và xác nhận việc cài đặt các trình điều khiển và phần mềm có liên quan.

Để xác minh xem trình điều khiển và phần mềm đã được cài đặt đúng cách hay chưa, chúng tôi sẽ triển khai một chương trình đơn giản được gọi là avrdude.

AVRdude là chương trình được liên kết với bản cài đặt WinAVR mới nhất mà không thể thực hiện việc truyền tệp thực sự vào MCU.

Chương trình này là định dạng tệp .hex về cơ bản có thể hiểu được đối với MCU đối với các thực thi bắt buộc.

Trong trường hợp xác minh không thành công, lập trình viên sẽ không có khả năng thực hiện việc chuyển tệp.

Hãy nhanh chóng xem cách chúng tôi có thể triển khai quy trình thử nghiệm với sự trợ giúp của các hướng dẫn sau:

Mở lời nhắc DOS (Hệ điều hành đĩa) bằng cách nhấp vào “menu bắt đầu” và nhập cmd.exe vào hộp tìm kiếm nhất định.

Bây giờ việc thực hiện AVRdude có thể được thực hiện bằng cách chỉ cần gõ avrdude –c usbtiny –p m32 qua dấu nhắc DOS. Ngay sau khi điều này được thực hiện, DOS sẽ ngay lập tức xác nhận kết nối có thành công hay không.

Trong lệnh trên, “-c” là cờ thông báo bao gồm đặc điểm kỹ thuật tham số lập trình viên “usbtiny”, trong khi thẻ “-p” xác định thiết bị vi điều khiển (“m32 chỉ Atmega32).

Trong trường hợp bạn đã sử dụng MCU khác, bạn sẽ cần bao gồm các tiền tố có liên quan để triển khai.

Sau khi hoàn tất quy trình trên, bạn có thể gõ 'exit' qua lời nhắc DOS và điều đó sẽ đưa bạn ra khỏi cửa sổ.

Nếu bạn đang thực sự thắc mắc về chi tiết chương trình thực tế, thì trước tiên, chúng tôi cần hàn và xây dựng mạch LED tương tự bên ngoài để chương trình có thể được thực hiện, bởi vì trừ khi có hệ thống ghi nhận phản hồi từ MCU, chương trình và việc chạy bộ vi điều khiển sẽ khá vô nghĩa.

Tạo bảng LED rất đơn giản, tất cả chỉ là hàn hai dây dẫn của đèn LED qua một miếng bảng mạch và kết nối điện trở với một trong các dây dẫn của đèn LED. Vai trò của đèn LED này chỉ là giới hạn dòng điện đến đèn LED để đèn không bị cháy do dòng điện quảng cáo vượt quá điện áp từ đầu ra MCU.

Giá trị của điện trở có thể được tính bằng công thức đơn giản sau:

R = (Ub - LEDfwd) / I

Trong đó Ub là điện áp cung cấp, LEDfwd là điện áp hoạt động tối ưu của đèn LED được sử dụng và I là amps tối ưu của nó.

Giả sử chúng ta sử dụng đèn LED ĐỎ có điện áp thuận = 2,5V và dòng điện I = 20mA, phương trình trên có thể được giải như sau:

Vì điện áp từ MCU sẽ là 5V, nó có thể được biểu thị như sau:

R = (5 - 2,5) /. 02 = 125 ohms, ¼ watt, giá trị gần nhất là 120 ohms sẽ làm được.

Bây giờ chúng ta có đèn LED, một điện trở 120 ohm và một bảng mạch, chỉ cần kết nối các thành phần trên như được cho trong sơ đồ với bộ vi điều khiển.

Khi điều này được thực hiện, MCU có thể được lập trình cho phản ứng dự kiến ​​trên thiết lập đèn LED ở trên.

Tiếp theo, chương trình MCU.

Để cho phép bộ vi điều khiển thực hiện một số triển khai có ý nghĩa, bắt buộc phải viết các hướng dẫn thích hợp vào MCU.

Cách cài đặt môi trường lập trình và điều tra WinAVR

Đối với điều này, chúng tôi có thể sử dụng “trình soạn thảo văn bản” của riêng mình trong PC, mặc dù có thể chúng tôi sẽ đánh giá cao việc sử dụng một “môi trường lập trình” chuyên nghiệp hơn thay vì trình soạn thảo văn bản thông thường, đơn giản vì cách tiếp cận này sẽ cho phép bạn tận hưởng một số các tính năng thú vị được tích hợp sẵn trong gói “môi trường lập trình” này.

Nó sẽ hỗ trợ tạo và chỉnh sửa các chương trình thông qua các ngôn ngữ khác nhau và cũng biên dịch chúng thành một chế độ có thể phân phối được dễ dàng hiểu và chấp nhận bởi một chip vi điều khiển.

Cuối cùng thì điều này sẽ được WinAVR hỗ trợ và chuyển vào chip MCU có liên quan.

WinAVR cũng có thể được trang bị để thực hiện nhiều thao tác khác như khắc phục sự cố chương trình và cảnh báo chúng tôi về cú pháp có thể xảy ra cũng như các lỗi biên dịch và lỗi. Chúng tôi sẽ thảo luận về những hướng dẫn sau này của chúng tôi.

Bạn sẽ cài đặt WinAVR cực kỳ nhanh chóng và linh hoạt. Chúng ta hãy đi sâu vào chi tiết với các điểm sau:

Bạn sẽ cần tải xuống các phiên bản mới nhất từ ​​thư mục tệp giả mạo nguồn WinAVR. Bạn sẽ tìm thấy một số thông tin hữu ích liên quan đến bản tải xuống này từ trang web chính thức của nó.

Bạn sẽ được nhắc về một truy vấn bảo mật để bạn có thể trả lời nếu bạn muốn quá trình tải xuống diễn ra, điều này được yêu cầu tệp được tải xuống là tệp thực thi.

Tải xuống tệp và bắt đầu quá trình thực thi bằng cách nhấp vào tệp. Bắt đầu cài đặt.

Quá trình này sẽ hướng dẫn bạn một số câu hỏi có thể trả lời được để bạn có thể sắp xếp hợp lý việc cài đặt theo ý muốn của mình. Bạn sẽ muốn bỏ qua nhiều biểu mẫu này cho các biểu mẫu mặc định của chúng, tất cả sẽ tùy thuộc vào bạn để chọn những biểu mẫu mà bạn cảm thấy phù hợp nhất cho các hành động.

Cho đến bây giờ bạn sẽ thấy mọi thứ khá bình thường và dễ dàng và tìm thấy một vài tùy chọn mà tôi menu bắt đầu được ném vào bạn. Đừng lo lắng, chỉ một số trong số này sẽ thực sự chỉ sử dụng một trong các tem có tên là “sổ tay lập trình viên”.

Sau khi nhấp vào biểu tượng này, sẽ khởi tạo giao diện người dùng để bạn có thể áp dụng cách viết chương trình (chẳng hạn như tạo và chỉnh sửa). Bạn cũng sẽ chứng kiến ​​chương trình bao gồm các lệnh menu để hỗ trợ bạn biên dịch các mã và nhúng chúng vào bộ vi điều khiển.

Công việc cơ bản của notepad lập trình viên ở trên là biến đổi một đoạn mã có thể đọc được của con người mà bạn sẽ viết thành một chuỗi hướng dẫn chỉ MCU mới có thể hiểu được.

Hướng dẫn tiếp theo sẽ đề cập đến việc kiểm tra trình lập trình trên để chúng ta có thể chắc chắn về khả năng tương thích của nó với Windows và liệu nó có “bắt tay” hoàn hảo với IC vi điều khiển của bạn hay không.

Cách lập trình MCU để BẬT đèn LED

Khi điều này được xác nhận, chúng tôi sẽ tiếp tục tạo một mã nhỏ “không làm gì cả”, chỉ để đảm bảo rằng quy trình chuyển mã không gặp lỗi.

Tất nhiên bây giờ chúng tôi đã sẵn sàng triển khai chương trình đầu tiên của mình bên trong MCU, nhưng trước đó sẽ rất thú vị nếu tóm tắt nhanh những gì chúng tôi đã làm trong quá trình hướng dẫn trước của chúng tôi:

Chúng tôi đã mua bộ vi điều khiển AVR Atmel theo đặc điểm kỹ thuật yêu cầu của chúng tôi, ở đây chúng tôi đã sử dụng ATMega32 cho các hình minh họa Tiếp theo, chúng tôi đã tìm hiểu về kiến ​​thức cơ bản về vi điều khiển và đơn vị lập trình chịu trách nhiệm chuyển một chương trình vào chip MCU.

Hơn nữa, chúng tôi đã xây dựng trình kết nối giao diện SP rất cần thiết để máy tính của bạn có thể được liên kết với bộ vi điều khiển cho các hành động lập trình.

Sau đó, chúng tôi xác nhận xem trình điều khiển đã được cài đặt chính xác trong máy tính cho hệ điều hành 32 bit cũng như 64 bit hay chưa.

Tiếp theo, chúng tôi đã cài đặt môi trường lập trình có tên Win AVR để tạo điều kiện dễ dàng viết quảng cáo chuyển các mã vào bộ vi điều khiển, tiếp theo là việc triển khai avrdude để xác minh lập trình viên với PC của bạn và bộ vi điều khiển được kết nối với nhau.

Cuối cùng trong chương trước, chúng ta đã hoàn thành việc xây dựng mạch LED / điện trở và kết nối nó với các đầu ra MCU có liên quan.

Quả thực rất nhiều việc, tuy nhiên đã đến lúc phải bắt tay ngay vào một số nội dung lập trình thực sự!

Để bắt đầu, chúng tôi muốn chia bộ vi điều khiển thành ba loại, điều này sẽ đơn giản hóa sự hiểu biết của chúng tôi rất nhiều:

Kiểm soát, Phát hiện và Giao tiếp

Sẽ rất thú vị khi biết rằng các chức năng trên có thể được lập trình theo nhiều cách khác nhau.

Trong chương trình đầu tiên của chúng tôi, chúng tôi sẽ cố gắng ra lệnh cho bộ vi điều khiển “điều khiển” một thông số bên ngoài, vâng bạn nói đúng, nó sẽ là đèn LED mà chúng tôi đã chế tạo gần đây.

Để chính xác, chúng tôi sẽ yêu cầu MCU BẬT đèn LED được kết nối, vâng, tôi biết điều này trông khá sơ khai, nhưng giai đoạn bắt đầu luôn cần phải dễ dàng.

Tiếp tục với công việc hiện tại, làm cho MCU điều khiển đèn LED thực sự khá đơn giản:

Đối với điều này, chúng tôi hướng dẫn chân # 0 trên PORT B ​​để tạo ra 5V cần thiết cho đèn LED.

Nhớ lại từ hướng dẫn trước, chúng ta đã kết nối cực dương của đèn LED với chân được đề cập ở trên của MCU.

Có hai điều cần thiết cần được giải quyết cho chân này của MCU: 1) đầu ra và 2) 5 vôn

Chúng ta sẽ tìm hiểu một cách mà qua đó chúng ta có thể hướng dẫn chốt cụ thể trở thành đầu ra của MCU.

Sau khi nó được đặt là đầu ra của chip, chúng tôi có thể hướng dẫn nó ở mức “cao” (5V) hoặc “thấp” (0V) như mong muốn cho một ứng dụng.

Vì bất kỳ mạch logic nào chẳng hạn như MCU, các chân có thể bị héo một đầu ra hoặc một đầu vào và có thể được cấu hình để tạo ra mức logic cao hoặc mức logic thấp, các chân chỉ cần được chỉ định là mức logic cao hoặc mức logic thấp , không có bất kỳ trạng thái trung gian hoặc không xác định nào ngoài hai trạng thái này đối với bộ vi điều khiển hoặc bất kỳ vi mạch kỹ thuật số nào cho vấn đề đó. Điều tương tự cũng áp dụng cho mỗi và mọi chân của MCU.

Đối với các phép gán chân đầu vào và đầu ra, các đầu vào sẽ được định vị để chấp nhận các tín hiệu từ các giai đoạn tương tự bên ngoài, trong khi các đầu ra sẽ chịu trách nhiệm diễn giải chúng thành các trạng thái logic được chỉ định hoặc một tần số.

Mặc dù các nhiệm vụ trên có thể được thực hiện bằng nhiều phương pháp khác nhau, chúng ta sẽ thảo luận về một trong số chúng vì mục đích đơn giản. Tuy nhiên, cần lưu ý rằng mặc dù phương pháp được trình bày ngay bây giờ trông dễ dàng và thú vị, nhưng nó không khả thi và không phải là loại được khuyến nghị cho tất cả các ứng dụng MCU, vì lý do tương tự, bạn sẽ được giới thiệu các phương pháp lập trình phổ biến hơn sau này trong khóa học . Các chương trình này sẽ chỉ cho phép các chân mong muốn được chỉ định theo thông số kỹ thuật mà không ảnh hưởng đến các chân liền kề khác có thể đã được chỉ định để thực hiện một số chức năng khác.

Tuy nhiên, hiện tại chúng tôi sẽ không bận tâm nhiều đến các chân cắm khác và sẽ chỉ sử dụng các chân cắm có liên quan mà bạn quan tâm, tránh các biến chứng đối với một số phạm vi.

Để chỉ định một chân làm đầu ra, chúng ta cần sử dụng Thanh ghi hướng dữ liệu (DDR). Nếu bạn đang thắc mắc thanh ghi ở đây có nghĩa là gì, thì đó chỉ đơn giản là một khoảng trống trong MCU cho phép bộ vi điều khiển phản hồi theo một số cách cụ thể.

Sử dụng DDR, chúng ta có thể đặt chân để gửi một dữ liệu giống như “đầu ra” hoặc chấp nhận dữ liệu ở dạng “đầu vào”.

Tuy nhiên, bạn có thể nhầm lẫn về từ này, điều này ngụ ý gì? Dữ liệu thêm chiều thứ ba vào các chân có thể được chỉ định liên tục ở mức logic 0 (0V) hoặc mức logic cao (5V), nhưng còn những tín hiệu có thể thay đổi nhanh chóng chẳng hạn như tần số xung. Tần số sẽ đi kèm với logic cao và thấp (5V và 0V) dao động với một số khoảng thời gian hoặc khoảng thời gian cụ thể, do đó nó trở thành định hướng thời gian và có thể được điều chỉnh theo thời gian, đó là lý do tại sao chúng tôi xác định là 'dữ liệu' nghĩa là một thông số cho biết một chức năng so với một chức năng khác (trạng thái logic và thời gian).

Một phương pháp gán pin0 làm đầu ra là viết đoạn mã sau:

DDRB = 0b00000001

Trong chương trình trên, DDRB biểu thị thanh ghi hướng dữ liệu cho cổng B 0b chỉ thị trình biên dịch về biểu thức nhị phân sau của một số trong khi “1” ở cuối biểu thức cho biết vị trí của chân0, đó là vị trí của nó trong biểu mẫu của chân đầu tiên của PORT B.

Nếu bạn còn nhớ, chúng ta đã biết rằng PORT B ​​liên kết 8 chân với nó (từ 0 đến pin7), và nếu bạn nhận thấy đoạn mã trên cũng có 8 chữ số trong đó, nghĩa là mỗi chữ số biểu thị 8 chân này của PORT B.

Bây giờ thủ tục tiếp theo sẽ là gán 5V cho chân này (pin0). Một lần nữa nguyên tắc hoạt động giống hệt DDR như trên được thể hiện qua mã nhị phân sau:

PORTB = 0b00000001

Có thể thấy, điểm khác biệt duy nhất giữa đoạn mã trên và đoạn mã trước đó là trong đoạn mã này, chúng ta đã sử dụng thanh ghi PORT. Thanh ghi này xử lý cụ thể các chỉ định chân của cổng cụ thể mà nó được định vị bên trong MCU chung. Vì vậy, nó cho phép chúng tôi chỉ định lôgic dữ liệu thực (0 hoặc 1) cho các sơ đồ chân đó.

Bây giờ chúng tôi có thể muốn thảo luận một số liên quan đến các chi tiết gần đúng của chương trình của chúng tôi. Như chúng ta biết tất cả các chương trình đều yêu cầu một không gian cụ thể để bắt đầu thực hiện, điều này có thể được so sánh với một đầu bếp biết tất cả các thành phần liên quan đến một công thức cụ thể nhưng không được hướng dẫn bắt đầu từ đâu.

Hàm 'chính' ở đây là vị trí mà mỗi chương trình C / C ++ bắt đầu thực thi. Do đó, main có thể được tạo thành:

int main (void)
{
}

Tuy nhiên, để cho phép chương trình diễn giải chi tiết thanh ghi DDR và ​​PORT cũng như hoạt động của chúng bên trong chip MCU, cần có một tuyên bố bổ sung có thể bao gồm tất cả dữ liệu liên quan đến AVR MCU. Có lẽ chúng tôi muốn thêm tính năng này vào tất cả các chương trình của mình.

#include
int main (void)
{
}

Ngay khi bắt đầu biên dịch, phần tiền xử lý của trình biên dịch sẽ tập trung vào thư mục AVR để xác định tệp “io.h”. Phần mở rộng “.h” ở đây cho biết nó là một tệp tiêu đề và mã này bên trong tệp sẽ được giới thiệu ở đầu (đầu) của tệp nguồn đang được tạo, do đó có tên là “tiêu đề”.

Ở đây, chúng tôi có thể giới thiệu các câu lệnh DDR và ​​PORT vào mã của chúng tôi, bởi vì việc bổ sung tệp tiêu đề io.h sẽ hướng trình biên dịch liên quan đến chúng.

#include

int main (void)

{

DDRB = 0b00000001 // Thanh ghi hướng dữ liệu cài đặt chân0 thành đầu ra và các chân còn lại làm đầu vào

PORTB = 0b00000001 // Đặt pin0 thành 5 volt

}

Ở trên sửa định hướng của chân0 là đầu ra, có độ lớn là 5V. Tuy nhiên, vẫn còn một vấn đề chưa được xác định đối với chân này, đó là chân này vẫn chưa được hướng dẫn BẬT vô thời hạn miễn là MCU được cấp nguồn. Vòng phản hồi vô hạn này sẽ đảm bảo rằng chân này từ MCU không TẮT, thay vào đó tiếp tục với đầu ra 5V vô thời hạn.

Mặc dù có nhiều phương pháp khác nhau để áp dụng lệnh lặp cho một pin, chúng tôi sẽ thử sử dụng vòng lặp “while” ở đây. Như tên gợi ý, vòng lặp “while” cho bộ vi điều khiển biết rằng nguồn “while” khả dụng mà bạn cần duy trì kích hoạt với 5V được chỉ định cho sơ đồ chân được chỉ định.

#include

int main (void)

{

DDRB = 0b00000001 // Thanh ghi hướng dữ liệu cài đặt chân0 thành đầu ra và các chân còn lại làm đầu vào

PORTB = 0b00000001 // Đặt pin0 thành 5 volt

trong khi (1)

{

// Mã sẽ ở đây nếu nó cần thực thi lặp đi lặp lại ... không ngừng

}

}

Bạn có thể muốn lưu ý rằng, ở đây chúng tôi đã sử dụng ‘1’ dưới dạng đối số cho vòng lặp “while”, vì mọi thứ ngoại trừ ‘0’ có thể được coi là “true” hợp lý.

Điều đó ngụ ý rằng, việc xem xét vòng lặp “while” sẽ không bao giờ chịu trách nhiệm cho bất kỳ điều gì ngoại trừ “true” hợp lý, có nghĩa là chân cụ thể sẽ bám vào trạng thái được chỉ định vô thời hạn.

Đèn LED có thể được chứng minh là BẬT trên chân được chỉ định vĩnh viễn miễn là MCU nhận được nguồn qua Vdd và Vss của nó.

Vậy đó, bây giờ chúng tôi đã có kết quả mà chúng tôi mong muốn có được và cuối cùng có thể thấy điều đó xảy ra sau rất nhiều nỗ lực làm việc chăm chỉ, nhưng tuy nhiên, nhìn thấy thành quả ngọt ngào của quá trình làm việc chăm chỉ của chúng tôi thật là mãn nguyện.

Trong các hướng dẫn tiếp theo, chúng ta sẽ tìm hiểu cách thêm thứ nguyên “thời gian” vào đèn LED ở trên, đó là cách làm cho nó nhấp nháy ở một tỷ lệ cụ thể nhất định.

Trên thực tế, trong cách triển khai ở trên, đèn LED thực sự nhấp nháy nhưng tốc độ vòng lặp nhanh đến mức nó gần giống như một công tắc BẬT vĩnh viễn trên đèn LED chiếu sáng.

Chúng ta sẽ xem cách có thể thêm vòng lặp này với độ trễ như mong muốn để làm cho đèn LED nhấp nháy ở tốc độ trễ đó.

Cách tạo đèn LED nhấp nháy bằng vi điều khiển AVR

Trong buổi thảo luận lần trước, chúng ta đã học cách BẬT LED thông qua vi điều khiển, thật xuất sắc phải không? Có thể không quá nhiều!

Ở đây, chúng ta sẽ tìm hiểu cách tăng cường độ chiếu sáng của đèn LED ở trên bằng cách phân bổ chức năng hai chiều, tức là chúng ta sẽ cố gắng làm cho đèn nhấp nháy hoặc nhấp nháy ở một số tần suất hoặc tỷ lệ cụ thể. Chúng tôi cũng sẽ xem tỷ lệ này có thể được tăng hoặc giảm như thế nào theo mong muốn của người dùng.

Hãy xem xét điều này:

#include

#include

int main (void)

{

DDRB | = 1<< PINB0

trong khi (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

Nếu bạn cảm thấy bối rối với những ký hiệu kỳ lạ đó (&, ^, |, v.v.) được sử dụng trong biểu thức trên (& không có ở đó nhưng có thể được sử dụng trong các mã tương tự khác), đây là thông tin liên quan mà bạn muốn biết về chúng :

Nó bao gồm nhiều thuật toán logic tiêu chuẩn như AND, OR, NOT và XOR thường được sử dụng với đoạn mã trên.

Chức năng logic này so sánh cụ thể hai bit “1” và “0” theo bảng chân lý được chỉ định của chúng.

Chúng tôi sẽ có ý tưởng bằng cách phân tích sự sắp xếp bit sau:

01001011 &
10001101
bằng
00001001

Trong đoạn mã trên & đề cập đến AND như được sử dụng trong lập trình C.

Đọc các hàng theo chiều dọc, nó cho thấy rằng 0 và 1 bằng 0, 1 và 0 cũng bằng 0, 0 và 0 bằng 0, 1 và 1 bằng 1. Đọc nó đơn giản như vậy. Đây là theo bảng sự thật của toán tử AND.

Nếu chúng ta đánh giá bảng sau, nó chỉ ra ký hiệu “|” biểu thị việc sử dụng chức năng “HOẶC”, “|” có thể được tìm thấy ngay bên trái của “backspace” trong bàn phím máy tính của bạn:

01001011 |
10001101
bằng
11001111

Bảng sự thật này giống hệt nhau của một chức năng logic OR chỉ ra rằng các bit 0 hoặc 1 bằng 1, 1 hoặc 0 cũng bằng 1, 0 hoặc 0 bằng 0, trong khi 1 hoặc 1 bằng 1.

Sự kết hợp bit sau dành cho toán tử logic XOR được ký hiệu là ^ và có thể được nghiên cứu giống như chúng ta đã làm với bảng chân lý AND, OR:

01001011 ^
10001101
bằng
11000110

Bây giờ chúng ta hãy tiếp tục với chương trình đầu tiên và tìm hiểu dòng sau trong đó biểu thị điều gì:

#include

Thông qua các hướng dẫn trước đây, chúng tôi đã biết cách hoạt động của biểu thức, vì vậy chúng tôi sẽ không nhắc lại nó, tuy nhiên, chúng dường như là một “bao hàm” mới được thể hiện bởi #include và cần được điều tra.

Trong phần 'bao gồm' delay.h này cho phép chúng tôi thực hiện một số phương pháp dễ dàng.

Như tên cho thấy delay.h cho phép chúng ta tạo ra độ trễ trong chương trình cụ thể.

Biểu thức tiếp theo int main (void) có thể được bỏ qua khỏi cuộc thảo luận đang diễn ra vì chúng tôi đã đề cập đến vấn đề này trong các bài viết trước của chúng tôi.

Tiếp theo là DDRB được thay đổi.

Sau đây cho thấy dạng trước đó không phải là cách tốt hơn để gán các chân vì tất cả các chân từ 0 đến 7 đã được chuyển để tạo thành đầu vào. Nhưng hãy tưởng tượng tình huống sẽ như thế nào nếu chúng ta muốn tạo một chương trình dài hơn yêu cầu các chân đó cho một số chức năng khác? Ví dụ, pin2 có thể cần thiết để áp dụng chuyển mạch từ xa của một thiết bị. Trong trường hợp đó, chúng tôi sẽ không đánh giá cao việc chỉ định giống như một đầu vào chỉ thông qua thử nghiệm và sai sót. Điều đó có thể có nghĩa là phản hồi không chính xác từ bộ phát từ xa tới bộ thu của thiết bị.

DDRB = 0b00000001

Chúng tôi muốn ảnh hưởng chỉ một chút, hat pin0 bit, nhìn lướt qua chức năng “OR”, chức năng này có thể được thực thi thông qua một mặt nạ nhị phân.

DDRB = DDRB | 0b00000001

Ở đây, nó được che giấu bằng mặt nạ “OR”: 0b00000001, mặc dù nó có vẻ là một số nhị phân xác thực, trong trường hợp DDRB trước đó chẳng hạn: 0b01001010, thì việc áp dụng OR cho điều này thông qua mặt nạ có thể cho: 0b01001010 | 0b00000001 = 0b01001011.

Sự khác biệt kết quả có thể được chứng kiến ​​là chỉ với pin0, có các bit đã thay đổi!

Nén câu lệnh trên hơn nữa thông qua C ++ sẽ cho:

DDRB | = 0b00000001

Tuy nhiên, chúng tôi thấy rằng chương trình đã cho thậm chí còn nhiều hơn thế. Mặc dù nó có thể trông khá hợp pháp và rõ ràng, chúng ta nên tận dụng lợi ích của một số câu lệnh từ tệp tiêu đề io.h, đặc biệt là khi nó về cơ bản được tạo ra để thuận tiện cho chúng ta?

Vì vậy, nếu “DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Vì vậy, chúng tôi bắt đầu với 0b00000000 và đặt '1' để tạo ra 0b0000001 và sau đó chúng tôi chuyển nó sang các vị trí 0 bên trái, cho ra một 0b00000001 giống hệt như trên.

Bây giờ, nếu giả sử đó là mã PINB4, câu lệnh có thể được biểu thị bằng 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Hãy lưu ý, chúng tôi đang sử dụng chỉ mục 0 nghĩa là có bốn số không sau chữ “1”.

Bây giờ tiếp tục với vòng lặp “while” mà chúng ta đã lưu ý về “vòng lặp vô hạn” trước đó. Nhưng có lẽ bây giờ chúng ta muốn bộ vi điều khiển thực hiện một số thực thi mong muốn. Điều này có thể chỉ khả thi bên trong vòng lặp đã cho. Đó là vòng lặp mà trình tự cụ thể được lặp đi lặp lại.

Trong trường hợp việc thực thi sẽ được đặt trước vòng lặp, nó sẽ được thực hiện chỉ một lần.

Tuy nhiên, để làm cho đèn LED nhấp nháy vô thời hạn, cần phải chuyển đổi luân phiên PINB0 BẬT / TẮT trong vòng lặp. Ở đây, chúng tôi cũng tìm thấy độ trễ được đưa ra, nếu không có hiện tượng nhấp nháy của đèn LED sẽ không thể xảy ra. Nhưng điều này sẽ buộc đèn LED nhấp nháy với tốc độ rất nhanh khó nhận ra bằng mắt thường, nó sẽ cần phải chậm lại một chút để có thể nhận dạng bằng mắt của chúng ta.

Chúng tôi biết quy trình thiết lập của một bit cụ thể trong số nhị phân, nhưng không chắc chắn về phương pháp áp dụng một bit cụ thể “0” trong trường hợp nó là “1”.

Có thể thấy chương trình sau đây đang làm điều này nhưng chúng tôi cũng sẽ thấy rằng nó có thể không hiển thị trong chương trình.

Hai câu lệnh ban đầu thay đổi bit thành “1” (5V, đèn LED), sau đó tạm dừng trong 100 ms.

Một vài dòng tiếp theo biến bit PINB0 thành “0” (điện áp bằng không, đèn LED tắt), nhưng xin lỗi so sánh AND sẽ không thể thực hiện “0” từ bit, nhưng nếu chúng tôi sử dụng KHÔNG “~” đối với mặt nạ nhị phân, nó có thể chuyển tất cả các số 0 thành 1 và ngược lại.

Điều này sẽ cho phép chúng tôi chỉ tác động đến bit PINB0 và chuyển nó về “0”. Dấu ngoặc đơn đã được đưa vào để chứa việc thực thi mặt nạ sao cho phép toán NOT có thể được áp dụng cho toàn bộ mặt nạ và không chỉ đơn giản qua dấu “1” trước khi chuyển sang trái “<<”.

PORTB | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

Để tạo độ trễ BẬT TẮT hoặc các khoảng thời gian bằng nhau, chúng tôi có thể cắt ngắn bốn dòng trước đó thành hai và áp dụng chức năng XOR vì lợi ích của chúng tôi. Cần lưu ý khi thực hiện XOR một chân được gán cho 1 trong trường hợp nó là 0 và ngược lại. Việc thực thi này sẽ chỉ ảnh hưởng đến mã PINB0. Có thể đôi khi lệnh được áp dụng, nó chỉ đơn giản là biến bit thành ngược lại với logic hiện có.

PORTB ^ = 1<< PINB0
_delay_ms (100)

LÀM XONG! Đèn LED của bạn bây giờ sẽ nhấp nháy theo tỷ lệ đã đặt… .Đơn giản, phải không?




Một cặp: Mạch điều khiển từ xa nhiều thiết bị Tiếp theo: Pha AC, Trung tính, Mạch chỉ báo Lỗi Trái đất