Bài 2: Attiny13 - Trợ thủ đắc lực của Arduino - Lập trình nó?

Nội dung chính, cần nắm

Attiny13 là một vi điều khiển cực kỳ nhỏ (chỉ có 8 chân) và 1 KB Flash. Tuy vậy, chúng ta vẫn có thể làm được rất nhiều thứ trên nó. Hôm nay, chúng ta tìm hiểu về con ATTiny13 này, sau đó là tìm hiêu cách lập trình để làm 1 đèn LED nhấp nháy!

Bài viết này cũng không quá khó, bạn chỉ cần tập trung vào các định nghĩa, bookmark bài viết này (để xem cách mắc mạch),...

Giới thiệu về Attiny13

Nếu bạn đọc được datasheet, bạn có thể xem tại đây.

ATTiny13 là một vi điều khiển (sau này mình gọi tắt là chip) thuộc họ AVR, hoạt động ổn định ở mức điện áp từ 2,7 --> 5.5 Vol và có 1 KB bộ nhớ flash với 8 chân như hình sau:

Các thông số khác có thể xem trong datasheet ở trên

Trong nội dung bài viết hôm nay, chúng ta sẽ chỉ quan tâm đến vấn đề lập trình cho ATTiny13 qua Arduino như thế nào. Vì vậy, một số thông số khác của Attiny13 sẽ không được giới thiệu trong bài này để phòng việc rối rém, khó hiểu cho bạn! Những thông số khác về ATTiny13 sẽ được nói đến qua những bài sau.

Câu hỏi và câu trả lời

Câu hỏi: Chỉ với 1 kB bộ nhớ flash thì Attiny13 có thể làm được gì?

Trả lời: bạn có thể làm được rất nhiều thứ, kể thể kể ra như sau

  • điều khiển led
  • shiftOut
  • shiftIn
  • gửi / nhận vô tuyến 315 Mhz
  • điều khiển nhiều servo
  • điều khiển động cơ
  • .... và những mạch tiết kiệm năng lượng khác

Những ứng dụng trên yêu cầu bạn là một người chuyên về lập trình AVR. Vì sao? Bởi vì nếu sử dụng các hàm có sẵn của Arduino thì sẽ rất hao bộ nhớ flash => bạn sử dụng các biến hệ thống của chip để tiết kiệm bộ nhớ. Chẳng hạn như PORTB, DDRB, PB1,...

Nhưng nếu chỉ cần lập trình LED, và shiftOut thì lại rất đơn giản, bạn có thể sử dụng ngay các hàm của Arduino!

Một số thông số về ATTiny13

  • Có 6 chân digital (PB0 - PB5). Nhưng bạn chỉ sử dụng được 4 chân, đó là PB0 - PB4 (khi khai báo trong Arduino thì chỉ cần ghi là 0 - tượng trưng cho PB0, 1 - tượng trưng PB1,...). Chân PB5 được dùng để reset nên rất khó để sử dụng (yêu cầu nhiều kiến thức hơn)
  • Có 4 chân analog (ADC0 - AD3). Nhưng chỉ sử dụng được 3 chân (AD1 - AD3), chân AD0 cũng chính là chân PB5 (xem hình trên).
  • Các chân digital mà tại đó trùng với chân analog đều hỗ trợ PWM. (Xem về xung PWM)
  • Để lập trình cho ATTiny13 bằng Arduino bạn sử dụng giao thức SPI (dùng các chân MISO, MOSI, SCK, SS (hoặc là RESET, tùy loại chip thì có kí hiệu khác nhau) và hiển nhiên bạn phải nối chung cực âm rồi).

Một số lưu ý trước khi bắt tay vào thực hiện

Về giao tiếp SPI sẽ có một bài riêng nói về vấn đề này, bạn có thể sử dụng chức năng tìm kiếm của Cộng đồng Arduino Việt Nam và tìm từ khóa "giao thức SPI". Tại đây, chúng ta chỉ cần hiểu một cách cực kỳ đơn giản và dễ hiểu đó là. Giao tiếp SPI tương tự như giao tiếp Serial, cũng có chân gửi (MOSI) và chân nhận (MISO), ngoài ra giao tiếp SPI còn dùng thêm một chân gọi là SCK (Serial Clock), cái này bạn có thể xem nó giống như baudrate trong Serial. Còn chân SS là chân bật / tắt việc gửi / nhận tín hiệu từ một thiết bị khác. Bạn cũng có thể bỏ qua những dòng tôi vừa viết vì thực chất nó mang tính hàm lâm quá. Tốt nhất bạn nên tìm kiếm bài "giao thức SPI" để rõ hơn!

