Mục lục:

Cấu hình cầu chì vi điều khiển AVR. Tạo và tải lên trong bộ nhớ flash của vi điều khiển chương trình nhấp nháy đèn LED.: 5 bước
Cấu hình cầu chì vi điều khiển AVR. Tạo và tải lên trong bộ nhớ flash của vi điều khiển chương trình nhấp nháy đèn LED.: 5 bước

Video: Cấu hình cầu chì vi điều khiển AVR. Tạo và tải lên trong bộ nhớ flash của vi điều khiển chương trình nhấp nháy đèn LED.: 5 bước

Video: Cấu hình cầu chì vi điều khiển AVR. Tạo và tải lên trong bộ nhớ flash của vi điều khiển chương trình nhấp nháy đèn LED.: 5 bước
Video: Hướng dẫn thao tác lập trình vi điều khiển AVR: Mô phỏng Proteus và lập trình CodevisionAVR 2024, Tháng sáu
Anonim
Image
Image

Trong trường hợp này, chúng ta sẽ tạo một chương trình đơn giản bằng mã C và ghi nó vào bộ nhớ của vi điều khiển. Chúng tôi sẽ viết chương trình của riêng mình và biên dịch tệp hex, sử dụng Atmel Studio làm nền tảng phát triển tích hợp. Chúng tôi sẽ định cấu hình các bit cầu chì và tải tệp hex lên bộ nhớ của vi điều khiển AVR ATMega328P, sử dụng bộ lập trình và phần mềm AVRDUDE của riêng chúng tôi.

AVRDUDE - là một chương trình để tải xuống và tải lên các bộ nhớ trên chip của bộ vi điều khiển AVR của Atmel. Nó có thể lập trình Flash và EEPROM, và nếu được hỗ trợ bởi giao thức lập trình nối tiếp, nó có thể lập trình các bit cầu chì và khóa.

Bước 1: Viết chương trình và biên dịch tệp Hex, sử dụng Atmel Studio

Viết chương trình và biên dịch tệp Hex, sử dụng Atmel Studio
Viết chương trình và biên dịch tệp Hex, sử dụng Atmel Studio
Viết chương trình và biên dịch tệp Hex, sử dụng Atmel Studio
Viết chương trình và biên dịch tệp Hex, sử dụng Atmel Studio

Nếu chưa có Atmel Studio, bạn nên tải xuống và cài đặt nó:

Dự án này sẽ sử dụng C, vì vậy hãy chọn tùy chọn GCC C Executable Project từ danh sách mẫu để tạo một dự án thực thi đơn giản.

Tiếp theo, cần xác định rõ dự án sẽ được phát triển cho thiết bị nào. Dự án này sẽ được phát triển cho vi điều khiển AVR ATMega328P.

Nhập mã của chương trình vào vùng Main Source Editor của Atmel Studio. Trình chỉnh sửa nguồn chính - Cửa sổ này là trình chỉnh sửa chính cho các tệp nguồn trong dự án hiện tại. Trình chỉnh sửa có các tính năng kiểm tra chính tả và tự động hoàn thành.

1. Chúng ta phải cho trình biên dịch biết tốc độ chip của chúng ta đang chạy để nó có thể tính toán độ trễ một cách chính xác.

#ifndef F_CPU

#define F_CPU 16000000UL // cho biết tần số tinh thể của bộ điều khiển (16 MHz AVR ATMega328P) #endif

2. Chúng tôi bao gồm phần mở đầu, đây là nơi chúng tôi đưa thông tin bao gồm của chúng tôi từ các tệp khác, định nghĩa các biến và hàm toàn cục.

#include // header để bật kiểm soát luồng dữ liệu qua các chân. Xác định chân, cổng, v.v.

#include // header để bật chức năng trì hoãn trong chương trình

3. Sau phần mở đầu là hàm main ().

