Thông báo

Collapse
No announcement yet.

Hỏi về ngắt Timer2 cho PIC 16F877A

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

  • Hỏi về ngắt Timer2 cho PIC 16F877A

    TÌnh trạng của mình là Build được nhưng có Warning là : Interrup không được gọi.. (do đó hàm trong Interup không chạy ):
    #int_TIMER2
    void TIMER2_isr(void)
    {
    a++;
    if (a==60)
    {
    a=0;
    while(kbhit())
    {
    ch = getch();
    if(ch=='s')
    {
    gets(string);
    t = atof(string);
    break;
    }
    }
    printf("T(Od): %2.2foC \33",t);
    printf(" T(ph): %2.2foC\n\r",temp);
    }
    }
    Khi mình bỏ phần Code Interrup này đi thì chương trình không báo lỗi gì nữa.
    bạn nào rành về Interrup chỉ dùm mình với. các khai báo trong hàm main mình đã khai báo đầy đủ

  • #2
    Trong hàm ngắt thì chỉ nên để các cờ nhớ, các biến để lưu kết quả tức thời ... Nếu không khi xử lý 1 đống công việc trong đó nó nhảy vào ngắt liên tục thành đệ qui gây treo chip không chạy được nữa ( cái này là cơ bản, thằng nào học Vi điều khiển người ta đều dạy phổ cập cho cái này ).

    --- Nếu muốn làm cả chương trình trong hàm ngắt thì thử disable ngắt timer ở trong hàm ngắt xem có khá hơn không, chạy xong chương trình rồi lại enable ngắt timer lại.
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      bác hài vãi. em thì lại toàn đi mò mẫm chứ không phải dân điện tử. để em xem lại xem.

      Comment


      • #4
        Việc Buid và run là 2 việc khác nhau, buid được chưa chắc chạy được. Bạn xem lại có en timer 2, en global hoặc setup timer 2 chưa. Hơn nữa, trong ngắt có gọi hàm "kbhit()", k cần biết nó là gì, bạn phải đặt vị trí hàm này phía trên hàm ngắt. Hay nói cách khác, bạn phải đặt vị trí hàm được gọi phía trên hàm gọi.

        Comment


        • #5
          bây giờ mình thay ngắt timer2 bằng ngắt RDA. code ntn:
          int r=0;
          char c[];
          #int_RDA
          void RDA_isr(void)

          {
          c= getch();
          if (c=='s') r =1;
          }
          void main()
          {
          //khai bao va khoi tao cau hinh cho vi xu ly
          float tem,t=20;
          unsigned char str[20],string[];
          setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
          setup_timer_1(T1_DISABLED);
          setup_timer_2(T2_DIV_BY_16,195,16);
          setup_comparator(NC_NC_NC_NC);
          setup_vref(FALSE);
          enable_interrupts(INT_RDA);
          enable_interrupts(INT_TIMER2);
          enable_interrupts(INT_TIMER0);
          enable_interrupts(global);
          while(true)
          {
          if(r)
          {
          r=0;
          gets(string);
          t = atof(string);
          }
          tem = read_tem();
          sprintf(str,"NhietDo=%3.1fC",tem);
          lcd_put(str);
          delay_ms(200);
          lcd_clear();
          printf("T(Od): %2.2foC \33",t);
          printf(" T(ph): %2.2foC\n\r",tem);
          }
          }
          hàm ngắt chỉ nhận cờ để thực hiện hàm trong main. không thấy cảnh báo gì nữa nhưng nạp vào thì không chạy một phần nào. kể hiển thị LCD lẫn PC, cũng không thể nhận giá trị mà PC xuống (khi mình không dùng ngắt thì hiển thị giá trị nhiệt độ lên PC và LCD là ngon lành)

          Comment


          • #6
            mình mới sửa lại đoạn code , bỏ hết các ngắt ngoại trừ ngắt RDA, thấy hiể thị được nhưng không sao nhận được dữ liệu từ PC xuống??

            Comment


            • #7
              Nguyên văn bởi lyxa_bk Xem bài viết
              mình mới sửa lại đoạn code , bỏ hết các ngắt ngoại trừ ngắt RDA, thấy hiể thị được nhưng không sao nhận được dữ liệu từ PC xuống??
              Hiểu rồi. Bạn kích hoạt 2 ngắt timer -> chồng chéo lẫn nhau -> xử lý ngắt liên tục. Giải pháp: bạn dùng 1 ngắt timer0 (hoặc timer2) thôi + 1 biến đếm. Theo setup của bạn thì timer2 lâu hơn của timer0, khi biến đếm đạt giá trị (theo giá trị mà bạn set cho timer 2) thì phất cờ làm công việc của timer 2. Ngoài ra, bạn kiểm tra trong datacheet xem timer nào dùng cho truyền thông nối tiếp thì đừng đụng đến nó.
              Thân

              Comment


              • #8
                mình hiểu. nhưng giờ mình đang mắc cái nhận dữ liệu từ PC xuống? không tài nào nhận được. ngắt hình như không hoạt động
                #int_TIMER2
                void TIMER2_isr()
                {
                t++; if (t==200) {t=0; r=1;}
                }
                void main()
                {
                setup_timer_2(T2_DIV_BY_16,195,16);
                enable_interrupts(INT_TIMER2);
                enable_interrupts(global);
                a=20;
                while(true)
                {
                tem = read_tem();
                printf("T(Od): %2.2foC \33",a);
                printf(" T(ph): %2.2foC\n\r",tem);
                delay_ms(100)
                if(r)
                {
                r=0;
                while(kbhit())
                {
                ch = getch();// đợi nhận kí tự từ PC
                if(ch=='s')
                {
                gets(string);
                a = atof(string);
                }
                }
                }
                }
                }

                Comment


                • #9
                  Cái căn bản của truyền thông là set cấu hình cho đúng, tốc độ, số lượng bit truyền. Để gỡ cái này, bạn tạm khóa mấy cái truyền nhận đó lại. Đầu tiền truyền 1 ký tự cố định từ PC xuống rồi hiển thị ra LCD xem. Hơn nữa, lưu ý PC là truyền RS232, nên VXL cần có 1 card chuyển UART sang RS232, nếu tất cả đúng rồi thì xem lại các chân TX,RX kết nối đúng chưa.Nêsu các điều này OK hết thì đảm bảo bạn k thể k chạy.

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X