Chuẩn bị phần cứng

Lắp mạch

ATTiny13 Arduino Uno
VCC 5V
GND GND
RESET Digital 10
MOSI Digital 11
MISO Digital 12
SCK Digital 13

Lập trình

Để lập trình cho ATTiny13, đầu tiên ta cần biến Arduino Uno thành một mạch AVRISP (mạch lập trình AVR qua SPI, nghĩa là từ này bạn có thể sử dụng các kiến thức của AVR để lập trình cho các con vi điều khiển khác họ AVR). Để làm điều này, vô cùng đơn giản, bạn chỉ cần vào File > Examples > ArduinoISP rồi upload chương trình đó lên. Bạn chỉ cần làm 1 lần duy nhất để khởi tạo AVRISP!

Để lập trình cho một vi điều khiển khác bất kỳ, bạn cần phải chọn nó trong mục Tools > Board > Tên vi điều khiển hoặc tên mạch. Tuy nhiên, ATTiny13 mặc định thì lại không có trong hệ thống mặc định Arduino IDE, vì vậy bạn cần cập nhập hệ thống! Để cập nhập, đầu tiên bạn download file này sau đó giải nén vào thư mục <đường dẫn thư mục cài đặt Arduino>/hardware. Và sau đó, bạn reset lại Arduino IDE và chọn Tools > Board > ATTiny13 ... như trong hình sau đây.

Sau đó, bạn cần chỉnh một chút xíu xíu nữa như vầy.

Bây giờ, bạn upload đoạn code như sau:

byte ledPin = 0; // PB0 á 

void setup() {
  pinMode(ledPin,OUTPUT);
}

void loop() {
  digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
}

Nếu nhận một đoạn code thông báo như thế này, thì bạn đã upload code thành công!

Binary sketch size: 426 bytes (of a 1,024 byte maximum)
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny13
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny13

Bây giờ bạn mắc một đèn LED vào chân PB0 (nhớ có điện trở 560ohm hoặc tương tự nhé) và thưởng thức thôi!

À quên, nếu bạn muốn sử dụng Arduino Uno để lập trình bình thường thì bạn cần thao tác lại việc chọn mạch. Chọn mạch Arduino Uno, và ProgrammerAVR ISP như thế này!

Kết luận

Thật dễ dàng phải không nào, từ bây giờ, nếu làm những ứng dụng nhỏ nhẹ thì bạn không cần đến một mạch Arduino "to đùng" nữa rồi. Chỉ cần upload code một phát rồi tháo hết chân ra (trừ chân led) rồi gắn vào một nguồn 5V là mọi thứ đã hoạt động rồi, hehe

lên
33 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

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Lập trình ATtiny13 với Codebender

Trong bài viết Code Arduino trên MÂY, bạn có muốn thử hay không?, chúng ta đã biết cách lập trình Arduino trên mây rồi, phải không nào? Nhưng qua quá trình tìm hiểu thì mình thấy Codebender chưa hỗ trợ dòng ATtiny13, trong khi đó nó lại hỗ trợ những dòng ATtiny45, 85 và 2313. Vậy, câu hỏi đặt ra là: có cách nào để lập trình ATtiny13 qua Codebender hay không? Và câu trả lời là: Có, chúng ta có thể.

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

Lưu các biến CHỈ ĐỌC với PROGMEM

Trong bài Tiết kiệm RAM trong Arduino?, chúng ta đã biết cách lưu chuỗi hằng vào bộ nhớ FLASH thay cho việc lưu hết bọn chúng vào RAM. Như vậy, một hằng chuỗi có thể được lưu vào bộ nhớ FLASH thay vì lưu vào RAM. Vậy, câu hỏi đặt ra là, những biến hằng khác (hằng số, hẳng mảng, hẳng số thực) có thể được lưu vào FLASH thay vì vào RAM hay không?

Trong thực tế, các biến hằng (trừ hằng chuỗi) hầu hết chỉ tốn vài chục byte để lưu trữ nên RAM, nên chúng ta cũng chưa gặp vấn đề gì trong việc lưu trữ hằng số hay hằng mảng cả. Nhưng thỉnh thoảng, có những lúc, ta phải tìm cách lưu trữ chúng ở một nơi khác, ví dụ Bài 12: Phát nhạc bằng Arduino với một cái loa hoặc buzzer.

Chần chừ gì nữa, biết muốn phám khá khả năng của Arduino - hay không?

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