MỤC LỤC
AVR có cấu trúc Harvard, trong đó đường truyền cho bộ nhớ dữ liệu (data memory bus) và đường truyền cho bộ nhớ chương trình (program memory bus) được tách riêng. Là một thanh ghi 16 bit nhưng cũng có thể được xem như hai thanh ghi chức năng đặc biệt 8 bit dùng để lưu trữ biến trong quá trình tính toán. Con trỏ giảm địa chỉ xuống 1 khi dữ liệu được đưa vào Stack với lệnh PUSH và hai khi có Subroutine hoặc Interrupt được gọi.
Bộ nhớ chương trình chỉ gồm 1 phần là Application Flash Section nhưng trong các chip AVR mới chúng ta có thêm phần Boot Flash section. Các vector ngắt nằm ở phần đầu của application section từ địa chỉ 0x0000 và dài đến bao nhiêu tùy thuộc vào loại chip và phần chứa instruction nằm liền sau đó. ATmega16 chứa bộ nhớ dữ liệu EEPROM dung lượng 512 byte, và được sắp xếp theo từng byte, cho phép các thao tác đọc/ghi từng byte một.
Bộ nhớ chương trình được truy cập trong mỗi chu kỳ xung clock và 1 instruction chứa trong program memory sẽ được load vào trong instruction register, instruction register tác động và lựa chọn register file cũng. Trong lúc thực thi chương trình, địa chỉ của dòng lệnh đang thực thi được quyết định bởi một bộ đếm chương trình – PC (Program counter).
TWI trên AVR được vận hành bởi 5 thanh ghi bao gồm thanh ghi tốc độ giữ nhịp TWBR, thanh ghi điều khiển TWCR , thanh ghi trạng thái TWSR, thanh ghi địa chỉ TWAR và thanh ghi dữ liệu TWDR. - TWBR (TWI Bit Rate Register): là 1 thanh ghi 8 bit quy định tốc độ phát xung giữ nhịp trên đường SCL của chip Master. Trong đó CPU Clock frequency là tần số hoạt động chính của AVR, TWBR là giá trị thanh thi TWBR và TWPS là giá trị của 2 bits TWPS1 và TWPS0 nằm trong thanh thi trạng thái TWSR.
Như thế, khi set một chip ở chế độ Slave, chúng ta cần set bit này để nó có thể đáp ứng lại Master bất cứ khi nào được gọi. Đối với chip Master, tín hiệu ACK chỉ được phát trong 1 trường hợp duy nhất đó là khi Master nhận dữ liệu từ Slave, Master phát ACK để báo cho Slave là mình đã nhận được và muốn tiếp tục nhận từ Slave. Khi một chip muốn trở thành Master để thực hiện 1 cuộc gọi, bit này cần được set.
Nếu đường truyền không rảnh, TWI sẽ chờ cho đến khi nó rảnh (nhận ra 1 STOP condition) và tiếp tục gởi START condition. Chú là là bit nay cần được xóa bởi phần mềm sau khi START condition đã được gởi (viết 0 vào bit này để xóa nó). Khi Master muốn kết thúc một cuộc gọi, nó sẽ phát STOP condition bằng cách viết giá trị 1 vào bit TWSTO.
Slave cũng có thể tác động vào bit này, nếu một cuộc gọi bị lỗi, viết 1 vào TWSTO trên Slave sẽ reset đường truyền về trạng thái rảnh ban đầu.
Mục đích tạo thư viện _7_seg.h có thể sử dụng lâu dài và đơn giản hóa code giúp dễ dàng trong việc phân tích code. Từ dòng số 1 đến dòng số 4 dùng để khai báo PORT để hiển thị lên LED 7 đoạn. _7_seg_CTRL được định nghĩa là PORT phục vụ cho việc quét LED, _7_seg_DATA được định nghĩa là PORT đẩy dữ liệu ra LED.
Như vậy việc chọn PORT nào sẽ đảm nhiệm chức năng quét và đẩy dữ liệu được thực hiện ở đây. Hàm _7_seg_init là hàm khởi tạo dùng để truyền vào số LED cần hiển thị. Chia làm 2 phần như trên sẽ rút ngắn được dòng lệnh và tăng tốc độ xử lý.
Khi quét LED nào thì anot LED đó bằng 1 tiến hành đẩy dũ liệu trong mảng M[] ra LED. Vì vậy với ứng dụng lớn cần nhiều đến tốc độ chip, nên thay delay bằng các timer, và giảm số lần quét LED. Thực chất ở đây đó là hiển thị giá trị của biến đếm, còn giá trị biến đếm tăng hay giảm, hoặc đếm từ giá trị nào lại phụ thuộc vào các đối số trong hàm for.
Bằng cách thay đổi giá trị trong hàm for và đối số thứ 3 thành dem--. Bài này cũng tương tự như 2 bài trên, chỉ việc khởi tạo lại số LED trong hàm _7_seg_init(8); và truyền các đối số trong hàm for.
Khi quét LED ma trận cần có các chân quét và các chân dữ liệu, và tùy vào việc chọn các chân trên bảng LED ma trận mà ta có quét hàng hoặc quét cột. Chip ATMEGA16 gồm 4 PORT trong đó có 1 PORT quét và các PORT còn lại có thể là PORT dữ liệu. Ngoài ra muốn tăng thêm số bảng LED hiển thị còn có thể sử dụng đến các IC giải mã, hoặc các IC ghi dịch mà trong bài báo cáo này chưa đề cập đến.
Từ dòng 4 đến dòng 11 để định nghĩa các PORT, hay nói cách khác là gán chức năng cho các PORT. Việc khai báo này sẽ giúp thay thế các PORT dễ dàng khi cần thiết. Hơn nữa việc định nghĩa PORT giúp chúng ta dễ dàng trong việc theo dừi và sửa lỗi.
Như đã nói ở trên, việc chọn là quét hàng hay quét cột và quét mức tích cực âm hay tích cực dương tùy và từng người sử dụng, và tùy vào những điều kiện khác nhau. Trong bài này sẽ chọn phương án quét cột, và mức tích cực là mức dương. Vì những điểm sáng được lấy là 1 nên ta gọi là mức tích cực dương.
Lần lượt sẽ tắt từng cột LED theo thứ tự từ phải sang trái hoặc ngược lại. Tắt cột nào thì đẩy mã của cột đẩy ra và chờ 1 khoảng trễ để mắt người nhìn thấy trước khi quét cột kế tiếp. Nếu để ý trên mô phỏng sẽ thấy trên PORT quét, Mức 0V sẽ chạy lần lượt từ phải sang trái hoặc ngược lại.
Nếu dòng 26 không có dấu “~” giá trị của line sẽ truyền trực tiếp vào PORT quét. Như thế chúng ta sẽ thấy 1 mức dương chạy lần lượt chứ không phải như mức 0V mà chúng ta đang xét.
Tùy vào mỗi phiên bản code vision sẽ có những thư viện lcd khác nhau. Vì vậy việc khai báo trên môi phiên bản cũng có đôi chút khác nhau. Để bắt đầu mỗi dự án (project) khác nhau cần dùng trình hỗ trợ của chương trình code vision để khởi tạo.
Bằng cách nhập vào các PORT hoặc các chân được nối vào các LCD để hiển thị. // write the string str located in SRAM to the LCD void lcd_puts(char *str);. // write the string str located in FLASH to the LCD void lcd_putsf(char flash *str);.
// write the string str located in EEPROM to the LCD void lcd_putse(char eeprom *str);. Cần chú ý với cách viết code như trên, vì trong dòng 5 và 6 sử dụng phương pháp sét bit trực tiếp nên các bít của các thanh ghi như (COM1A1, COM1B1, WGM11). Ưu điểm của cách set bit này đó là: không lệ thuộc vào trình hỗ trợ, giúp ghi nhớ cỏc thanh ghi.
Dễ dàng theo dừi cho người đọc và người sửa lỗi khi kiểm tra code. Biết được đang sử dụng những bit nào của thanh ghi một cách nhanh chóng, từ đó biết được mode nào đang sử dụng. Để hiểu rừ hơn về cấu trỳc thanh ghi cú thể theo dừi thờm trong datasheet.
Cỏc bit COM1A1, COM1B1 là cỏc bit chọn dạng tín hiệu ra của PWM (Compare Output Mode bits). Trong mode 14, giá trị TOP (cũng là chu kỳ của PWM) được chứa trong thanh ghi ICR1. Bit CS10 được set ta có thể hiểu là tần số được giữ nguyên không chia.
Như vậy 2 kênh này có cùng tần số chỉ khác nhau về độ rộng xung. Độ rộng xung thay đổi nhờ vào vòng lặp for đã thay đổi giá i từ 0 đến 255 liên tục và truyền vào thanh ghi OCR0.
Để điều khiển tốc độ động cơ một cách chính xác có thể sử dụng thuật toán PID. Kết hợp với động cơ có bộ hồi tiếp encoder nhìn chung khá phức tạp nên trong phạm vi báo cáo này em không sử dụng.