PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC > Những câu hỏi thường gặp

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Những câu hỏi thường gặp Những lỗi cơ bản thường gặp khi làm việc với PIC hoặc những vấn đề cơ bản nhất thường được hỏi trong những năm qua

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 12-10-2008, 08:51 PM   #1
kyo
Đệ tử 1 túi
 
Tham gia ngày: Feb 2008
Bài gửi: 13
:
Unhappy

Trích:
Nguyên văn bởi namqn View Post
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;
            }
   }

thay đổi nội dung bởi: namqn, 12-10-2008 lúc 09:49 PM.
kyo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-10-2008, 09:53 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-10-2008, 11:29 PM   #3
kyo
Đệ tử 1 túi
 
Tham gia ngày: Feb 2008
Bài gửi: 13
:
Smile

Trích:
Nguyên văn bởi namqn View Post
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.
kyo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam