Lập trình, nạp bootloader cho chip atmega8

I. Giới thiệu

Xin chào các bạn! Chắc chắn các bạn đã từng có những dự án nhỏ (ví dụ: làm đèn led trái tim, máy đo nhiệt độ với DHT11, đồng hồ với module RTC ...) yêu cầu không quá lớn về phần cứng và tiết kiệm chi phí. Có một cách rất hiệu quả đó là sử dụng các chip dòng attiny để thay thế cho mạch arduino đắt tiền. Tuy nhiên, đôi lúc bạn sẽ gặp nhiều khó khăn do hạn chế về số chân, dung lượng bộ nhớ, và arduino IDE không hỗ trợ đầy đủ các loại giao tiếp (SPI, I2C, ...) cho các chip attiny. Trong hoàn cảnh đó, chúng ta có thể nghĩ tới con chip rẻ tiền nhất trong dòng atmega đó là chip atmega8.

Đã có bài viết của bạn quocbao chia sẻ về cách nạp bootloader cho các dòng chip atmega tại bài viết Nạp bootloader cho vi điều khiển trên Arduino. Tuy nhiên, trong bài viết này mình xin chia sẻ với các bạn cách sử dụng chip atmega8 với chi phí thấp nhất - đó là sử dụng Atmega8 với thạch anh nội.

Các bạn phài dùng bản Arduino Classic 1.0.6 nhé! Bạn có thể tải về tại đây.

II. Phần cứng

  • Board arduino bất kì (đã có bootloader nhé). Mình dùng nano.
  • Chip atmega8 chưa có bootloader.
  • 1 đèn led
  • Test boarddây nối.
  • Module tạo nguồn 5V.

III. Tạo file bootloader cho chip atmega8 và cài đặt

Mình làm theo hướng dẫn ở link tiếng Nga này: http://homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik. Mình xin dịch một số bước quan trọng như thế này:

Bước 1: Tạo file bootloader cho chip atmega8

Bước 2: Sau khi ấn tạo file .HEX thì bạn sẽ được như hình này

Bạn nhấn vào chữ hex thì sẽ như thế này:

Bước 3: Bạn nhấn chuột phải chọn Download with IDM thì bạn sẽ tải về được file hex mà mình vừa tạo.

Bước 4: Cài đặt cho IDE

Bạn thêm đoạn code mà họ đã cho vào trong file boards.txt

a8_8MHz.name=atmega8 (8 MHz)

a8_8MHz.upload.protocol=arduino

a8_8MHz.upload.maximum_size=7680

a8_8MHz.upload.speed=115200

a8_8MHz.bootloader.low_fuses=0xa4

a8_8MHz.bootloader.high_fuses=0xdc

a8_8MHz.bootloader.path=optiboot

a8_8MHz.bootloader.file=a8_8MHz_a4_dc.hex

a8_8MHz.build.mcu=atmega8

a8_8MHz.build.f_cpu=8000000L

a8_8MHz.build.core=arduino

a8_8MHz.build.variant=standard

Bước 5: Copy file bootloader mà bạn vừa tải về vào thư mục \hardware\arduino\bootloaders\optiboot\

Copy file bootloader mà bạn vừa tải về vào thư mục \hardware\arduino\bootloaders\optiboot\

IV. Nạp bootloader cho chip

Mở IDE lên chạy sketch ArduinoISP (giống như trong hướng dẫn của bạn quocbao). (File > Examples > ArduinoISP).

Sau khi upload xong sketch ArduinoISP thì bạn chọn trong mục tools như hình:

Chọn cổng COM tương ứng.

Chọn programmer là Arduino as ISP

Mở tools chọn Burn bootloader chờ tới khi IDE báo upload xong là OK.

V. Nạp thử một chương trình để kiểm tra.


Mình không có USB-TTL hay UART, cũng không có Arduino chip cắm chân nên sau khi bootloader xong vẫn phải nạp qua các chân SPI của mạch NANO. Cách bạn có điều kiện thì kiểm tra lại.