int main (void) {

Hàm main () là duy nhất và khác với tất cả các hàm khác. Mọi chương trình C phải có đúng một hàm main (). Main () là nơi AVR bắt đầu thực thi mã của bạn khi nguồn điện lần đầu tiên bật lên, vì vậy nó là điểm vào của chương trình.

4 Đặt chân 0 của PORTB làm đầu ra.

DDRB = 0b00000001; // Đặt PORTB1 làm đầu ra

Chúng ta thực hiện việc này bằng cách ghi một số nhị phân vào thanh ghi hướng dữ liệu B. Thanh ghi hướng dữ liệu B cho phép chúng ta tạo các bit của thanh ghi B vào hoặc ra. Viết số 1 làm cho chúng xuất ra, trong khi số 0 sẽ làm cho chúng nhập. Vì chúng tôi đang gắn một đèn LED để hoạt động như đầu ra, chúng tôi viết một số nhị phân, làm cho chân 0 của PORT B làm đầu ra.

5. Vòng lặp.

trong khi (1) {

Câu lệnh này là một vòng lặp, thường được gọi là vòng lặp chính hoặc vòng lặp sự kiện. Mã này luôn đúng; do đó, nó thực thi lặp đi lặp lại trong một vòng lặp vô hạn. Nó không bao giờ ngừng. Do đó, đèn LED sẽ nhấp nháy vô cực, trừ khi bộ vi điều khiển bị ngắt nguồn hoặc mã bị xóa khỏi bộ nhớ chương trình.

6. Bật đèn LED gắn vào cổng PB0

PORTB = 0b00000001; // bật đèn LED gắn vào cổng PB0

Dòng này, đưa ra 1 cho PB0 của PortB. PORTB là một thanh ghi phần cứng trên chip AVR có 8 chân, PB7-PB0, đi từ trái sang phải. Đặt 1 ở cuối cho 1 1 cho PB0; điều này đặt PB0 cao và bật nó lên. Do đó, đèn LED gắn vào chân PB0 sẽ bật và sáng.

7. Sự chậm trễ

_delay_ms (1000); // tạo độ trễ 1 giây

Câu lệnh này tạo ra độ trễ 1 giây để đèn LED bật và sáng trong đúng 1 giây.

8. Tắt tất cả các chân B, bao gồm cả PB0

PORTB = 0b00000000; // Tắt tất cả các chân B, bao gồm cả PB0

Dòng này tắt tất cả 8 chân Port B, do đó ngay cả PB0 cũng tắt nên đèn LED cũng tắt.

9. Một sự chậm trễ khác

_delay_ms (1000); // tạo độ trễ 1 giây khác

Nó sẽ tắt chính xác trong 1 giây, trước khi bắt đầu lại vòng lặp và gặp phải đường dây, nó sẽ bật lại, lặp lại toàn bộ quá trình. Điều này xảy ra vô hạn để đèn LED liên tục nhấp nháy và tắt.

10. Báo cáo trả hàng

}

return (0); // dòng này thực sự không bao giờ đạt tới}

Dòng cuối cùng của mã của chúng tôi là một câu lệnh return (0). Mặc dù mã này không bao giờ được thực thi, vì có một vòng lặp vô hạn không bao giờ kết thúc, đối với các chương trình chạy trên máy tính để bàn của chúng tôi, điều quan trọng là hệ điều hành phải biết liệu chúng có chạy đúng hay không. Vì lý do đó, GCC, trình biên dịch của chúng tôi, muốn mọi main () kết thúc bằng một mã trả về. Mã trả lại không cần thiết đối với mã AVR, mã này chạy tự do của bất kỳ hệ điều hành hỗ trợ nào; tuy nhiên, trình biên dịch sẽ đưa ra cảnh báo nếu bạn không kết thúc main bằng return ().

Bước cuối cùng là xây dựng dự án. Nó có nghĩa là biên dịch và cuối cùng liên kết tất cả các tệp đối tượng để tạo tệp thực thi (.hex). Tệp hex này được tạo bên trong thư mục Gỡ lỗi bên trong thư mục Dự án. Tệp hex này đã sẵn sàng để được tải vào chip vi điều khiển.

Bước 2: Thay đổi cấu hình mặc định của cầu chì bộ điều khiển vi mô

Thay đổi cấu hình mặc định của cầu chì bộ điều khiển vi mô
Thay đổi cấu hình mặc định của cầu chì bộ điều khiển vi mô
Thay đổi cấu hình mặc định của cầu chì bộ điều khiển vi mô
Thay đổi cấu hình mặc định của cầu chì bộ điều khiển vi mô
Thay đổi cấu hình mặc định của cầu chì bộ điều khiển vi mô
Thay đổi cấu hình mặc định của cầu chì bộ điều khiển vi mô

Điều quan trọng cần nhớ là một số bit cầu chì có thể được sử dụng để khóa các khía cạnh nhất định của chip và có khả năng đóng cục (khiến nó không thể sử dụng được)

Có tổng cộng 19 bit cầu chì được sử dụng trong ATmega328P và chúng được tách thành ba byte cầu chì khác nhau. Ba trong số các bit cầu chì được chứa trong "Byte cầu chì mở rộng", tám bit được chứa trong "cầu chì cao Byte" và tám bit khác được chứa trong "cầu chì thấp Byte". Ngoài ra còn có một byte thứ tư được sử dụng để lập trình các bit khóa.

Mỗi byte là 8 bit và mỗi bit là một thiết lập hoặc cờ riêng biệt. Khi chúng ta nói về cài đặt, không cài đặt, cầu chì được lập trình, không được lập trình, chúng ta thực sự đang sử dụng nhị phân. 1 có nghĩa là không được thiết lập, không được lập trình và số 0 có nghĩa là được thiết lập, được lập trình. Khi lập trình cầu chì, bạn có thể sử dụng ký hiệu nhị phân hoặc phổ biến hơn là ký hiệu thập lục phân.

Chip ATmega 328P có bộ dao động RC tích hợp có tần số 8 MHz. Các chip mới được vận chuyển cùng với bộ này làm nguồn xung nhịp và cầu chì CKDIV8 hoạt động, dẫn đến xung nhịp hệ thống 1 MHz. Thời gian khởi động được đặt thành tối đa và khoảng thời gian chờ được bật.

Các chip ATMega 328P mới thường có các cài đặt cầu chì sau:

Cầu chì thấp = 0x62 (0b01100010)

Cầu chì cao = 0xD9 (0b11011001)

Cầu chì mở rộng = 0xFF (0b11111111)

Chúng tôi sẽ sử dụng chip ATmega 328 với tinh thể 16MHz bên ngoài. Do đó, chúng ta cần lập trình các bit của "Fuse Low Byte" cho phù hợp.

1. Bit 3-0 kiểm soát lựa chọn bộ dao động và cài đặt mặc định của 0010 là sử dụng bộ dao động RC bên trong đã hiệu chỉnh, điều mà chúng tôi không muốn. Chúng tôi muốn hoạt động của bộ dao động tinh thể công suất thấp từ 8,0 đến 16,0 MHz, vì vậy bit 3-1 (CKSEL [3: 1]) phải được đặt thành 111.

2. Bits 5 và 4 kiểm soát thời gian khởi động và cài đặt mặc định của 10 dành cho độ trễ khởi động là sáu chu kỳ đồng hồ kể từ khi tắt nguồn và tiết kiệm năng lượng, cộng với thời gian khởi động bổ sung là 14 chu kỳ đồng hồ cộng với 65 mili giây từ khi đặt lại.

Để an toàn cho bộ dao động tinh thể công suất thấp, chúng tôi muốn độ trễ tối đa có thể là 16, 000 chu kỳ đồng hồ kể từ khi tắt nguồn và tiết kiệm năng lượng, vì vậy SUT [1] nên được đặt thành 1, cộng với độ trễ khởi động bổ sung trong 14 chu kỳ đồng hồ cộng với 65 mili giây kể từ khi đặt lại, vì vậy SUT [0] phải được đặt thành 1. Ngoài ra, CKSEL [0] phải được đặt thành 1.

3. Bit 6 điều khiển đầu ra xung nhịp đến PORTB0, điều mà chúng tôi không quan tâm. Vì vậy, bit 6 có thể được đặt thành 1.

4. Bit 7 điều khiển hoạt động chia cho 8 và cài đặt mặc định là 0 có tính năng được bật, điều mà chúng tôi không muốn. Vì vậy, bit 7 cần được thay đổi từ 0 thành 1.

Do đó, Fuse Low Byte mới phải là 11111111, trong ký hiệu thập lục phân, là 0xFF

Để lập trình các bit của "Fuse Low Byte", chúng ta có thể sử dụng trình lập trình của mình (https://www.instructables.com/id/ISP-Programmer-fo…) và phần mềm AVRDUDE. AVRDUDE là một tiện ích dòng lệnh được sử dụng để tải xuống và tải lên bộ vi điều khiển Atmel.

Tải xuống AVRDUDE:

Đầu tiên, chúng ta phải thêm mô tả lập trình viên của mình vào tệp cấu hình của AVRDUDE. Trên Windows, tệp cấu hình thường ở cùng vị trí với tệp thực thi của AVRDUDE.

Xóa văn bản trong tệp cấu hình avrdude.conf:

# ISPProgv1

lập trình viên id = "ISPProgv1"; desc = "đập cổng nối tiếp, đặt lại = dtr sck = rts mosi = txd miso = cts"; type = "serbb"; connection_type = serial; đặt lại = 4; sck = 7; mosi = 3; miso = 8;;

Trước khi khởi động AVRDUDE, chúng ta phải kết nối bộ vi điều khiển với bộ lập trình, theo sơ đồ

Mở cửa sổ nhắc DOS.

1. Để xem danh sách lập trình viên mà avrdude được hỗ trợ, gõ lệnh avrdude -c c. Nếu tất cả đều ổn, danh sách phải có id lập trình viên "ISPProgv1"

2. Để xem danh sách các thiết bị Atmel mà avrdude được hỗ trợ, hãy nhập lệnh avrdude -c ISPProgv1. Danh sách phải có thiết bị m328p cho Atmel ATMega 328P.

Tiếp theo, gõ avrdude -c ISPProgv1 –p m328p, lệnh cho avrdude biết lập trình viên nào đang được sử dụng và bộ vi điều khiển Atmel nào được đính kèm. Nó trình bày chữ ký ATmega328P trong ký hiệu thập lục phân: 0x1e950f. Nó trình bày lập trình bit cầu chì hiện có trong ATmega328P cũng ở dạng ký hiệu thập lục phân; trong trường hợp này, các byte cầu chì được lập trình theo mặc định của nhà sản xuất.

Tiếp theo, gõ avrdude -c ISPProgv1 –p m328p –U lfuse: w: 0xFF: m, Đây là một lệnh để cho avrdude biết lập trình viên đang được sử dụng và bộ vi điều khiển Atmel nào được đính kèm và thay đổi Fuse Low Byte thành 0xFF.

Bây giờ tín hiệu đồng hồ sẽ đến từ bộ dao động tinh thể công suất thấp.

Bước 3: Ghi chương trình vào bộ nhớ của vi điều khiển ATMega328P

Ghi chương trình vào bộ nhớ của vi điều khiển ATMega328P
Ghi chương trình vào bộ nhớ của vi điều khiển ATMega328P
Ghi chương trình vào bộ nhớ của vi điều khiển ATMega328P
Ghi chương trình vào bộ nhớ của vi điều khiển ATMega328P

Đầu tiên, sao chép tệp hex của chương trình mà chúng tôi đã thực hiện ở phần đầu của hướng dẫn vào thư mục AVRDUDE.

Sau đó, gõ vào cửa sổ lời nhắc DOS lệnh avrdude –c ISPProgv1 –p m328p –u –U flash: w: [tên tệp hex của bạn]

Lệnh ghi tệp hex vào bộ nhớ của vi điều khiển. Bây giờ, bộ vi điều khiển hoạt động theo hướng dẫn của chương trình của chúng tôi. Hãy cùng kiểm tra nào!

Bước 4: Kiểm tra vi điều khiển hoạt động theo hướng dẫn của chương trình của chúng tôi

Kiểm tra hoạt động của bộ vi điều khiển có phù hợp với hướng dẫn của chương trình của chúng tôi không
Kiểm tra hoạt động của bộ vi điều khiển có phù hợp với hướng dẫn của chương trình của chúng tôi không
Kiểm tra hoạt động của bộ vi điều khiển có phù hợp với hướng dẫn của chương trình của chúng tôi không
Kiểm tra hoạt động của bộ vi điều khiển có phù hợp với hướng dẫn của chương trình của chúng tôi không
Kiểm tra hoạt động của bộ vi điều khiển có phù hợp với hướng dẫn của chương trình của chúng tôi không
Kiểm tra hoạt động của bộ vi điều khiển có phù hợp với hướng dẫn của chương trình của chúng tôi không

Kết nối các thành phần theo sơ đồ của Mạch đèn LED nhấp nháy AVR

Đầu tiên, chúng ta cần nguồn, giống như tất cả các mạch AVR. Nguồn điện khoảng 5 vôn là đủ cho hoạt động của chip AVR. Bạn có thể nhận được điều này từ pin hoặc nguồn điện một chiều. Chúng tôi kết nối nguồn + 5V vào chân 7 và kết nối chân 8 với mặt đất trên bảng mạch. Ở giữa cả hai chân, chúng tôi đặt một tụ điện gốm 0,1μF để làm trơn công suất của bộ nguồn để chip AVR có được đường dây điện thông suốt.

Điện trở 10KΩ được sử dụng để cung cấp chức năng Khởi động lại nguồn (POR) cho thiết bị. Khi nguồn được chuyển sang BẬT, điện áp trên tụ điện sẽ bằng 0 để thiết bị đặt lại (vì đặt lại ở mức thấp), sau đó tụ sạc đến VCC và quá trình đặt lại sẽ bị vô hiệu hóa.

Chúng tôi kết nối cực dương của đèn LED với chân AVR PB0. Đây là chân 14 của ATMega328P. Vì nó là một đèn LED, chúng tôi muốn hạn chế dòng điện chạy đến đèn LED để nó không bị cháy. Đây là lý do tại sao chúng tôi đặt một điện trở 330Ω nối tiếp với đèn LED. Cực âm của đèn LED được nối với đất.

Tinh thể 16 MHz được sử dụng để cung cấp xung nhịp cho vi điều khiển Atmega328 và các tụ điện 22pF được sử dụng để ổn định hoạt động của tinh thể.

Đây là tất cả các kết nối cần thiết để phát sáng đèn LED. Nguồn cấp.

Vâng. Đèn LED nhấp nháy với độ trễ một giây. Công việc của vi điều khiển tương ứng với nhiệm vụ của chúng ta

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

Phải thừa nhận rằng đó là một quá trình dài để chỉ nhấp nháy một đèn LED, nhưng sự thật là bạn đã vượt qua thành công những rào cản lớn: tạo nền tảng phần cứng để lập trình vi điều khiển AVR, Sử dụng Atmel Studio làm nền tảng phát triển tích hợp, sử dụng AVRDUDE làm phần mềm cho cấu hình và lập trình vi điều khiển AVR

Nếu bạn muốn cập nhật các dự án vi điều khiển cơ bản của tôi, hãy đăng ký YouTube của tôi! Xem và chia sẻ video của tôi là cách để ủng hộ những gì tôi làm

Đăng ký kênh YouTube FOG

Đề xuất: