PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   đếm ngoài dùng timer0 (http://www.picvietnam.com/forum/showthread.php?t=4260)

p2009kc 09-06-2009 10:46 PM

đếm ngoài dùng timer0
 
Em mới n/cứu về PIC, khi viết c.trình dùng timer để đếm nhưng không được, em cũng không biết code sai ở đâu nữa. Các bác chỉ giúp em với, các bác thông cảm em vẫn còn gà lắm.
Code em viết như sau:
Code:

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06
int8 leds;

#int_timer0
void interrupt_timer0()
{
  set_timer0(0);
  ++leds;
  if(leds == 255)
      {
        leds=1;
      }
}

void main(void)
{      enable_interrupts(global);
        enable_interrupts(int_timer0);
        setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);
        set_timer0(0); 
        leds=1;
        while (1)
            {
              PORTB=leds;
            }
}

Mạch điện có 8 leds đấu vào cổng B, xung 1Hz bên ngoài đưa vào RA4.

Mr.Bi 10-06-2009 09:02 AM

u nhầm oy , khai báo trên của u là timer0 làm bộ counter . Có phải í u là
+ vô ngắt timer0 thì biến leds tăng
+ ra hàm chính sẽ lấy giá trị leds đó xuất ra PORTB ?
Nếu vậy thì phải khai báo lại chỗ này setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);

phamhoangthong 10-06-2009 11:54 AM

u sai chổ này nè ! biến led của em chỉ tăng sau 256 second ! Có phải khi có 1 clock vào thì giá trị bộ counter của timer0 tăng lên 1. Nhưng khi giá trị bộ counter là 256 thì interrupt_timer mới thực hiện => portB tăng theo chu kỳ 1/256 Hz

p2009kc 10-06-2009 02:08 PM

Cám ơn bác Mr.Bi và bác phamhoangthong nhưng em sửa vẫn không được. Ý của em như bác Mr.Bi đã nói nhưng bác bảo sửa setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2); thành gì? Còn như bác phamhoangthong nói vậy thì sau 256 second thì led phải sáng nhưng ở đây không thấy gì các bác ạ.
Các bác giúp em nhé vì em thực hiện trên cả mô phỏng và mạch đều không được.

lequocbao 10-06-2009 07:32 PM

xung 1hz thì cần gì phải dùng tới timer0 hả bạn?dùng đại chân io bình thường là tốt rùi!

bạn thử thêm:
set_tris_a(0xff);
set_tris_b(0x00); thử coi.
set_timer_0(0); xung vào *2 vậy là có 128 xung 1hz (tương đương 128s)vào chân ra4 thì xảy ra ngắt.

còn không được thì bỏ quách thằng |RTCC_DIV_2 đi(hình như là dùng ở chế độ counter không có tiết mục này).
bạn muốn cứ có 1 xung thì xảy ra ngắt thì bạn phải set_timer_0(255); chứ bạn!

p2009kc 11-06-2009 12:02 AM

Cám ơn bác lequocbao nhiều, em đã làm được rồi, nguyên do đúng như bác, nói do em thiếu: set_tris_a(0xff); set_tris_b(0x00); phải set_timer_0(255); để đúng 1 second thì phải set_timer_0(255);
Trước đó em đã thử ngắt trên R0 thì đã OK rồi.

p2009kc 11-06-2009 12:03 AM

Cám ơn bác lequocbao nhiều, em đã làm được rồi, nguyên do đúng như bác nói do em thiếu: set_tris_a(0xff); set_tris_b(0x00); phải set_timer_0(255); để đúng 1 second thì phải set_timer_0(255);
Trước đó em đã thử ngắt trên R0 thì đã OK rồi.


Múi giờ GMT. Hiện tại là 03:02 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