PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Những câu hỏi thường gặp (http://www.picvietnam.com/forum/forumdisplay.php?f=54)
-   -   Mong mọi người giúp đỡ ! (http://www.picvietnam.com/forum/showthread.php?t=2917)

kyo 12-10-2008 11:06 AM

Mong mọi người giúp đỡ !
 
Nhờ mọi người xem chương trình này mình viết tại sao ko chạy được. Mình sử dụng timer0 để tạo thời gian delay bật tắt các led gắn vào portb của pic 16f877a, nhưng ko hiểu sao ko chạy được.
Chương trình như sau:

Code:

#include <16f877a.h>
#fuses nowdt,noprotect,put,xt
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#int_timer0
void ngat_tm0(void)
    {
          portb=0xff;
    }
void main()
    {
            set_tris_b(0);
            enable_interrupts(global);
            enable_interrupts(int_timer0);
            set_timer0(250);
            setup_timer_0(rtcc_internal|rtcc_div_8);
            while(1)
                  {
                        portb=0x00;
                  }
      }


namqn 12-10-2008 07:05 PM

PIC đang thực hiện đúng những gì bạn viết. Khi có ngắt Timer0, nó xuất 0xFF ra port B. Khi trở về từ ngắt, lệnh xuất 0x00 ra port B được thực hiện.

Thời gian PIC xử lý ngắt Timer0 rất ngắn, do đó bạn sẽ rất khó phát hiện giá trị 0xFF được xuất ra port B (dựa vào độ sáng của các LED nối vào port B).

Thân,

kyo 12-10-2008 08:06 PM

Cám ơn anh namqn đã trả lời. Em sẽ xem lại chương trình.

kyo 12-10-2008 08:51 PM

Trích:

Nguyên văn bởi namqn (Post 19526)
PIC đang thực hiện đúng những gì bạn viết. Khi có ngắt Timer0, nó xuất 0xFF ra port B. Khi trở về từ ngắt, lệnh xuất 0x00 ra port B được thực hiện.

Thời gian PIC xử lý ngắt Timer0 rất ngắn, do đó bạn sẽ rất khó phát hiện giá trị 0xFF được xuất ra port B (dựa vào độ sáng của các LED nối vào port B).

Thân,

Nhờ anh và mọi người giúp lần nữa. Em đã viết lại chương trình, chọn bộ chia tần số cho timer0 là 1:256 và sử dung thêm 1 biến đếm count. Em dùng thạch anh 4Mhz, như vậy giá trị thanh ghi TMR0 tăng lên 1 đơn vị sau( 1us x 256 = )256us, thanh ghi TMR0 bị tràn sau (250 x 256 = 64000us = ) 64ms.Biến count sẽ đếm từ 0 đến 5. Như vây, theo em tính thì các led ở portB sẽ sang tắt sau mỗi 5 x 64 = 320ms. Vậy mà chương trình vẫn không chạy. Mong anh và mọi người giúp em lần nữa.
Code:

#include <16f877a.h>
#fuses nowdt,noprotect,put,xt
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
int8 count=0;
#int_timer0
void ngat_tm0(void)
  {
      count++;
      if(count==5)
          {
                count=0;
                portb=0xff;
          }
  }
void main()
  {
      set_tris_b(0);
      enable_interrupts(global);
      enable_interrupts(int_timer0);
      set_timer0(250);
      setup_timer_0(rtcc_internal|rtcc_div_256);
      while(1)
            {
                portb=0x00;
            }
  }


namqn 12-10-2008 09:53 PM

Chương trình của bạn vẫn chạy đúng theo những gì bạn viết. Nó vẫn bật các LED ở port B sau một khoảng thời gian chờ, nhưng thời gian LED được bật rất ngắn (vì khi trở về từ ngắt thì lệnh portB = 0x00 ở vòng lặp while (1) của bạn lại xóa port B).

Bạn chưa hiểu được cách thức chương trình của bạn đang chạy. Bạn thử sửa như sau nhé:

- Bỏ lệnh portb = 0x00 ở vòng lặp while (1)
- Trong chương trình xử lý ngắt, thay lệnh portb = 0xFF thành portb = portb ^ 0xFF;

Thân,

kyo 12-10-2008 11:29 PM

Trích:

Nguyên văn bởi namqn (Post 19532)
Chương trình của bạn vẫn chạy đúng theo những gì bạn viết. Nó vẫn bật các LED ở port B sau một khoảng thời gian chờ, nhưng thời gian LED được bật rất ngắn (vì khi trở về từ ngắt thì lệnh portB = 0x00 ở vòng lặp while (1) của bạn lại xóa port B).

Bạn chưa hiểu được cách thức chương trình của bạn đang chạy. Bạn thử sửa như sau nhé:

- Bỏ lệnh portb = 0x00 ở vòng lặp while (1)
- Trong chương trình xử lý ngắt, thay lệnh portb = 0xFF thành portb = portb ^ 0xFF;

Thân,

Cảm ơn anh rất nhiều. Giờ em đã hiểu rồi. Do thời gian bật led quá ngắn nên không thấy được.Cảm ơn anh.


Múi giờ GMT. Hiện tại là 10:10 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam