banner_2__resize
Giỏ hàng

Điện thoại cố định028.6264.1482
Bán hàng
: 0965.605.840 - 0868.532.813

Địa chỉ: 565/19 Bình Thới, P.10, Q.11, TP.HCM

+ Bán hàng trực tiếp: Từ Thứ 2 - Thứ 7: 8h00' sáng - 6h00' tối
                                    Riêng Chủ nhật: 8h00' sáng - 2h00' chiều
+ Bán hàng online: từ Thứ 2 - Thứ 7: 8h00' sáng - 5h00' chiều
+ Hỗ trợ kỹ thuật: từ Thứ 2 - Thứ 7: 8h00' sáng - 5h00' chiều

DANH MỤC SẢN PHẨM
Thống kê truy cập
Đang truy cập: 246
Trong ngày: 1405
Trong tuần: 1405
Lượt truy cập: 2648027

Bài 3 - Hướng dẫn lập trình Led ma trận (tt), dùng Timer

Hôm nay ta bắt đầu bài 3: Thay thế hàm delay bằng ngắt Timer1. Sở dĩ ta phải dùng ngắt Timer thay cho hàm delay bởi trong khi delay thì ta sẽ không làm được gì cả. Còn sử dụng Timer thì trong thời gian chờ đợi ta có thể chuẩn bị dữ liệu, tính toán hiệu ứng cho hàng tiếp theo.

Em sẽ khai báo ngắt Timer1 như sau:

 
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x25; // Quyet dinh toc do quet
OCR1BH=0x00;
OCR1BL=0x00;

Timer1 có tần số hoạt động là 15625Hz tức là nó sẽ đếm 15625 lần trong vòng 1s. Ở đây, nó cứ đếm từ 0 đến 0x25 = 37 thì ngắt Timer1 sẽ được gọi. Như vậy ngắt Timer1 sẽ được gọi với tần số là 15625/37=422 lần/s.
Chúng ta phải nhớ kích hoạt ngắt nhé:

 
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Global enable interrupts
#asm("sei")

Chương trình ngắt Timer1 được viết như sau:

 

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{ if (r & 1){
spi(0b10101010);
spi(0b10101010); 
spi(0b10101010);}
else {
spi(0b01010101);
spi(0b01010101); 
spi(0b01010101); 
}
LatchData();
PORTC=r+8;
r++;
if (r==8) r=0;
}

Như vậy mỗi khi ngắt Timer1 được gọi thì một hàng sẽ được quét. Ta có tất cả 8 hàng. Do đó tần số quét sẽ là: 422/8=53Hz. Với tần số quét này màn hình led sẽ không bị chớp.

Các bác có thể thấy trong vòng lặp while (1) không còn câu lệnh nào cả. Việc quét led hoàn toàn thực hiện tự động nhờ Timer1.

 
while (1){
}

Các bác nghỉ lấy sức, qua bài 4 chúng ta sẽ học cách tạo bộ font chữ bằng chương trình Microsoft Excel như thế nào.

Source code của bài 3 đây:

http://rapidshare.com/files/134768565/bai3.doc

Code:
3. Thay delay bang ngat Timer 1
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 7/27/2008
Author  : Nguyen Hai Ha
Company : www.softviet.net                   
Comments: 


Chip type           : ATmega8515L
Program type        : Application
Clock frequency     : 16,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include 
#include 
// SPI functions
#include 

#define SCK PORTB.7
#define DATA PORTB.5
#define SCL PORTB.3

#define B PORTC.1;
#define C PORTC.2;
#define OE  PORTC.3;
unsigned char r=0;
void LatchData(){
    SCL=0;
    SCL=1;
}
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{   if (r & 1){
        spi(0b10101010);
        spi(0b10101010);    
        spi(0b10101010);}
    else {
        spi(0b01010101);
        spi(0b01010101);    
        spi(0b01010101);               
    }
    LatchData();
    PORTC=r+8;
    r++;
    if (r==8) r=0;
}

void main(void){
   // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 4000,000 kHz
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0x50;
    SPSR=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Mode: CTC top=OCR1A
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x0D;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x25;	// Quyet dinh toc do quet
    OCR1BH=0x00;
    OCR1BL=0x00;

DDRB=0xFF;
DDRC=0xFF;
SCL=1;
// Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x40;
    // Global enable interrupts
    #asm("sei")
 
    while (1){
    }
}

 

Bây giờ ta bắt đầu tạo chữ “CHAO” bằng chương trình Excel nhé.
Trước hết em nhắc lại một xíu về số nhị phân nhé. Một byte có 8 bit. Mỗi bit có thể biểu diễn được hai trạng thái 0 và 1. 0 ứng với led tắt, 1 ứng với led sáng. Chúng ta đang làm một bảng led ma trận gồm 3 panels led 8x8. Như vậy, một hàng led ma trận của chúng ta hiện nay có 24 cột. Rõ ràng ta sẽ tốn 3 bytes = 24 bits để biểu diễn dữ liệu cho một hàng. Ta sẽ truyền dữ liệu cho các IC dịch 74HC595 của chúng ta như sau:
- Muốn cho các led của một hàng sáng hết ta sẽ truyền 3 bytes đều mang giá trị là 0b1111111 (hệ nhị phân) = 255 (hệ cơ số 10).
- Muốn cho một hàng không có led nào sáng ta sẽ truyền 3 bytes đều mang giá trị là 0b00000000 = 255.
- Muốn cho một cột sáng xong lại đến một cột tắt ta truyền 3 bytes là 0b10101010 = 2^7 + 2^5 + 2^3 + 2^1 = 128 + 32 + 8 + 2 = 178;
Bác nào con lăn tăn về việc chuyển đối số nhị phân thì xem lại sách vở một chút nhé. Các bác chỉ cần nhớ là một byte có 8 bits: bit 7, bit 6, bit 5… và bit 0. Khi chuyển đổi từ nhị phân sang thập phân cứ hễ bit nào bằng 1 thì ta sẽ phải cộng thêm 2 lũy thừa của bit đó. Như ở ví dụ trên số nhị phân 0b10101010 có các bit số 7, 5, 3 và 1 bằng 1 nên ta sẽ phải cộng 128, 32, 8 và 2 lại với nhau.
Như vậy ta đã sẵn sàng mở Excel ra rồi nhỉ? Nhấn vào (1) để chọn toàn bộ các ô trong sheet sau đó chọn (2) Format - Column – Width nhập vào 2.2:



Hàng đầu tiên nhập vào các giá trị của các trọng số 0 đến 7 của 3 bytes ứng với 24 cột. 1 tức là 2 mũ 0, 2 là 2 mũ 1, 4= 2^2 … và 128=2^7



Bây giờ là lúc các bác có thể thỏa sức sáng tạo ra bộ font mà các bác muốn. Lưu ý là ta chỉ có 8 dòng để tạo bộ font thôi. Em thấy cần 7 dòng là sẽ được một bộ font cân đối. Vậy ta cứ để dư một dòng vậy. Ở chỗ nào sau này các bác muốn led sáng thì gõ số 1 vào. Chỗ nào led tắt thì để trống. Đây là sản phẩm của em sau 2 phút:



Em có hoa tay phết các bác nhỉ. Vậy 8 hàng tiếp theo em tính giá trị thập phân tại các bit 1 nhé:



Việc tiếp theo là em sẽ tính toán lại các byte (24 bytes) đại diện cho chữ “CHAO” này. Cũng rất rất đơn giản thôi. Ta cứ cộng mỗi 8 số lại với nhau như hình dưới.



Như vậy ta có được 24 bytes dùng để hiện chữ “CHAO” rồi. Các byte lần lượt là 156, 136, 112 (cho việc hiện hàng 1), 162, 72, 137 (hàng 2)… 156, 40, 114 (hàng 7), 0, 0, 0 (hàng 8).

Việc cuối cùng là ta đưa nó vào trong một mảng, mảng này sẽ được cất trên ROM của chú AVR khi nạp chương trình luôn.

Code:
XINCHAO[]={156,136,112,162,72,137,130,40,138,130,47,138,130,232,139,162,40,138,156,40,114,0,0,0};

Vậy là xong cái việc tạo font. Sau này các bác có thể tự tạo cho mình bất cứ font chữ hay hình ảnh nào rồi.

Bài tiếp theo em sẽ hướng dẫn các bác đưa cái sản phẩm tim óc nãy giờ của chúng ta lên màn hình led nhé.

 

(Nguồn: dientuvietnam.net)

In bài viết
LIÊN HỆ

Địa chỉ: 565/19 Bình Thới, P.10, Q.11, TP.HCM

Giờ làm việc:
+ Bán hàng trực tiếp: Từ Thứ 2 - Thứ 7 (8h00' sáng - 6h00' tối) - Chủ nhật (8h00' sáng - 2h00' chiều)
+ Bán hàng online: từ Thứ 2 - Thứ 7 (8h00' sáng - 5h00' chiều)

☎ Điện thoại cố định: 028.6264.1482
☎ 
Bán hàng:
0965.605.840 (Zalo) - 0868.532.813 (Zalo)

✉ Email: sale@chipn24.com

Design by Thiết kế WEB