Thông báo

Collapse
No announcement yet.

Lập trình ngắt trong PSOC

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

  • #31
    Bạn kiểm tra mấy điểm sau xem:
    +Đã nối chân ngắt với Global in.. chưa?
    +Định nghĩa nó lối vào số, định nghĩa là có trở nối xuống GND(nếu ko thì treo trở khoang 4.7K xuống GND ở ngoài). Sau khi ấn nút thì có thật sự gần bằng Vcc ko? Nghia là binh thường mức 0, nếu ấn nút thì mức 1. Chính sườn này khiến ngắt "rising edge"xuất hiện. Khi ấn nút, do rung cơ khi thì có thể nhiều suờn như vậy, có thể sinh nhiều ngắt.

    Comment


    • #32
      Hôm qua cty mất điện nên nghỉ ở nhà, thấy anh em thảo luận sôi nổi quá.
      Bác calculut chờ nhé, tôi sẽ gửi vào hòm thư cho bác một ví dụ với ngắt GPIO, ở đây nó không cho load lên file có dung lượng lớn mặc dù tôi đã nén lại ...
      Work is glory

      Comment


      • #33
        Bác Winter InJuly ơi bác làm cổ em dài thêm 20 cm nữa rồi nè. Bác bảo gửi cho em mà em có thấy gì đâu.

        Comment


        • #34
          Tui xin lỗi nhé, tôi đã gửi vào hòm thư của bạn rùi đấy
          Work is glory

          Comment


          • #35
            Nguyên văn bởi WinterInJuly
            Tui xin lỗi nhé, tôi đã gửi vào hòm thư của bạn rùi đấy
            Phân biệt chủng tộc quá he
            Bác post lên đây mã lệnh để bà con chiêm ngưỡng đê. Phần cấu hình có giải thích qua 1 tý thì hay, à, mà hình như ở trong PSoC designer có phần in báo cáo, cômg cụ tuyệt vời luôn.
            -------------------

            Comment


            • #36
              Cái này tôi đã nói hết ở phần trên rồi, do bạn đấy làm không được nên tôi gửi qua email thôi. Hơn nữa diễn đàn không cho upload file có dung lượng lớn nên không gửi được... Source code thì có hết ở phần bên trên rồi còn gì
              Work is glory

              Comment


              • #37
                Chào các bác

                Xin các cao thủ chỉ giáo về việc lập trình đợi ngắt sử dụng Sleep Timer của Psoc. Nếu có thể xin cho một đoạn code C mẫu
                Chân thành cám ơn tất cả các sự trợ giúp
                |

                Comment


                • #38
                  Hi
                  Sleep timer là một timer luôn luôn chạy ngay cả khi CPU ở trạng thái Sleep (vì thế nó có tên là SLEEP_TIMER), sử dụng nguồn clock 32.768Kh (internal or External)
                  Có thể chọn tần số cho nó trong phần Global resource: ví dụ chọn 1Hz thì nó ngắt 1s/lần, 512Hz thì 1/512s 1 lần....Cái này đặt ở phần Editor/Global resource hoặc đặt trong chương trình bằng cách tác động vào thanh ghi OCS_CR0, 2bit 4:3
                  4:3 period
                  00 1.95ms
                  01 15.6ms
                  10 125ms
                  11 1s
                  Vecto ngắt của nó nằm ở địa chỉ cuối cùng , vào phần boot.asm (boot.tpl) đặt thêm dòng lệnh: ljmp _sleep_timer_isr
                  vào địa chỉ vecto ngắt cuanó


                  code trong chương trình

                  [code:1]#pragma interrupt_handler sleep_timer_isr
                  char flag;
                  void sleep_timer_isr(void);
                  void main (void)
                  {

                  INT_MSK0 |=0x40; //enable sleeptimer interrupt
                  M8C_EnableGInt; //global interrupt enable
                  flag=0;
                  while(1)
                  {
                  while(flag==0);
                  turn_on_led(); //hàm để turn on led
                  delay(); //hàm trễ
                  turn_off_led(); //hàm turn off led
                  flag=0;
                  }

                  }

                  ///////
                  void sleep_timer_isr(void)
                  {
                  flag=1;
                  }[/code:1]
                  Work is glory

                  Comment


                  • #39
                    Nguyên văn bởi WinterInJuly
                    Sleep timer là một timer luôn luôn chạy ngay cả khi CPU ở trạng thái Sleep (vì thế nó có tên là SLEEP_TIMER), sử dụng nguồn clock 32.768Kh (internal or External)
                    Vấn đề 1:
                    Theo tư duy một số họ VĐK (ví dụ PIC), ở chế độ SLEEP, CPU dừng toàn bộ chương trình. Hầu hết các khối chức năng ngừng hoạt động. Nó chỉ thức dậy khi:
                    1-Có các ngắt ngoài.
                    2-Do watchdog.
                    3-Do reset
                    4-Do một số ngắt đặc biệt khác. (Ví dụ ở PIC thì có Timer1 chế độ sử dùng RTC).
                    Vậy theo ý bác Winter thì tại SLEEP mode, nếu sử dụng ngắt SLEEP TIMER thì sau khi có ngắt này, CPU sẽ thức dậy và nhảy vào ngắt SLEEP (thoát khỏi SLEEP mode). Nó chỉ vào mode SLEEP khi gặp dòng lệnh SLEEP();

                    while(1)
                    {
                    SLEEP(); //Them vao
                    turn_on_led(); //hàm để turn on led
                    delay(); //hàm trễ
                    turn_off_led(); //hàm turn off led
                    flag=0;
                    }

                    void sleep_timer_isr(void)
                    {
                    flag=1;
                    }
                    Và như vậy, thì sau mỗi lần gặp SLEEP TIMER, thì chương trình sẽ nháy và tắt LED đi 1 lần????

                    Nếu dung SLEEP mode và dùng cả SLEEP Timer(nhưng ko cài đặt ngắt SLEEP TIMER) thì khi cờ SLEEP TIMER tràn, thì nguyên nhân này ko làm thoát khỏi SLEEP mode được?

                    Vậy vấn đề tui nói ở trên có sai sót chỗ nào đối với PSoC ko?

                    Vấn đề 2:
                    Khi dùng chung SLEEP mode và watchdog, ở PIC thì tại chế độ SLEEP-thì watchdog vẫn chạy, nếu cờ watchdog tràn. CPU sẽ ko bị khởi động lại mà lại chỉ thoát khỏi mode SLEEP thôi. Vậy PSoC có giống PIC ở điểm này ko? Tui thấy PIC rất khoa học ở điểm này, VĐK PSoC ra đời sau chắc cũng có tính kế thừa nên mới hỏi vậy.

                    Mong bác phổ biến kiến thức, để anh em gặp còn biết xử lý. Tui cũng có làm PSoC nhưng chưa dùng đến chức năng đó, nay thấy không khí sôi nổi nên góp chuyện tý

                    Comment


                    • #40
                      Mất 30 phút ngồi post bài cuối cùng không gửi được, mất toi cả công.
                      Đành trả lời bác ngắn gọn thế này vậy(theo những gì tôi biết nhé)
                      Vấn đề 1:
                      Khi CPU ở trạng thái sleep, ta phải cho phép Sleep_Timer ngắt thì nó mới có khả năng đánh thức CPU dậy, còn nếu không nó chỉ hoạt động như một timer bình thường, khác với các Timer khác là 15bit UP_COUNTER Timer, dùng nguồn 32Khz, luôn được Enable
                      CPU khi ở trạng thái SLEEP sẽ chỉ được đánh thức khi có sự kiện ngắt xảy ra (ngắt ở đây bao gồm cả WatchDog Reset, POR, XRESET....). Khi thoát khỏi trạng thái SLEEP,lệnh đầu tiên nó sẽ thực hiện lệnh sẽ là lệnh tiếp theo sau lệnh M8C_Sleep() do lệnh này được Pre_Fetch trước khi lệnh M8C_Sleep() được thực hiện xong, sau đó mới đến chương trình phục vụ ngắt. Đúng là nó chỉ vào trạng thái SLEEP khi gặp lệnh sleep

                      Vấn đề 2:
                      WDT (WatchDog TImer) của PSoC dùng để Reset CPU theo một khoảng thời gian nhất đinh, ở đây thời gian này bằng 3 lần chu kì của Sleep_Timer. Mặc định, sau khi khởi động WatchDog được Disable. Nếu ta enable thì sau khi Sleep_timer đếm tràn 3 lần, ở xung clock tiếp theo sau sự kiện này sẽ có tín hiệu Reset ở đầu ra Terminal Count của WDT, CPU sẽ bị reset và nó được đánh thức chứ không giốngnhư bác nói về PIC, nó chỉ thoát khỏi trạng thái Sleep mà kô bị RESET...
                      Có gì mong các bác chỉ giáo
                      Work is glory

                      Comment


                      • #41
                        Tôi cũng xin góp vui như sau:

                        Mục tiêu của việc thực hiện Sleep là giảm thiểu công suất trung bình của nguồn tới mức có thể (tiết kiệm năng lượng). Psoc có 1 chế độ Sleep và có thể được khởi tạo bằng phần mềm (firmware). Trong trạng thái này, CPU ngừng hoạt động tại 1 câu lệnh biên và các bộ dao động 24/48 MHz, module bộ nhớ Flash và dải điện áp tham chiều bị tắt nguồn (không hoạt động), chỉ còn bộ dao động 32 Khz (trong hoặc ngoài), các khối Psoc lấy xung nhịp từ bộ dao động 32 Khz này và mạch giám sát nguồn là hoạt động.
                        Đối với các khối Psoc tương tự được thiết lập việc tắt nguồn sử dụng phần mềm thì hoàn toàn độc lập trong chế độ này. Các khối tương tự ACB có thể vẫn hoạt động vì chúng không yêu cầu nguồn xung nhịp. Tuy nhiên, các khối ASC, ASD sẽ không hoạt động vì nguồn xung nhịp nội bộ cấp cho chúng bị ngừng hoạt động

                        CPU của Psoc có thể tỉnh dậy (wake up) khi xuất hiện ngắt hoặc sự kiện reset xảy ra. Bộ định thời Sleep (Sleep Timer) có thể cung cấp các ngắt tuần tự để cho phép hệ thống thức dậy, thăm dò ngoại vi hay thực hiện chức năng thời gian thực và sau đó lại nhảy vào trạng thái Sleep. Các ngắt GPIO, ngắt giám sát nguồn, ngắt của các cột tương tự và ngắt của các bộ định thời lấy xung nhịp từ nguồn 32Khz là các ví vụ về ngắt không đồng bộ có thể cũng được sử dụng để đánh thức hệ thống.

                        Trên đây là một số thông tin chung về Sleep. Xin các bác bổ xung thêm, tôi sẽ post tiếp các thông tin khác vào bài sau
                        |

                        Comment


                        • #42
                          Interrupt example here

                          Hope u like it !
                          Attached Files
                          Ở đời khác thường, làm sự nghiệp phi thường...Cùng thì tự tốt lấy ta, đạt thì đem hạnh phúc cho thiên hạ.---(Gia Cát Khổng Minh)

                          Comment


                          • #43
                            help me !!!

                            bác đã làm về bộ timer và counter chưa vậy?
                            nếu bác làm rồi thì có thể chỉ giáo không?
                            có thể cho một test về timer hay counter cũng được
                            mong lắm lắm
                            |

                            Comment


                            • #44
                              bác TheRainMan giúp đỡ heng
                              |

                              Comment


                              • #45
                                buon ghe

                                sao diễn đàn dạo ni bận dữ ha
                                sao không thấy mấy bác nói chi cả
                                buồn ghê?
                                |

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X