Thông báo

Collapse
No announcement yet.

Xin giúp điều khiển led chạy nhiều hiệu ứng cùng lúc

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Xin giúp điều khiển led chạy nhiều hiệu ứng cùng lúc

    Xin chào các anh chị!
    Em đang sử dụng atmega8 để điều khiển led cho quán cafe của người quen. Giã sử em sử dụng portc điều khiển led viền còn portd điều khiển tên quán. vấn đề em gặp là em không điều khiển portc và portd cùng một thời điểm được.
    Em muốn portc chóp tắt xen kẻ liên tục trong khi đó em vẫn điều khiển được led ở portd. Em nghe nói đến có thể sử dụng ngắt nhưng em không làm được.
    Các anh chị có thể đưa ra một ví dụ nhỏ về vấn đề này không? Em thành thật cảm ơn!

  • #2
    Làm công việc này hoàn toàn có thể làm được. Có nhiều cách để thực hiện. Tuy nhiên trong ứng dụng cần xử lý nhiều việc thì không nên sử dụng delay mà thay vào việc sử dụng delay là thực hiện các lệnh khác. Lấy ví dụ ta hãy lấy một timer dùng để đếm thời gian. Và ngắt timer sẽ làm một biến đếm tăng lên. Sử dụng con trỏ để tạo ra các sự kiện trễ mà không ảnh hưởng đến hệ thống. Thực chất của việc trễ này là một lệnh kiểm tra IF.
    Ví dụ như if(ThơiGianDem>=10ms) DieuKhienPortC();
    else DieuKhienPortD();
    và nhiều nhiều cách nữa....
    n
    ĐT: 0986 492 489

    Tham khảo:

    Comment


    • #3
      Nguyên văn bởi minhhieu Xem bài viết
      Làm công việc này hoàn toàn có thể làm được. Có nhiều cách để thực hiện. Tuy nhiên trong ứng dụng cần xử lý nhiều việc thì không nên sử dụng delay mà thay vào việc sử dụng delay là thực hiện các lệnh khác. Lấy ví dụ ta hãy lấy một timer dùng để đếm thời gian. Và ngắt timer sẽ làm một biến đếm tăng lên. Sử dụng con trỏ để tạo ra các sự kiện trễ mà không ảnh hưởng đến hệ thống. Thực chất của việc trễ này là một lệnh kiểm tra IF.
      Ví dụ như if(ThơiGianDem>=10ms) DieuKhienPortC();
      else DieuKhienPortD();
      và nhiều nhiều cách nữa....
      Bạn ơi! bạn có thể cho mình một đoạn code nhỏ để ví dụ không? mình chưa hiểu ý bạn nữa! Bạn thông cảm và đừng cười nhé!

      Comment


      • #4
        Nguyên văn bởi lamgialong Xem bài viết
        Xin chào các anh chị!
        Em đang sử dụng atmega8 để điều khiển led cho quán cafe của người quen. Giã sử em sử dụng portc điều khiển led viền còn portd điều khiển tên quán. vấn đề em gặp là em không điều khiển portc và portd cùng một thời điểm được.
        Em muốn portc chóp tắt xen kẻ liên tục trong khi đó em vẫn điều khiển được led ở portd. Em nghe nói đến có thể sử dụng ngắt nhưng em không làm được.
        Các anh chị có thể đưa ra một ví dụ nhỏ về vấn đề này không? Em thành thật cảm ơn!
        chỉ có một PC -con trỏ chương trình nên tất cả chỉ có thể làm nối tiếp chỉ có điều với một lệnh trong 1 chu kì thạch anh nên hầu như bạn thấy mọi việc đồng thời. cặp sbic, sbis, bảng....có thể dùng. tìm google để có ví dụ.

        Comment


        • #5
          Bạn có thể cho cái chương trình điều khiển cái led nháy viền vào ngắt timer.Bạn điều chỉnh khéo một chút là được ấy mà.Nhớ là ko dùng delay trong đó mà dùng chính cái timer ấy để tạo trễ cho thời gian nháy viền nhé.

          Comment


          • #6
            Nguyên văn bởi quick_slow Xem bài viết
            Bạn có thể cho cái chương trình điều khiển cái led nháy viền vào ngắt timer.Bạn điều chỉnh khéo một chút là được ấy mà.Nhớ là ko dùng delay trong đó mà dùng chính cái timer ấy để tạo trễ cho thời gian nháy viền nhé.
            Bạn ơi! giã sữ mình sử dụng 4 pin: PORTB.3, PORTB.2, PORT.1, PORTB.0 để điều khiển led viền, bạn cho mình đoạn code của ngắt timer đi! giã sử chỉ cần 4 pin này chóp tắt xen kẻ thôi!
            Cảm ơn bạn nhiều nhiều!

            Comment


            • #7
              Bạn hãy vận dụng kiến thức vào thực tế: hiện tượng lưu ảnh của mắt!

              Do đó không nhất thiết phải sáng liên tục cùng lúc , chớp xen kẽ nhanh quá cũng thấy sáng cùng lúc thôi!

              Comment


              • #8
                Các bạn xem dùm mình đoạn code này nhé! Mình làm được chương trình ngắt tran timer 0 rồi. Nhưng PORTD mình delay_us(10) rồi nhưng nó vẫn chậm không biết tại sao nữa. Mình có cảm giác như khi không được gọi ngắt thì chương trinh chính mới hoạt động vậy?
                cảm ơn các bạn nhé!



                Code:
                /*****************************************************
                This program was produced by the
                CodeWizardAVR V2.03.4 Standard
                Automatic Program Generator
                © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
                http://www.hpinfotech.com
                
                Project : 
                Version : 
                Date    : 10/29/2009
                Author  : 
                Company : 
                Comments: 
                
                
                Chip type           : ATmega8
                Program type        : Application
                Clock frequency     : 8.000000 MHz
                Memory model        : Small
                External RAM size   : 0
                Data Stack size     : 256
                *****************************************************/
                
                #include <mega8.h>
                #include <delay.h>
                
                long int dem=0;
                interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                { int i;
                //nap lai gia tri cho Timer0
                TCNT0=100;
                //cac dong lenh cho muc dich khac:
                dem++; // tang dem len 1 don vi
                if (dem==256){ //dem=20000?
                  {for (i=0;i<=5;i++) 
                   {
                   PORTB.0=1;
                   PORTB.1=1;
                   PORTB.2=0;
                   PORTB.3=0;
                   delay_ms(10);
                   PORTB.0=0;
                   PORTB.1=1;
                   PORTB.2=1;
                   PORTB.3=0;
                   delay_ms(10);
                   PORTB.0=0;
                   PORTB.1=0;
                   PORTB.2=1;
                   PORTB.3=1;
                   delay_ms(10);
                   PORTB.0=1;
                   PORTB.1=0;
                   PORTB.2=0;
                   PORTB.3=1;
                   }
                   for (i=0;i<=5;i++)
                   {
                    PORTB.0=0;
                   PORTB.1=0;
                   PORTB.2=1;
                   PORTB.3=1;
                   delay_ms(10);
                   PORTB.0=0;
                   PORTB.1=1;
                   PORTB.2=1;
                   PORTB.3=0;
                   delay_ms(10);
                   PORTB.0=1;
                   PORTB.1=1;
                   PORTB.2=0;
                   PORTB.3=0;
                   delay_ms(10);
                   PORTB.0=1;
                   PORTB.1=0;
                   PORTB.2=0;
                   PORTB.3=1;
                   }
                   }
                dem=0; //thiet lap lai gia tri bat dau cua dem la 0
                }
                }
                
                // Declare your global variables here
                
                void main(void)
                {
                // Declare your local variables here
                
                // Input/Output Ports initialization
                // Port B initialization
                // Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
                // State7=T State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
                PORTB=0x00;
                DDRB=0x3F;
                
                // Port C initialization
                // Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
                // State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
                PORTC=0x00;
                DDRC=0x3F;
                
                // Port D initialization
                // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
                // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
                PORTD=0x00;
                DDRD=0xFF;
                #asm("cli") 
                
                // Timer/Counter 0 initialization
                // Clock source: System Clock
                // Clock value: Timer 0 Stopped
                TCCR0=0x01;
                TCNT0=100;
                
                // Timer/Counter 1 initialization
                // Clock source: System Clock
                // Clock value: Timer 1 Stopped
                // Mode: Normal top=FFFFh
                // 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: Off
                // Compare B Match Interrupt: Off
                TCCR1A=0x00;
                TCCR1B=0x00;
                TCNT1H=0x00;
                TCNT1L=0x00;
                ICR1H=0x00;
                ICR1L=0x00;
                OCR1AH=0x00;
                OCR1AL=0x00;
                OCR1BH=0x00;
                OCR1BL=0x00;
                
                // Timer/Counter 2 initialization
                // Clock source: System Clock
                // Clock value: Timer 2 Stopped
                // Mode: Normal top=FFh
                // OC2 output: Disconnected
                ASSR=0x00;
                TCCR2=0x00;
                TCNT2=0x00;
                OCR2=0x00;
                
                // External Interrupt(s) initialization
                // INT0: Off
                // INT1: Off
                MCUCR=0x00;
                
                // Timer(s)/Counter(s) Interrupt(s) initialization
                TIMSK=0x01;
                #asm("sei")
                
                // Analog Comparator initialization
                // Analog Comparator: Off
                // Analog Comparator Input Capture by Timer/Counter 1: Off
                ACSR=0x80;
                SFIOR=0x00;
                
                while (1)
                      {
                      PORTD=0X00;
                      delay_us(10);
                      PORTD=0Xff;
                      delay_us(10);        
                
                      };
                }

                Comment


                • #9
                  Nguyên văn bởi quick_slow Xem bài viết
                  Bạn có thể cho cái chương trình điều khiển cái led nháy viền vào ngắt timer.Bạn điều chỉnh khéo một chút là được ấy mà.Nhớ là ko dùng delay trong đó mà dùng chính cái timer ấy để tạo trễ cho thời gian nháy viền nhé.
                  Bạn ơi! trong chương trinh phục vụ ngắt mình có sử dụng delay, còn dùng chính timer để tạo trễ là sao? Bạn giúp mình nhé! mình mới tìm hiểu thôi nên xin được chân thành học hỏi!

                  Comment


                  • #10
                    timer ý nghĩa của nó như delay trong ct chính, dùng delay trong ngắt thì còn nói làm gì nữa ???

                    Comment


                    • #11
                      Nguyên văn bởi ssgabeo Xem bài viết
                      timer ý nghĩa của nó như delay trong ct chính, dùng delay trong ngắt thì còn nói làm gì nữa ???
                      Mình biết dùng delay trong ngắt là sai rồi! nhưng nhờ các bạn chỉ dùm mình thủ thuật để trong ngắt không dùng delay nhưng vẫn hiển thị được hiệu ứng!
                      Cảm ơn nhiều lắm!

                      Comment


                      • #12
                        hi
                        bạn có thể hiểu như sau :1 người chạy xô 2 chổ làm,chạy tới chổ thứ nhất làm 1/5 công việc sau đó qua chổ thứ 2 làm 1/10 công việc . và chạy trở lại chổ thứ nhất làm tiếp 1/5 công việc nữa rồi lại qua chổ thứ 2 làm tiếp 1/10 công việc nữa,quá trình lạp lại khi 2 chổ đều làm xong,chổ thứ nhất tương ứng với đèn số 1 chổ thứ 2 đèn thứ 2.mổi khi làm thêm một phần việc tương ứng với sự tăng thêm một đơn vị(hoặc nhiều đơn vị) đếm trong timer hoặc thanh ghi ,thời gian tổng cộng său khi hoàn thành 2 chổ sẽ là thời gian trì hoãn để đèn tắt hoặc sáng ,thời gian này sẽ cảm nhận dược bằng mắt,nhưng thời gian chuyển chổ làm không cảm nhận được sự thay đổi vì rất nhanh .công việc ở đây là set/clear thanh ghi ngõ ra đễ làm đèn tắt hoặc sáng .muốn nhấp nháy nhiều kiểu hơn thì them vào vòng lập một quá trình tương tự nối tiếp với quá trình trên nhưng thời gian duy trì khác.vậy ở mọi thời điểm chỉ có một đèn sáng và con trỏ chương trình chạy nối tiếp đễ thực hiện các công việc .
                        ý tưởng lập trình như thế nào quan trọng hơn việc lập trình dù bạn dùng loại vi điều khiển nào.
                        mỏi tay quá rồi, bye nhé

                        Comment


                        • #13
                          Nguyên văn bởi lamgialong Xem bài viết
                          Bạn ơi! giã sữ mình sử dụng 4 pin: PORTB.3, PORTB.2, PORT.1, PORTB.0 để điều khiển led viền, bạn cho mình đoạn code của ngắt timer đi! giã sử chỉ cần 4 pin này chóp tắt xen kẻ thôi!
                          Cảm ơn bạn nhiều nhiều!
                          nếu dk 4 chân này cho led viền.. thì đơn giản quá rồi..
                          chạy viền trên 4 chân... nếu là đuổi nhau đơn giản thì sẽ có 4 trạng thái.. và thời gian thay đổi trạng thái là khoảng 100ms trở lên.(giả sử bạn đặt 120ms) vậy bạn cho một cái timer, đặt thời gian ngắt trong khoảng 10ms.và thêm một biến đếm, cứ mỗi lần có ngắt thì tăng biến đếm này lên, và kiểm tra nếu bằng 12 (12x10=120ms) thì gọi chương trình thay đổi trạng thái và reset biến đếm này về 0, vậy là xong. mọi xử lí về chạy viền thì chỉ việc đặt trong ctrinh ở trên, thời gian còn lại bạn tha hồ mà xử lí các công việc khác,
                          (việc đặt timer ở trên chỉ là 10ms là để bạn có thể linh hoạt trong việc thay đổi thời gian đổi trạng thái, còn nếu cố định thì bạn cứ việc đăt timer bằng 120ms luôn, và có ngắt timer thì gọi ctr ở trên ra là xong)

                          đây là vidu cơ bản.. bạn có thể tham khảo và mở rộng thêm.

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X