Vì không thể kiểm tra theo cách trên nên mình sẽ kiểm tra theo cách của mình. Đầu tiên sẽ dùng 1 chip atmega8 chưa có bootloader để nạp code nháy 2 led (vẫn qua chân SPI của NANO). Sau đó nạp code này vào 1 chip atmega8 vừa bootloader xong (vẫn theo cổng SPI). So sánh kết quả chúng ta sẽ có sự khác biệt. Mình xin giải thích sự khác biệt như sau: trong trường hợp chưa có bootloader thì led nháy không đúng code bởi vì timer trong chip chưa hoạt động đúng. Ở trường hợp đã có bootloader thì led nháy đúng theo yêu cầu do đã timer đã được kích hoạt đúng.

VI. Kết luận

Vậy là chỉ với 1 con chip atmega8 (giá khoảng 25-30k) bạn đã có thể làm được nhiều dự án hay như khi dùng arduino rồi. Xin chúc các bạn nhiều thành công! Mình mong sẽ nhận được nhiều góp ý!

Những hình ảnh về dự án: 
Youtube: 
lên
17 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Hướng dẫn sử dụng cảm biến nhiệt độ DS18B20 (-55°C đến +125°C) sai số ±0.5°C

Lại quay về vấn đề đo nhiệt độ, như ở bài trước, mình đã dùng cả LM35, cả TMP36. Nhưng rốt cuộc vẫn không hiệu quả, lần này mình đang sử dụng con DS18B20 này và cảm thấy khá ổn hơn so với lần trước. Nhiệt độ ít bị chênh lệch hơn và như quảng cáo là chỉ có sai số ±0.5°C thôi (nếu nhiệt độ trong phạm vi -10°C to +85°C, đáng để thử phải không nào?

lên
17 thành viên đã đánh giá bài viết này hữu ích.

Hướng dẫn sử dụng cảm biến nhiệt độ TMP36 - Khoảng đo từ -40 đến 125 độ C

Mình thấy cảm biến nhiệt độ LM35 rất rẻ và hoạt động cũng tương đối chính xác. Tuy nhiên, độ bền của nó không cao vì mình thấy mình chỉ dùng cảm biến LM35 trong khoảng thời gian 3 tháng, sau đó phải thay cảm biến khác (để đo nhiệt độ luộc gà). Bản thân mình không thích điều đó nên thử dùng một cảm biến khác cũng có chức năng tương tự là TMP36 và thấy nó hoạt động bền hơn (đã đến tháng thứ 4 nhưng chưa hư). Mình xin chia sẻ với các bạn nhé. Loại này hơi khó tìm và không thông dụng, nhưng nó bền hơn hẳn LM35 các bạn nhé.

lên
10 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Sử dụng Module NRF24L01 - Thu phát sóng vô tuyến 2.4GHz với Arduino

Chắc hẳn trong các bạn ai cũng đã từng có một dự án nào đó liên quan tới truyền tín hiệu không dây và chắc các bạn đã từng làm việc với các module radio frequence 433Mhz. Nếu như đã làm việc với các module này thì không ít trong các bạn có thể đã gặp nhiều vấn đề khó giải quyết liên quan tới xung đột thư viện (như tôi sad). Ngoài ra các module này có khoảng cách thu phát sóng khá ngắn, lại không thể thu phát hai chiều. Vì những lý do trên, tôi đã tìm kiếm một loại module không dây khác để thay thế cho các module 433Mhz nhằm khắc phục các điểm yếu trên.

lên
41 thành viên đã đánh giá bài viết này hữu ích.

Servo tester với attiny85 - Mạch kiểm tra lỗi servo

Servo là một loại động cơ thường được sử dụng trong robot hay trong các đồ chơi mô hình. Trên Cộng đồng Arduino Việt Nam đã có rất nhiều bài viết giới thiệu về servo và cách lập trình, sử dụng. Có nhiều cách để kiểm tra xem servo có còn làm việc hay không, trong bài viết này mình xin giới thiệu với các bạn mạch servo tester sử dụng AVR attiny85 để tạo xung.

lên
14 thành viên đã đánh giá bài viết này hữu ích.