Thông báo

Collapse
No announcement yet.

Tutorial: Led ma trận bằng hình ảnh (completed)

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nguyên văn bởi nghaiha Xem bài viết
    Ta sẽ sử dụng 8 transitor B564, nối các chân C của 8 transitor này với các chân H1-H8, chân E nối lên dương nguồn 5V, chân B là chân điều khiển. Khi chân B ở mức 1, transitor B562 không dẫn, H1 không có dương nguồn. Khi B được kéo xuống mức 0, transitor B562 sẽ dẫn, lúc đó H1 sẽ được nối với nguồn 5V.

    Ta có 8 chân cần cấp nguồn lần lượt H1 – H8 tức là có 8 chân nối với các chân B (qua điện trở 1k) của transitor B562 CH1-CH8. Ta có thể nối thẳng các chân điều khiển này vào vi xử lý (ở đây em sẽ dùng con có sẵn là ATMEGA8518). Nhưng như vậy thì phí chân MCU quá, để chân MCU còn làm việc khác khi mở rộng mạch sau này. Do đó em em sẽ nối các chân CH1 - CH8 với con 74HC138. Qua con IC giải mã 3 ra 8 này em chỉ tốn 4 chân, 3 chân điều khiển tín hiệu A, B, C và một chân điều khiển tín hiệu cho phép cho nó. Nguyên lý làm việc của con này bác nào chưa hiểu thì xem thêm datasheet nhé.
    Rồi cắm 8 chú B562 này vào breadboard, mỗi chú có thêm 2 em điện trở đi kèm. Em bám vào chân B 1k, còn em lên dương nguồn thì 10k. Cắm cũng chẳng lâu đâu, xíu xiu thôi mà:

    Cả chú 74HC138 luôn, nhưng hết chỗ cho chú rồi, cho chú sang board khác vậy

    Chú em phụ cắm led cho em vừa cắm vừa tủm tỉm cười nè

    Và dưới đây là schematic của tutorial này nhé:
    (em đang không vào được mạng qua đường chính thống, phải đi qua proxy nên không xài chức năng upload file của diễn đàn được, các bác chịu khó down rapidshare)
    http://rapidshare.com/files/133103844/Orcad.rar
    cái file đính kèm orcad bị lỗi rùi anh ạ. trên diễn dàn có anh nào vẽ lại rồi post lên cho em với. em đang cần gấp các pác ạ

    Comment


    • anh Hà ơi anh chỉ em cách điều khiển ledmatrix bằng bàn phím loại AT đi!
      Ý tưởng là như thế này:
      đầu tiên bảng led chạy chữ "vui long nhap chu"
      khi nhấn Esc thì bảng led tắt
      sau đó nhập dòng chữ mình muốn chạy và "Enter" thì sẽ chạy dong chữ vùa nhập
      muốn chạy chữ khác thì nhấn Esc rồi nhập vào như trên là được.
      đây là bảng led em làm nè:
      http://www.youtube.com/watch?v=Van09SnpiCk

      Comment


      • Tôi có 1 vấn đề về bảng led nhưng chưa có giải pháp nào khắc phục được đó là khi dịch dòng chữ đi thì các nét chữ có cảm giác rung nhoè ra( không phải bị bóng led ) không còn nét nữa, hiện tượng này theo tôi nghĩ là do hiện tượng lưu ảnh trên mắt người, khi ta dịch led đó qua 1 cột nhưng do độ lưu ảnh trên mắt mình vẫn thấy led đó đang còn ở vị trí cũ, hiện tượng này phát sinh khi ta đưa vào giữa 2 lần dịch chữ 1 khoảng thời gian delay.
        Có ai đã khắc phục hiện tượng này xin chỉ giáo

        Comment


        • pác up bài lập trình của bác lên xem.có thể do con AVR của pác không tương thích với tần số của thạch anh hoặc do phần mềm,cũng có thể do mạch của pác bị nhiễu quá.nhưng mà em nghĩ trong trường hợp này có lẽ là do phần mềm

          Comment


          • cái này không phải do AVR hay gì hết mà nó do thế này khoảng các các điểm led trên ma trận led 8x8 lớn nên khi dịch chuyển từ điểm này sang điểm khác sẽ không mịnh được nên sẽ gây hiện tượng này, cái này là chắc chắn có , ngay cả các cty quang báo nó làm những bảng lớn khi nhìn vào mình vẫn thấy hiện tượng đó mà.
            Nó giống như thế này nè.
            ý mình ở đây là cách thức khắc phục hiện tượng này, theo kinh nghiệm của mình thì chỉ có đường ngồi chỉnh thời gian delay giữa mỗi lần dịch đến khi nào thầy vừa mắt là được (hahah cái này hơi bị đuối). Ai có cách nào khác thì mình cùng thảo luận nha.

            Comment


            • Gởi bạn leemjngwuong!
              Chương trình của tôi chỉ dùng để tham khảo các phương pháp quét hàng,dịch bit,hiển thị dùng phương pháp 2 màn hình.Khi hiển thị màn hình 1 trong lúc chờ ngắt xảy ra ,ta lấy dữ liệu tiếp theo ra và dịch bit để sắp xếp cho màn hình 2. Khi hiển thị xong màn hinh 1 thì ta
              cho hiển thị màn hình 2 và sắp xếp tiếp dữ liệu cho màn hình 1.Cứ như thế cho đến khi hết nội dung bảng mã mà ta lưu trong flash.

              Comment


              • có ai có tệp định nghĩa ký tự ascii theo hàng k ạ? (kiểu cấu trúc ý) cho em xin, trc em làm quét cột nên có 1 file định nghĩa mỗi ký tự có 5 cột, bây giờ cần định nghĩa ký tự thành 7 hàng mà làm e là k chuẩn

                Comment


                • Nguyên văn bởi nghaiha Xem bài viết
                  Qua bài trước các bác đã nắm được phương pháp "tạo hình" rồi. Tức là nội dung sẽ hiển thị lên bảng led thế nào do ta thiết kế. Nó có thể là kí tự, bông hoa hay bất cứ cái gì. Và công việc bây giờ là hiển thị nó lên màn hình.

                  Data của chúng ta ban đầu lưu ở trong Flash ROM. Do đó em đã khai báo
                  Code:
                  unsigned char flash 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};
                  Em sẽ khai báo một mảng trong RAM, mảng này sẽ là bộ nhớ màn hình. Timer 1 của chúng ta sẽ liên tục đọc mảng này và đưa ra màn hình led. Sau này ta muốn làm hiệu ứng hay bất cứ điều gì thì ta chỉ việc thay đổi cái mảng này

                  Code:
                  unsigned char DMem[24]; // Bo nho man hinh, 3 byte dau cho hang 1, 3 byte tiep theo cho hang 2 ...
                  Ban đầu em lấy âm bản của data lưu trong flash. Các bác có thể không thèm lấy âm bản và coi nó như là một hiệu ứng cũng được. Lúc đó chữ "CHAO" sẽ không sáng nhưng background của nó thì lại sáng.
                  Code:
                      for (i=0;i<=23;i++){
                          DMem[i]=~XINCHAO[i];
                      }
                  Trong chương trình ngắt Timer1 ta đưa bộ nhớ màn hình ra màn hình led. Lưu ý quét mỗi hàng thì ta lấy ra 3 bytes . Em không muốn sử dụng mảng 2 chiều cho bộ nhớ màn hình là có nguyên nhân. Các bác thử đoán xem nhé.

                  Code:
                  // Timer 1 output compare A interrupt service routine
                  interrupt [TIM1_COMPA] void timer1_compa_isr(void){
                      spi(DMem[r*3+2]); //byte thứ 2 ở hàng thứ r
                      spi(DMem[r*3+1]); // byte thứ 1 ở hàng thứ r
                      spi(DMem[r*3]);    // byte thứ 0 ở hàng thứ r
                      LatchData();
                      PORTC=r+8;         // để Enable chú 74138
                      r++;
                      if (r==8) r=0;
                  }
                  Vậy là xong, các bác hãy biên dịch và nạp vào AVR. Kết quả sẽ như bài viết đầu tiên của em



                  Đây là full source code của chúng ta cho đến thời điểm này

                  Code:
                  6. Hien chu CHAO (giong chuong trinh XINCHAO)
                  /*****************************************************
                  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 <mega8515.h>
                  #include <delay.h>
                  // SPI functions
                  #include <spi.h>
                  
                  #define SCK PORTB.7
                  #define DATA PORTB.5
                  #define SCL PORTB.3
                  
                  #define B PORTC.1;
                  #define C PORTC.2;
                  #define OE  PORTC.3;
                  char lenX=9;
                  char NoLed=3;
                  unsigned char flash 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};
                  unsigned char DMem[24]; // Bo nho man hinh, 3 byte dau cho hang 1, 3 byte tiep theo cho hang 2 ...
                  unsigned char r=0;
                  unsigned char i;
                  void LatchData(){
                      SCL=0;
                      SCL=1;
                  }
                  // Timer 1 output compare A interrupt service routine
                  interrupt [TIM1_COMPA] void timer1_compa_isr(void){
                      spi(DMem[r*3+2]);
                      spi(DMem[r*3+1]);
                      spi(DMem[r*3]);
                      LatchData();
                      PORTC=r+8;
                      r++;
                      if (r==8) r=0;
                  }
                  
                  void main(void){
                      // 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")
                     // 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;
                      for (i=0;i<=23;i++){
                          DMem[i]=~XINCHAO[i];
                      }
                      while (1){
                  
                      }
                  }
                  Bài này đã xong, các bác hãy tùy biến flash data để tạo ra các hình ảnh lạ mắt trên màn hình led nhé. Bài sau em hướng dẫn hiệu ứng làm chữ "CHAO" của ta tối dần và sáng dần. Các bác đón xem nhé.

                  Bác nghaiha cho e hỏi chút xíu.Hai dòng lệnh khai báo màu đỏ sao e không thấy sử dụng.E đã mô phỏng theo bài của bác nhưng chữ hiển thị không dc đầy đủ.
                  Những ô màu xanh không sáng.Bác xem và kiểm tra lại giúp e.E rất thích bài viết của bác về chủ đề này.E cám ơn!
                  Attached Files
                  YM :

                  Comment


                  • Gui anh NgHaiHa!
                    Trong mach minh thay anh su dung FET 4A loai dán, khong biet FET nay ten gi? có bán ngoài thị trường khong? mong anh chi giup em!

                    Comment


                    • Ở đây mình dùng 2 LMD 8x8x2 thì dùng khoảng bao nhiêu con 74HC595 & 74HC138.
                      Bỏ ULN2803 đi có được không.?

                      Comment


                      • Tôi có 1 vấn đề về bảng led nhưng chưa có giải pháp nào khắc phục được đó là khi dịch dòng chữ đi thì các nét chữ có cảm giác rung nhoè ra( không phải bị bóng led ) không còn nét nữa, hiện tượng này theo tôi nghĩ là do hiện tượng lưu ảnh trên mắt người, khi ta dịch led đó qua 1 cột nhưng do độ lưu ảnh trên mắt mình vẫn thấy led đó đang còn ở vị trí cũ, hiện tượng này phát sinh khi ta đưa vào giữa 2 lần dịch chữ 1 khoảng thời gian delay.
                        Có ai đã khắc phục hiện tượng này xin chỉ giáo
                        cái này không phải do AVR hay gì hết mà nó do thế này khoảng các các điểm led trên ma trận led 8x8 lớn nên khi dịch chuyển từ điểm này sang điểm khác sẽ không mịnh được nên sẽ gây hiện tượng này, cái này là chắc chắn có , ngay cả các cty quang báo nó làm những bảng lớn khi nhìn vào mình vẫn thấy hiện tượng đó mà.
                        Nó giống như thế này nè.
                        ý mình ở đây là cách thức khắc phục hiện tượng này, theo kinh nghiệm của mình thì chỉ có đường ngồi chỉnh thời gian delay giữa mỗi lần dịch đến khi nào thầy vừa mắt là được (hahah cái này hơi bị đuối). Ai có cách nào khác thì mình cùng thảo luận nha.
                        Cái này ai đã làm rồi thì đều vướng hết, không biết các cao thủ thì xử lý thế nào. Còn mình thì khắc phục được nhưng tốc độ dịch chữ không chậm được: Mỗi chu kỳ chỉ quét một bảng mã, tức là một chu kỳ thì dịch chữ 1 lần. (đã thực hiện được).
                        Ai có ý hay thì góp ý thêm.
                        |

                        Comment


                        • Nhân đây cho hỏi luôn các phần tính toán dòng cho 595:
                          - Dòng tối đa của 595 là 35mA (một hay nhiều ngõ ra cũng vậy).
                          - 1 led cho là 10mA khi sáng.
                          - Quét hàng: giả sử khi trên hàng đó tất cã các led đều sáng thì dòng vào các 595 có phải là 80mA không? mà 595 chịu được chỉ 35mA thôi cho nên chỗ này sáng mờ.
                          Không biết phân tích như vậy có đúng không các bác.
                          |

                          Comment


                          • Chắc không ai quan tâm đến LMD nữa rùi. Đang viết bằng ASM, nhưng rắc rối quá, đk 2 LMD thôi mà đã rối lên rồi, ai rành ASM thì hướng dẫn giúp. Lúc đưa dữ liệu ra output 595 và quay trở lại lấy dữ liệu tiếp theo từ bảng tra..

                            Comment


                            • Bác Hà ơi, có phải là trên các bo mạch hoàn thiện của bác là FET thay hoàn toàn cho B562 phải không ạ? Em muốn hỏi luôn nguyên lý của mấy con FET bác đã dùng được không ạ? Có phải nó cũng đảo mức logic như B562 không?
                              Manchester United FC forever!

                              Comment


                              • Em hỏi thêm bác Hà và các bác trên diễn đàn chút. Em tra datasheet của PIC16F877A để tìm hiểu module SPI và xem cả example trong CCS nữa nhưng khi thí nghiệm trên bo cắm với 5 con 595 thì 40 con LED sáng loạn cả lên. Liệu em có dùng sai hay không? Bác Hà hay bác nào có dùng SPI của PIC ko chỉ cho em với?
                                Code:
                                #include <16F877A.h>
                                #device *=16 ADC=8
                                #fuses NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
                                #use delay(clock=4000000)
                                #use fast_io(b)
                                #byte portb=0x6
                                #bit SCL = portb.0
                                
                                void latch_data()
                                  {
                                    SCL=0;
                                    SCL=1;
                                  }
                                
                                main()
                                  {
                                   byte i;
                                   set_tris_b(0);
                                   setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16); // tham kha?o Help
                                   
                                   SCL=1;
                                   while (true)
                                      {
                                       for (i=1; i<=5; ++i) {spi_write(0xAA);}
                                       latch_data();
                                       delay_ms(1000);
                                
                                       for (i=1; i<=5; ++i) {spi_write(0x55);}
                                       latch_data();
                                       delay_ms(1000);
                                      }
                                  }
                                Em lắp xen kẽ 20 con LED xanh với 20 con LED đỏ, viết code để cho chúng nó nhấp nháy.
                                Theo như datasheet thì em dùng chân RC5 của PIC16F877A để xuất data ra chân 14 của con 595 đầu tiên, chân RC3 làm chân clock (SCK), chân RB0 chọn để chốt.
                                Last edited by bravesoldier; 23-06-2009, 16:27.
                                Manchester United FC forever!

                                Comment

                                Về tác giả

                                Collapse

                                nghaiha Tìm hiểu thêm về nghaiha

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X