ATmega328P Cơ bản: Bắt đầu không sử dụng Arduino

Ari Mahpour
|  Created: Tháng Năm 29, 2024  |  Updated: Tháng Sáu 4, 2024
ATmega328P Cơ bản: Bắt đầu không sử dụng Arduino

Tôi đã sử dụng bảng Arduino Uno trong một thời gian khá dài, bao gồm cả việc sử dụng nó làm ví dụ cho nhiều bài viết của mình. Tôi luôn tự hỏi làm thế nào để có thể khiến cho ATmega328P (chip gốc được sử dụng trên các bảng Uno cũ) hoạt động hoàn toàn độc lập. Với việc Arduino làm cho nó trở nên dễ tiếp cận thông qua bootloader, phần mềm GUI đẹp và trừu tượng hóa C++, bạn sẽ tự hỏi tại sao tôi lại muốn thử nghiệm điều này. Đôi khi, để đánh giá cao những gì người khác đã làm, quan trọng là phải tự mình thử làm. Dự án này thực sự đã cho thấy Arduino đã bỏ ra bao nhiêu công sức vào đó và thay đổi thế giới với sản phẩm nhỏ bé thân thiện đó.

Trong bài viết này, chúng ta sẽ đi qua việc khởi động chip hoàn toàn độc lập chỉ với nguồn điện ngoài và một trình lập trình Atmel-ICE. Chúng ta sẽ trình bày cách giao tiếp với chip thông qua giao diện nối tiếp trên bo và cũng nhấp nháy một hoặc hai LED.

Cài Đặt Môi Trường

Có một vài cách để cấu hình ATmega328P. Một cách như vậy, không được đề cập đến như bạn có thể thấy từ tiêu đề, là bằng cách gắn chip ATmega328P của bạn vào một Arduino Uno, lập trình nó, và sau đó chuyển nó sang một breadboard. Dựa trên phản hồi trên các diễn đàn, một số người muốn bỏ qua quy trình Arduino và sử dụng một phương pháp truyền thống hơn với các trình lập trình như Atmel-ICE từ Microchip. Cách đơn giản nhất để bắt đầu với một vi xử lý Microchip (trước đây là Atmel) là cài đặt Microchip Studio. Tại thời điểm viết bài viết này, bộ công cụ Microchip Studio đầy đủ chỉ được hỗ trợ trên Windows. Vì tôi thích chạy tất cả môi trường xây dựng của mình trong CI (Continuous Integration), tôi đã chọn một phương pháp thay thế.

Bộ biên dịch GNU Compiler Collection (GCC) là một trong những bộ biên dịch phổ biến nhất hiện có cho ngôn ngữ C. Nó biên dịch cho một số nền tảng và kiến trúc nhưng không phải cho gia đình chip AVR (ATmega). Tuy nhiên, có một bộ biên dịch cho AVR và các gia đình Microchip khác được lưu trữ trên trang web của họ. May mắn thay, một số người tốt bụng đã đóng gói những bộ biên dịch này thành các gói Debian đẹp mắt có thể dễ dàng được cài đặt trong Debian hoặc Ubuntu như sau:

$ apt-get install gcc-avr binutils-avr avr-libc avrdude

Với những công cụ này đã được cài đặt, chúng ta giờ đây có thể biên dịch và lập trình ATmega328P chỉ với một trình lập trình Atmel-ICE và một nguồn điện ngoài (đặt ở 5V). Chúng ta sẽ sử dụng phiên bản AVR của GCC để biên dịch mã và AVRDUDE để flash chip ATmega328P.

Dự Án

Đối với dự án này, mục tiêu của tôi là trình bày một số khả năng cơ bản nhưng chức năng của ATmega328P. Một LED nhấp nháy ngoài đơn giản và một số lệnh nối tiếp qua lại là tất cả những gì tôi cần để chứng minh rằng chip này có thể tự đứng vững. Trong kho lưu trữ của dự án tôi đã tạo một vài thư mục bổ sung cho mã nguồn (được đặt tên là “src”) để hỗ trợ việc phát triển dự án này.

Một thành phần quan trọng trong phát triển phần mềm (kể cả phần mềm được cài đặt trên phần cứng) là kiểm thử đơn vị. Kiểm thử đơn vị xác nhận rằng các chức năng hoặc các phần của hệ thống lớn hơn đang hoạt động như mong đợi. Nếu ai đó thay đổi một phần của chức năng đó, kiểm thử đơn vị sẽ ngăn chặn sự hồi quy xảy ra (tức là bạn vô tình làm hỏng thứ gì đó khác bằng cách giới thiệu một tính năng mới). Trong ví dụ này, tôi đã viết một bài kiểm thử đơn vị cơ bản mô phỏng phần cứng và chạy qua lược đồ khởi tạo của thư viện giao tiếp nối tiếp (USART).

