Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Ma trận LED Nội dung Các cần tham khảo trước Cấu trúc AVR Ma trận LED AVR ma trận LED Download ví dụ WinAVR C cho AVR Mô với Proteus I Ma trận LED Ma trận LED tức Dot Matrix LED tập hợp nhiều đèn LED bố trí thành dạng “ma trận” hình chữ nhật vuông với số hàng a số cột b Ma trận LED dùng nhiều ứng dụng hiển thị biển quảng cáo, hiển thị thay LCD chí dùng hiển thị video…Để giảm số lượng đường điều khiển, ma trận LED LED nối chung với theo hàng cột Số lượng LED ma trận LED axb số lượng ngõ tổng số hàng cột: a + b Việc điều khiển ma trận LED kích thước lớn đòi hỏi thiết kế mạch driver điều khiển phức tạp Với mục đích giúp bạn đọc làm quen khái niệm ma trận LED, phạm vi trình bày thao tác với ma trận LED có kích thước 7x5 (7 hàng, cột) ma trận LED 7x5 thường dùng để hiển thị ký tự bảng mã ASCII thay cho Text LCD Tuy nhiên, bạn ghép ma trận LED lại để hiển thị loại hình ảnh có độ phân giải thấp Hình mô tả cấu trúc ma trận LCD 7x5 với 12 ngõ đặt tên từ C0…C4 D0…D6 (C đại diện cho Control line D Data line) Hình Ma trận LED 7x5 Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Thanhtam Ho - www.hocavr.com Copyright © 2010 Cùng học AVR Bên ô ma trận LED LED phát sang Trong mô hình trên, Cathod (cực âm) LED hàng nối chung với ngõ chung ngõ D (Data) Các Anod LED cột nối chung tạo thành đường C (Control) Thông thường, đường D C chọn số số lượng đường D nhiều đường C cho số lương đường D gần với số 8, 16, 32…(lũy thừa 2) Lý việc chọn nhằm giảm kích thước font chứa ký tự hình ảnh hiển thị lên ma trận LED, bạn hiểu rõ tìm hiểu điều khiển ma trận LED 7x5 bên a) b) Hình mô tả cách mà ma trận LED 7x5 dùng để hiển thị số Trước hết khảo cách cho sang LED mà không cần quan tâm đến bảng font Quan sát cột thứ (cột C0) hình 2a, cột có LED hàng D2 D3 sang, LED lại tắt Điều thực cách kích chân C0 (Anod) lên mức cao, kéo chân D2, D3 xuống mức chân Data khác giữ mức cao Các cột khác thực tương tự Tuy nhiên, câu hỏi hiển thị cột với đèn LED sáng khác ngõ Cathod chúng nối chung (thành chân D) Ví dụ người kéo tất chân C0…C4 lên mức cao vào xuất tín hiệu chân D, tất LED dùng hàng sáng tắt “Bí quyết” kỹ thuật “quét”, hiển thị cột với giá trị tương ứng chúng không hiển thị đồng thời Trong ví dụ hiển thị số ‘4’, trước hết kích chân C0 lên cao chân C1…C4 mức thấp, xuất tín hiệu chân D để hiển thị lên cột C0 Tiếp theo kéo chân C1 lên cao chân Control khác mức thấp, xuất liệu chân D để hiển thị cột C1…Cứ hiển thị hết cột Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com quay lại cột C0 Quá trình gọi “quét LED” Do tốc độ “quét” cao nên cảm giác “nhấp nháy”, cột ma trận hiển thị đồng thời Chú ý độ sáng LED phụ thuộc vào số cột LED, bạn “quét” nhiều cột LED, tỉ lệ thời gian “ON” cột nhỏ so với thời gian “OFF” phải chờ quét cột khác Vì ma trận LED có nhiều cột ghép nhiều ma trận, mạch driver cần sử dụng để đảm bảo độ sáng LED Giả sử LED đại diện cho bit LED sáng đại diện cho giá trị nhị phân LED tắt số Hình 2b thể mô hình số nhị phân cho trường hợp hiển thị số ma trận LED 7x5 Nếu xem cột ma trận số bit giá trị cần thiết để hiền thị số ‘4’ là: 0x0C, 0x14, 0x24, 0x7F, 0x04 Bộ giá trị tạo thành mã font cho ký tự ‘4’, chúng định nghĩa trước lưu nhớ chip điều khiển (AVR), lần ký tự yêu cầu hiển thị, font tương ứng ký tự “load” xuất đường Data, lý gọi đường D đường Data Cách “quét” LED vừa trình bày cách “quét ngang”, bạn thực “quét dọc” ứng dụng yêu cầu Trong phương pháp quét dọc, chân hàng chung dùng để chọn hàng cần hiển thị, liệu xuất theo hàng cột thay đổi hàng (hàng trước, đến 1…và cuối 6) So sánh cách quét cho trường hợp ma trận LED 7x5, rõ ràng cách quét ngang cần quet cột cho lần LED nên tỉ lệ thời gian ON cao (1/5 so với 1/8 cách quét dọc) Mặt khác, thực quét dọc cần số số để tạo thành font cho ký tự tốn nhiều nhớ cho việc lưu trữ bảng font Trong học thực theo cách quét ngang bảng font xây dựng cho cách quét II AVR Ma trận LED Phần minh họa cách hiển thị ma trận LED 7x5 AVR Chúng ta thực ma trận LED, cho ứng dụng cần nhiều LED bạn đọc tự phát triển từ ý tưởng phần Hãy vẽ mạch điện mô phần mềm Proteus hình Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Hình Hiển thị ma trận LED AVR Các chân C ma trận nối với chân PORTC chip AVR ATmega32, chân D nối với PORTD Hãy tạo Project Programmer Notepad tên DotMatrix tạo file tên font.h dotmatrix.c Project File font.h chứa bảng font ký tự file dotmatrix.c file cho chương trình demo List trình phần nội dung file font.h List nội dung file dotmatrix.c List Bảng font Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com List Chương trình demo Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Điều cần quan tâm kích thước bảng font, ví dụ bảng font xây dụng cho 223 symbol có mã ASCII từ 32 đến 255 (do mã ASCII trước 32 symbol tương ứng nên bỏ qua để tiết kiệm nhớ), symbol cần số bits, cần tổng cộng 1115 byte cho bảng font kích thước SRAM chip ATmega32 2KB (2048 byte) Nếu dùng SRAM chứa bảng font phí phạm bảng tĩnh, giá trị bảng hoàn toàn không thay đổi mà truy xuất đọc Vì tận dụng nhớ chương trình (Flash) để lưu bảng font Dòng List include header “pgmspace.h” để sử dụng thao tác nhớ chương trình Tiếp theo khai báo mảng tĩnh có tên font7x5 với kiểu liệu prog_char tức kiểu char chứa nhớ chương trình (Program memory) Giá trị chứa mảng font7x5 liệu bảng font, thực chất mảng font7x5 mảng chiều liên tục, việc tách nhiều dòng có mục đích giúp người đọc dễ hình dung truy cập giá trị mảng để xuất sau Bạn hiểu tổ hợp số tạo thành symbol hiển thị cho ma trận Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com LED Dữ liệu bảng font xếp theo trình tự ASCII để tạo điều kiện thuận lợi truy xuất bảng font theo mã ASCII ký tự cần hiển thị Tuy nhiên cần ý bảng font bắt đầu cho symbol có mã ASCII 32 không mã ASCII 0, truy cận bảng font từ mã ASCII cần lấy mã ASCII trừ 32 để vị trí xác bảng Tiếp theo tìm hiểu chương trình chính, dòng list include file font.h để sử dụng bảng font chương trình Các dòng từ đến định nghĩa PORT kết nối với ma trận LED, PORTD Data bus PORTC control lines Chương trình void DOTputChar75(uint8_t chr) dòng 11 thủ tục đọc liệu từ bảng font hiển thị ma trận LED Tham số chr chương trình mã ASCII ký tự cần hiển thị ma trận LED Dòng 12 khai báo biến phụ, biến line chứa tín hiệu điều khiển cho đường Control Dòng 13 khai báo biến tạm tchr dùng chứa địa liệu cần lấy từ bảng font để xuất đường Data, mã ASCII số bit số lượng liệu bảng font lớn gấp lần số lương ký tự, cần khai báo biến tchr có kiểu liệu 16 bit Nội dung đoạn chương trình nằm vòng lặp for, biến i đại diện cho số thứ tự chân Control cho chạy từ đến 4, dòng 15 “CTRL_PORT=line;” xuất tín hiệu điều khiển CTRL_PORT tức chân C Do biến line khởi tạo nên lần lặp giá trị CTRL_PORT=0b00000001, tức chân C0 mức cao chân lại mức thấp, cột chọn Sau cột chọn, dòng 16 “DATA_PORT=~pgm_read_byte(&font7x5[((tchr - 32) * 5) + i]);” đọc xuất liệu từ bảng font chân Data Trước hết cách tính địa liệu bảng font Như trình bày phần giải thích cho bảng font, bảng ký tự có mã 32 nên cần trừ 32 để tham chiếu đến vị trí xác bảng font: tchr-32 Ví dụ muốn hiển thị ký tự có mã chr = 48 (mã ký tự ‘0’), vị trí tổ hợp liệu tạo nên số ‘0’ chứa bảng font vị trí 16, giá trị tính 48-32=16 Tiếp theo, ký tự tạo thành từ số nên địa thực chất số tổ hợp (tchr-32)*5 Để di chuyển phạm vi liệu ứng với cột ma trận LED, biến i cộng dồn vào địa có: tchr - 32) * 5) + i Để đọc dữ liệu dạng byte từ nhớ chương trình, cần dùng hàm pgm_read_byte, hàm định nghĩa header pgmspace.h khai báo file font.h Như saiu thực “pgm_read_byte(&font7x5[((tchr - 32) * 5) + i])” thu liệu byte tương ứng với cột thứ i ký tự chr từ bảng font, việc cuối xuất giá trị DATA_PORT Tuy nhiên, trước xuất byte đọc DATA_PORT, cần đảo bit byte toán tử “~”, lý giải thích LED ma trận ví vụ có hàng nối với cực âm Cathode, để LED sáng giá trị cần cấp cho bit D tương ứng nghĩa ngược lại so với cách tạo bảng font (sáng 1) Chỉ thao tác đơn giản toán tử “~” chúng dễ dàng vượt qua trở ngại Trong trường hợp ma trận LED có hàng nối với cực dương Anode không Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com cần đảo giá trị đọc Dòng 17 thực dịch chuyển giá trị biến line sang trái vị trí, việc làm có tác dụng chuẩn bị cho lần chân C kích Hàm delay dòng 18 giúp LED cột sáng khoảng thời gian trước chuyển qua cột khác Chương trình ví dụ thật đơn giản, trước hết cần khởi động hướng xuất nhập cho PORT sau gọi hàm DOTputChar75() vòng lặp vô tận while(1) Ở ví dụ trên, ký tự ‘4’ xuất kết hiển thị hình Chú ý hàm DOTputChar75() “quét” qua cột lượt, muốn hiển thị ký tự khoảng thời gian cần gọi hàm DOTputChar75() lặp lại khoảng thời gian Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com KeyPad Nội dung Các cần tham khảo trước Cấu trúc AVR Keypad 4x4 WinAVR Đọckeypad 4x4 AVR C cho AVR Download ví dụ Mô với Proteus Text LCD I Keypad 4x4 Keypad "thiết bị nhập" chứa nút nhấn cho phép người dùng nhập chữ số, chữ ký hiệu vào điều khiển Keypad không chứa tất bảng mã ASCII keyboard keypad thường tìm thấy thiết bị chuyên dụng Các nút nhấn máy tính điện tử cầm tay ví dụ keypad Số lượng nút nhấn keypad thay đổi phụ thuộc vào yêu cầu ứng dụng Trong giới thiệu cách điều khiển loại keypad đơn giản, keypad 4x4 Gọi keypad 4x4 keypad có 16 nút nhấn bố trí dạng ma trận hàng cột Cách bố trí ma trận hàng cột cách chung mà keypad sử dụng Cũng giống ma trận LED, nút nhấn hàng cột nối với nhau, với keypad 4x4 có tổng cộng ngõ (4 hàng cột) Mô hình Keypad 4x4 thể hình Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com a) b) Hình Keypad 4x4 Hình 1b mô hình thật keypad 4x4 hình 1a cấu hình bên Bốn hàng keypad đánh dấu A, B, C D cột gọi 1, 2, Hoạt động keypad: Giả sử nhút '2' nhấn, đường C nối với Giả sử đường nối với GND (mass, 0V) C GND Tuy nhiên, câu hỏi đặt cách kiểm tra trạng thái đường C có kết luận nút '2' nhấn? Giả sử tất đường 1, 2, 3, nới với GND, C= GND rõ ràng kết luận nút '1',= hay nút '2' hay nút '3' hay nút '-' nhấn Kỹ thuật để khắc phục vấn đề kỹ thuật "quét" keypad Kỹ thuật quét keypad AVR trình bày sau: - Nối tất chân keypad với PORT AVR, ví dụ PORTB theo thứ tự bên dưới: - Các chân 1, 2, 3, set chân Output giữ mức cao, chân A, B, C, D Input có điện trở kéo lên Lần lượt kéo chân 1, 2, 3, xuống thấp (lần lượt xuất giá trị chân), đọc trạng thái chân A, B, C, D để kết luận nút nhấn Ví dụ hình 1, nút '2' nhấn trình quét cho kết sau: • • Bước 1: kéo chân xuống (các chân 2,3,4 mức cao), kiểm tra chân A, B, C, D thu kết D=1, C=1, B=1, A=1 (giá trị đọc PINB 00001111 nhị phân) Bước 2: kéo chân xuống 0, kiểm tra lại A, B, C, D, kết thu D=1, C=0, B=1, A=1 (giá trị đọc PINB 0b00001011 nhị phân) Chân C=0 tức có nút hàng thứ nhấn, lại Bước thứ tức nút nhấn thuộc cột thứ Chúng ta dừng trình quét kết thu nút hàng 3, cột (tức nut '2' được) nhấn Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 10 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com - SQW/OUT: ngõ phụ tạo xung vuông (Square Wave / Output Driver), tần số xung tạo lập trình Như chân không liên quan đến chức DS1307 đồng hồ thời gian thực, bỏ trống chân nối mạch - SCL SDA đường giao xung nhịp liệu giao diện I2C mà tìm hiểu TWI AVR Có thể kết nối DS1307 mạch điện đơn giản hình Hình Mạch ứng dụng đơn giản DS1307 Cấu tạo bên DS1307 bao gồm số thành phần mạch nguồn, mạch dao động, mạch điều khiển logic, mạch giao điện I2C, trỏ địa ghi (hay RAM) Do đa số thành phần bên DS1307 thành phần “cứng” nên nhiều việc sử dụng DS1307 Sử dụng DS1307 chủ yếu ghi đọc ghi chip Vì cần hiểu rõ vấn đề cấu trúc ghi cách truy xuất ghi thông qua giao diện I2C Phần tìm hiểu cấu trúc ghi trước cách truy xuất chúng tìm hiểu phần 2, điều khiển DS1307 AVR Như trình bày, nhớ DS1307 có tất 64 ghi 8-bit đánh địa từ đến 63 (từ 0x00 đến 0x3F theo hệ hexadecimal) Tuy nhiên, thực chất có ghi đầu dùng cho chức “đồng hồ” (tôi gọi RTC) lại 56 ghi bỏ trông dùng chứa biến tạm RAM muốn Bảy ghi chứa thông tin thời gian đồng hồ bao gồm: giây (SECONDS), phút (MINUETS), (HOURS), thứ (DAY), ngày (DATE), tháng (MONTH) năm (YEAR) Việc ghi giá trị vào ghi tương đương với việc “cài đặt” thời gian khởi động cho RTC Việc đọc giá từ ghi đọc thời gian thực mà chip tạo Ví dụ, lúc khởi động chương trình, ghi vào ghi “giây” giá trị 42, sau 12s đọc ghi này, thu giá trị 54 Thanh ghi thứ (CONTROL) ghi điều khiển xung ngõ SQW/OUT (chân 6) Tuy nhiên, không dùng chân SQW/OUT nên có thề bỏ qua ghi thứ Tổ chức nhớ DS1307 trình bày hình Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 80 Thanhtam Ho - www.hocavr.com Copyright © 2010 Cùng học AVR Hình Tổ chức nhớ DS1307 Vì ghi quan trọng hoạt động DS1307, khảo sát ghi cách chi tiết Trước hết quan sát tổ chức theo bit ghi hình Hình Tổ chức ghi thời gian Điều cần ý giá trị thời gian lưu ghi theo dạng BCD BCD viết tắt cụm từ Binary-Coded Decimal, tạm dịch số thập phân theo mã nhị phân Ví dụ bạn muốn cài đặt cho ghi MINUTES giá trị 42 Nếu quy đổi 42 sang mã thập lục phân thu 42=0x2A Theo cách hiểu thông thường cần gán MINUTES=42 MINUTES=0x2A, nhiên ghi chứa giá trị BCD nên chuyện khác, diễn giải hình Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 81 Thanhtam Ho - www.hocavr.com Copyright © 2010 Cùng học AVR Hình Số BCD Với số 42, trước hết tách thành chữ số (digit) Mỗi chữ số sau đổi sang mã nhị phân 4-bit Chữ số đổi sang mã nhị phân 4-bit 0100 đổi thành 0010 Ghép mã nhị phân chữ số lại thu mốt số bit, số BCD Với trường hợp này, số BCD thu 01000010 (nhị phân) = 66 Như vậy, để đặt số phút 42 cho DS1307 cần ghi vào ghi MINUTES giá trị 66 (mã BCD 42) Tất phần mềm lập trình hay ghi chip điều khiển sử dụng mã nhị phân thông thường, mã BCD, cần viết chương trình để quy đổi từ số thập nhị phân (hoặc thập phân thường) sang BCD, phần trình bày lúc lập trình giao tiếp với DS1307 Thoạt nhìn, người cho số BCD làm vấn đền thêm rắc rối, nhiên số BCD có ưu điểm việc hiển thị hiển thị chữ số hiển thị LED đoạn chẳng hạn Quay lại ví dụ 42 phút, giả sử dùng LED 7-đoạn để thị chữ số số phút Khi đọc ghi MINUTES thu giá trị 66 (mã BCD 42), 66=01000010 (nhị phân), để hiển thị cần dùng phương pháp tách bit thông thường để tách số 01000010 thành nhóm 0100 0010 (tách toán tử shift “>>” C instruction LSL, LSR asm) xuất trực tiếp nhóm LED 0100 = 0010 =2, nhanh chóng Thậm chí, nối LED 7-đoạn PORT, việc tách digit không cần thiết, để hiển thị số, cần xuất trực tiếp PORT Như vậy, với số BCD, việc tách hiển thị digit thực dễ dàng, không cần thực phép chia (rất tốn thời gian thực thi) cho số 10, 100, 1000…như trường hợp số thập phân Thanh ghi giây (SECONDS): ghi ghi nhớ DS1307, địa 0x00 Bốn bit thấp ghi chứa mã BCD 4-bit chữ số hàng đơn vị giá trị giây Do giá trị cao chữ số hàng chục (không có giây 60 !) nên cần bit (các bit SECONDS6:4) mã hóa (số =101, bit) Bit cao nhất, bit 7, ghi điều khiển có tên CH (Clock halt – treo đồng hồ), bit set dao động chip bị vô hiệu hóa, đồng hồ không hoạt động Vì vậy, thiết phải reset bit xuống Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 82 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com từ đầu Thanh ghi phút (MINUTES): có địa 0x01, chứa giá trị phút đồng hồ Tương tự ghi SECONDS, có bit ghi dùng lưu mã BCD phút, bit luôn Thanh ghi (HOURS): nói ghi phức tạp DS1307 Thanh ghi có địa 0x02 Trước hết 4-bits thấp ghi dùng cho chữ số hàng đơn vị Do DS1307 hỗ trợ loại hệ thống hiển thị (gọi mode) 12h (1h đến 12h) 24h (1h đến 24h) giờ, bit6 (màu green hình 4) xác lập hệ thống Nếu bit6=0 hệ thống 24h chọn, bit cao dùng mã hóa chữ số hàng chục giá trị Do giá trị lớn chữ số hàng chục trường hợp (=10, nhị phân) nên bit đủ để mã hóa Nếu bit6=1 hệ thống 12h chọn, với trường hợp có bit dùng mã hóa chữ số hàng chục giờ, bit (màu orange hình 4) buổi ngày, AM PM Bit5 =0 AM bit5=1 PM Bit (thiết kế dở, dời hẳn bit mode A-P sang bit đơn giản hơn) Thanh ghi thứ (DAY – ngày tuần): nằm địa chĩ 0x03 Thanh ghi DAY mang giá trị từ đến tương ứng từ Chủ nhật đến thứ tuần Vì thế, có bit thấp ghi có nghĩa Các ghi lại có cấu trúc tương tự, DATE chứa ngày tháng (1 đến 31), MONTH chứa tháng (1 đến 12) YEAR chứa năm (00 đến 99) Chú ý, DS1307 dùng cho 100 năm, nên giá trị năm có chữ số, phần đầu năm người dùng tự thêm vào (ví dụ 20xx) Ngoài ghi nhớ, DS1307 có ghi khác nằm riêng gọi trỏ địa hay ghi địa (Address Register) Giá trị ghi địa ghi nhớ mà người dùng muốn truy cập Giá trị ghi địa (tức địa nhớ) set lệnh Write mà khảo sát phần tiếp theo, AVR DS1307 Thanh ghi địa tô đỏ hình 6, cấu trúc DS1307 Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 83 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Hình Cấu trúc DS1307 II AVR DS1307 Phần hướng dẫn lập trình điều khiển giao tiếp với DS1307 AVR, dùng WinAVR Do DS1307 hoạt động Slave I2C, bạn thiết phải đọc lại “Bài - Giao tiếp TWI-I2C”, là chế độ Master (Send Reveive) Tôi không đề cập lại toàn giao diện I2C tóm tắt cách thực với AVR sau: để thực gọi chế độ Master, AVR gởi điều kiện START, bit địa Slave (SLA) +1 bit Write/Read, trình đọc hay ghi liệu Master Slave byte liệu bit (có thể byte dãy bytes), sau byte có bit ACK NOT ACK Cuộc gọi kết thúc với việc Master phát điều kiện STOP Cứ trình, có “code” sinh ghi trạng thái TWSR, kiểm tra giá trị code để biết trình giao tiếp có thành công không Bạn cần nhơ dãy code thành công Master truyền liệu là: 0x08 -> 0x18 -> 0x28 ->…->0x28 Và dãy code thành công Master truyền liệu 0x08 - > 0x40 - > 0x50 ->…->0x50 -> 0x58 Nắm cách ghi đọc AVR Master bạn nắm 50% cách giao tiếp với DS1307, 50% lại phải hiểu cách bố trí dãy liệu riêng DS1307 Hãy theo dõi phần Vì DS1307 Slave I2C nên có mode (chế độ) hoạt động giao tiếp với chip Hai mode DS1307 bao gồm Data Write (từ AVR đến DS14307) Data Read (từ DS1307 vào AVR) Mode Data Write dùng xác lập giá trị ban đầu cho ghi thời gian dùng để canh chỉnh thời gian Trong chế độ này, Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 84 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com AVR Master truyền liệu đến DS1307 (Slave nhận liệu) Mode Data Read sử dụng đọc thời gian từ đồng hồ DS1307 vào AVR để hiển thị so sánh….Trong chế độ này, AVR Master nhận liệu DS1307 Slave truyền liệu Hình mô tả cấu trúc liệu chế độ Data Write Hình Chế độ Data Write Trước hết nói địa Slave Address (SLA) DS1307 mạng I2C Như biết, mạng I2C thiết bị có địa riêng gọi SLA SLA số bit, theo lý thuyết có tối đa 128 thiết bị mạng I2C Chip DS1307 I2C Slave nên có địa SLA, giá trị set cố định 1101000 nhị phân, hay 0x68 thập lục phân Do SLA DS1307 cố định nên mạng I2C tồn lúc chip (điều thực không cần thiết) tồn thiết bị I2C khác tồn nhiều Master AVR Quan sát hình 7, sau điều kiện START gởi Master (AVR) bit địa SLA DS1307 (1101000) Do chế độ Data Write nên bit W (0) gởi kèm sau SLA Bit ACK (A) DS1307 trả cho Master sau trình giao tiếp Tiếp theo sau địa SLA byte chứa địa ghi cần truy cập (tạm gọi Addr_Reg) Cần phân biệt địa ghi cần truy cập địa SLA Như đề cập trên, địa ghi cần cập lưu ghi địa (hay trỏ địa chỉ), byte liệu chứa ghi địa DS1307 Sau byte địa ghi dãy byte liệu ghi vào nhớ DS1307 Byte liệu ghi vào ghi có địa định Addr_Reg, sau ghi byte, Addr_Reg tự động tăng nên byte ghi liên tiếp vào ghi kế sau Số lượng bytes liệu cần ghi Master định không vượt dung lương nhớ DS1307 Ví dụ sau gởi SLA+W, Master gởi bytes gồm byte đầu 0x00 bytes khác trỏ địa trỏ đến ghi (0x00 – ghi SECONDS) ghi liên tiếp bytes vào ghi thời gian SD1307 Đây cách mà thực phần lập trình giao tiếp ( xem chương trình TWI_DS1307_wblock phía sau) Quá trình ghi kết thúc Master phát điều kiện STOP Chú ý, sau gởi byte Addr_Reg, Master không gởi bytes liệu mà gởi liền điều kiện STOP ghi ghi Trường hợp dùng để set địa Addr_Reg phục vụ cho trình đọc Tiếp theo, khảo sát cách xếp liệu chế độ Data Read, xem hình Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 85 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Hình Chế độ Data Read Trong chế độ Data Read, bit R (1) gởi kèm sau bit SLA Sau liên tiếp byte liệu truyền từ DS1307 đến AVR Điểm khác biệt bố trí liệu chế độ so với chế độ Data Write byte địa ghi liệu gởi đến Tất bytes theo sau SLA+R liệu đọc từ nhớ DS1307 Vậy liệu đọc nào? Câu trả lời ghi định trỏ địa chỉ, giá trị lưu lại lần thao tác trước đo Như vậy, muốn đọc xác liệu từ địa đó, cần thực trình ghi giá trị cho trỏ địa trước Để ghi giá trị vào trỏ địa gọi chương trình Data Write với byte ghi sau SLA+W phần ý Chúng ta chuẩn bị đầy đủ để giao tiếp với DS1307 Phần trình bày chương trình mô giao tiếp AVR DS1307 Hãy vẽ mạch điện Proteus hình Trong ví dụ này, ban đầu cài đặt thời gian cho DS1307, sau tiến hành đọc thời gian từ chip đồng hồ hiển thị lên Text LCD Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 86 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Hình Ví dụ giao tiếp AVR – DS1307 Tôi chia chương trình thành phần, phần giao tiếp với DS1307 thông qua I2C viết file myDS1307RTC.h phần ví dụ ghi-đọc, hiển thị viết file DS1307RTC_Test.c Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 87 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com List myDS1307RTC.h Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 88 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Các phần định nghĩa trước dòng 35 trích từ TWI nên không giải thích lại Chúng ta dòng 36 Có chương trình viết để giao tiếp AVR với DS1307 là: ghi dãy liệu vào DS1307 tức chương trình TWI_DS1307_wblock(uint8_t Addr, uint8_t Data[], uint8_t len), chương trình viết theo cách xếp liệu chế độ Data Write trình bày Chương trình đọc liệu từ DS1307 TWI_DS1307_rblock(uint8_t Data[], uint8_t len ) chương trình dùng để set địa ghi cần truy cập có tên Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 89 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com TWI_DS1307_wadr(uint8_t Addr) Chương trình TWI_DS1307_wblock(uint8_t Addr, uint8_t Data[], uint8_t len) nằm từ dòng 54 đến dòng 77 Trong chương trình này, tham số Addr địa ghi cần truy cập, Data[] mảng liệu ghi vào DS1307 len số byte liệu ghi (không tính byte Addr) Dòng 55, AVR phát điều kiện START để bắt gọi I2C, sau chờ cho bit TWINT set lên dòng 56 (TWINT = 1, công việc thực hiện) Dòng 57 kiểm tra điều kiện START gởi thành công hay không cách so sánh ghi trạng thái TWSR với “code” tương ứng (xem lại hình giao tiếp TWI) Sau START gởi, dòng 59 gán địa SLA+W cho ghi liệu TWDR để phát I2C, TWDR=(DS1307_SLA[...]... Text LCD dạng ma trận điểm (dot-matrix), chip này có thể được dùng cho các LCD có 1 hoặc 2 dòng hiển thị HD44780U có 2 mode giao tiếp là 4 bit và 8 bit Nó chứa sẵn 208 ký tự mẫu kích thước font 5x8 và 32 ký tự mẫu font 5x10 (tổng cộng là 240 ký tự mẫu khác nhau) 1 Sơ đồ chân Các Text LCD theo chuẩn HD44780U thường có 16 chân trong đó 14 chân kết nối với bộ điều khiển và 2 chân nguồn cho “đèn LED nền” Thứ... các loại dữ liệu như ký tự cần hiển thị hoặc dữ liệu đọc ra từ bộ nhớ LCD…Cả 2 thanh ghi đều được nối với các đường dữ liệu D0:7 của Text LCD và được lựa chọn tùy theo các chân điều khiển RS, RW Thực tế để điều khiển Text LCD chúng ta không cần quan tâm đến cách thức hoạt động của 2 thanh ghi này, vì thế cũng không cần khảo sát chi tiết chúng HD44780U có 3 loại bộ nhớ, đó là bộ nhớ RAM dữ liệu cần hiển... đến các chân của PORT dùng làm đường dữ liệu nhất là khi các đường điều khiển và dữ liệu dùng chung 1 PORT (PORTB) Biến temp_data dùng trong giải thuật mặt nạ để không làm ảnh hưởng đến các bit khác khi ghi LCD Dòng 3 đọc dữ liệu từ PORT DATA_O và che đi các bit cao, chỉ lưu lại các bit thấp vào biến temp_data vì các bit thấp này không được dùng xuất nhập dữ liệu (xem hình 7, các chân thấp của PORTB... Hoang huyhq.fet.hut@gmail.com Page 34 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com (keyword: LM016L), 1 chip Atmega32 và 1 biến trở (POT-LIN) như trong hình 8 Tạo 1 Project bằng WinAVR có tên là TextLCD_Demo và tạo file source là main.c, tạo makefile với khai báo sữ dụng chip ATmega32 và clock 8MHz Copy file myLCD.h vào thư mục của Project mới tạo Viết code cho file main.c như trong list... đồ chân Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 16 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Trong một số LCD 2 chân LED nền được đánh số 15 và 16 nhưng trong một số trường hợp 2 chân này được ghi là A (Anode) và K (Cathode) Hình 2 mô tả cách kết nối LCD với nguồn và mạch điều khiển Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 17 Thanhtam Ho - www.hocavr.com Copyright... 01 02 #define CTRL 03 #define DDR_CTRL 04 05 #define DATA_O 06 #define DATA_I 07 #define DDR_DATA 08 PORTC DDRC PORTC PINC DDRC Viết đoạn code trong List1 vào file main.c List 1 Nội dung file main.c Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 12 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com Ở dòng 3 chúng ta include file myLCD.h để sử dụng các hàm thao tác Text LCD Trong các dòng... tả trong hình 5 Hình 5 Hoạt động của chân RS R/W (chân số 4): Chân lựa chọn giữa việc đọc và ghi Nếu R/W=0 thì dữ liệu sẽ được ghi từ bộ điều khiển ngoài (vi điều khiển AVR chẳng hạn) vào LCD Nếu R/W=1 thì dữ liệu sẽ được đọc từ LCD ra ngoài Tuy nhiên, chỉ có duy nhất 1 trường hợp mà dữ liệu có thể đọc từ LCD ra, đó là đọc trạng thái LCD để biết LCD có đang bận hay không (cờ Busy Flag - BF) Do LCD là... đọc dữ liệu vào LCD đó là mode 8 bit và mode 4 bit: - Mode 8 bit: Nếu bit DL trong lệnh function set bằng 1 thì mode 8 bit được dùng Để sử dụng mode 8 bit, tất cả các lines dữ liệu của LCD từ D0 đến D7 (từ chân 7 đến chân 14) phải được nối với 1 PORT của chip điều khiển bên ngoài (ví dụ PORTC của ATmega32 trong ví dụ của bài này) như trong hình 3 Ưu điểm của phương pháp giao tiếp này là dữ liệu được... #define DDR_DATA 18 */ Created by QuocHuy Hoang huyhq.fet.hut@gmail.com Page 26 Copyright © 2010 Cùng học AVR Thanhtam Ho - www.hocavr.com cbi và sbi là 2 macro được dụng để xóa và set 1 bit trong 1 thanh ghi Ví dụ cbi(PORTA, 5) là xóa bit 5 trong thanh ghi PORT về 0 Do WinAVR không hỗ trợ tuy xuất trực tiếp các bit nên cần định nghĩa 2 macro này hỗ trợ Các biến EN, RW và RS định nghĩa số thứ tự của... thay thế là CTRL và DDR_CTRL Tương tự, tôi định nghĩa 3 biến thay thế là DATA_O nghĩa là PORT xuất dữ liệu, DATA_I là PORT nhập dữ liệu và DDR_DATA là thanh ghi điều khiển hướng DATA_O và DATA_I là PORT nối với các chân D0:7 (mode 8 bit) hoặc D4:7 (mode 4 bit) của LCD, đây là các đường truyền và nhận dữ liệu Trong ví dụ trên, tôi dùng chính PORTB làm đường data vì đây là trường hợp giao tiếp 4 bit, do ... hình ảnh hiển thị lên ma trận LED, bạn hiểu rõ tìm hiểu điều khiển ma trận LED 7x5 bên a) b) Hình mô tả cách mà ma trận LED 7x5 dùng để hiển thị số Trước hết khảo cách cho sang LED mà không cần quan... bảng font xây dựng cho cách quét II AVR Ma trận LED Phần minh họa cách hiển thị ma trận LED 7x5 AVR Chúng ta thực ma trận LED, cho ứng dụng cần nhiều LED bạn đọc tự phát triển từ ý tưởng phần... quét cột khác Vì ma trận LED có nhiều cột ghép nhiều ma trận, mạch driver cần sử dụng để đảm bảo độ sáng LED Giả sử LED đại diện cho bit LED sáng đại diện cho giá trị nhị phân LED tắt số Hình