Bên cạnh kiểm thử đơn vị (nằm trong thư mục “tests”), còn có một thư mục gọi là “hil” viết tắt của Hardware in the Loop. Thư mục này chứa các kịch bản cần thiết để chạy kiểm thử với phần cứng thực tế trong vòng lặp (như đã thảo luận trong nhiều bài viết trước của tôi). Điều này đảm bảo rằng mã của tôi không chỉ hoạt động trong thế giới ảo (sử dụng mô phỏng) mà còn trong thế giới thực bằng cách chạy các bài kiểm thử trên phần cứng thực tế.

Tham khảo tệp README.md sẽ cung cấp cho bạn một sơ đồ chân để kết nối với trình lập trình Atmel-ICE với chip ATmega328P:

Sơ đồ chân Atmel ICE

Hình 1: Sơ đồ chân Atmel ICE

Thêm một vài đèn LED, kết nối cổng giao tiếp nối tiếp với Raspberry Pi, và lấy dòng +5V từ Raspberry Pi và bạn giờ đây có một bộ lắp đặt đầy đủ sẵn sàng:

Bảng mạch mở rộng Raspberry Pi

Hình 2: ATmega328P sử dụng bảng mạch mở rộng với Raspberry Pi và trình lập trình Atmel-ICE

Kiểm thử, Biên dịch, và Kiểm thử Thêm

Khi bạn phát triển các tính năng mới, sử dụng Makefile để chạy kiểm thử đơn vị và biên dịch mã. Sau khi xác nhận rằng mã bạn mong muốn thực hiện đúng như ý định (thông qua xác nhận kiểm thử đơn vị), xây dựng tệp nhị phân, flash nó vào thiết bị (cũng thông qua Makefile), và chạy kiểm thử Hardware in the Loop (HIL) sử dụng cổng giao tiếp nối tiếp của Raspberry Pi.

Một trong những phần quan trọng nhất là flash đúng các bit fuse để kích hoạt bộ đếm thời gian nội bộ 8 MHz. Điều này được tài liệu hóa trong README nhưng cũng được thêm vào lệnh flash trong Makefile:

avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m

Sau đó, bạn nên có thể sử dụng giao diện nối tiếp của chip với giả định rằng bộ đếm thời gian trên bo mạch hoạt động ở tốc độ 8 MHz (như được định nghĩa ở đầu main.c). Từ đây, bạn nên có thể thêm nhiều chức năng hơn như hỗ trợ cho các lệnh nối tiếp bổ sung, giao diện với các thành phần và cảm biến bên ngoài, và bất cứ điều gì bạn có thể nghĩ đến với vi điều khiển nhỏ thú vị này.

Kết luận

Trong bài viết này, bạn đã học cách bắt đầu với chip ATmega328P mà không cần bất kỳ mạch ngoại vi nào như thường thấy với Arduino Uno gốc và các bảng đánh giá của Microchip. Bạn giờ đây đã biết về khái niệm kiểm thử đơn vị, xây dựng nhị phân, nạp chương trình cho chip và thực hiện kiểm thử phần cứng trong vòng lặp. Ngoài ra, có một chi tiết quan trọng thường bị bỏ qua là lập trình các bit fuse để thiết lập bộ đếm thời gian nội bộ là 8 MHz. Tại thời điểm này, bạn nên có thể thêm nhiều chức năng hơn với các bài kiểm thử đơn vị và HIL bổ sung và chạy mọi thứ chỉ với một trình lập trình Atmel-ICE và nguồn cung cấp 5V bên ngoài. Để đơn giản, sử dụng Raspberry Pi với nguồn điện và khả năng giao tiếp nối tiếp của nó sẽ là cách dễ nhất để kiểm soát quá trình từ đầu đến cuối.

Mã nguồn của dự án có thể được tìm thấy tại đây:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.

About Author

About Author

Ari is an engineer with broad experience in designing, manufacturing, testing, and integrating electrical, mechanical, and software systems. He is passionate about bringing design, verification, and test engineers together to work as a cohesive unit.

Related Resources

Tài liệu kỹ thuật liên quan

Back to Home
Thank you, you are now subscribed to updates.