![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Nov 2008
Bài gửi: 5
: |
Trích:
Nguyên văn bởi lequocbao View Post Vậy là muốn sử dụng timer0 thì mình chỉ cần: setup_TIMER_2(mode, period, postscale); khi gặp câu lệnh: set_TIMER2(value); là timer 0 sẽ bắt đầu đếm phải không bạn? Cho mình hỏi luôn là mình sử dụng thạch anh 4Mhz mà muốn tính số lần ngắt trên 1s thì mình phải tính như thế nào?(mục đích là mình muốn khi kích hoạt timer0 sau 1s thì mình sẽ làm việc khác đó mà!) Mình có tham khảo trong mục help(mình sử dụng ccs c) thì với thạch anh 20Mhz thì số lần ngắt trên 1s là 76 nhưng mình không hiểu lắm về cách tính ra con số 76.Đại khái là: 20000000/(4*256*256) =76 ngắt 1s #include <16F877A.h> #device 18F4680*=16 ADC=10 #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #use fast_io(c) #byte portc=0x07 int16 count; int8 a; //Chuong trinh ngat TMR0 #int_timer0 void timer0() { set_timer0(56); // T = 2*(256 - 56)*1us = 400us (nếu dùng thạch anh 20M thi thay 1us thành 0,2us) ++count; if(count == 2500) // 2500*400us = 1000000us = 1s { count=0; rotate_left(&a,1); } } //Chuong trinh dich led void main() { set_tris_c(0); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); enable_interrupts(global); a = 0x01; while(true) { portc = a; } } tungtot_vl vẫn chưa có mặt trong diễn đàn NHƯ VẬY CON SỐ 2 Ở (T=2*(256-56)*1US)Ơ ĐÂU RA VẬY |
![]() |
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Jan 2008
Bài gửi: 4
: |
![]() delay 1s dùng thạch anh 4Mhz
Code:
#INCLUDE<16F877A.H> #INCLUDE<DEF_16F877A.H> #USE DELAY(CLOCK=4000000) #INT8 H; #INT_TIMER1 VOID NGAT_TIMER1() { SET_TIMER1(15536); H++; IF(H==20) //20*50000us = 1000000us = 1s { lệnh; H=0; } } void main() { SETUP_TIMER_1(T1_INTERNAL); ENABLE_INTERRUPTS(GLOBAL); ENABLE_INTERRUPTS(INT_TIMER1); SET_TIMER1(15536); //T_dinhthoi = (65536-15536)*1us = 50000us while(1) { lệnh; } } thay đổi nội dung bởi: namqn, 09-12-2008 lúc 08:03 PM. |
![]() |
![]() |
![]() |
#3 |
Đệ tử 6 túi
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
: |
Tại sao mình phải set_timer1(15536); tới 02 lần luôn vậy bạn?
Còn nữa ,nếu mình muốn dừng ngắt thì phải dùng khai báo: disable_interrupt(global); phải không?nếu đúng thì mình phải đặt khai báo đó ở chổ nào? |
![]() |
![]() |
![]() |
#4 | |
Đệ tử 2 túi
|
![]() Trích:
1. Vì sao phải set_timer1(15536); tới 02 lần ? set_timer1(15536); trong hàm void main(void) là để tính thời gian bắt đầu đếm của Timer0 . Còn set_timer1(15536); trong hàm void interrupt_timer0() thì sau khi tính giá trị xong thì nó sẽ gán giá trị của set_timer1(15536); vào hàm này. 2. Khai báo disable_interrupt(global); được hiểu là cấm ngắt . Còn đặt ở đâu thì bạn tham khỏa trong đoạn Code sau: Code:
#include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #byte PORTB = 0x06 int16 count; int8 a; //Chuong trinh ngat TMR0 #int_timer0 void interrupt_timer0() { set_timer0(6); ++count; if(count == 2000) // 2000*500us = 500000us = 1s { count=0; rotate_left(&a,1); } } //Chuong trinh chinh void main(void) { set_tris_b(0); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); // so 2 la o cho T_dinhthi=2*(256-6)*1us = 500 us enable_interrupts(global); set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us a = 0x01; disable_interrupts(global); while(true) { PORTB = a; } } |
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
pic
NHƯ VẬY CON SỐ 2 Ở (T=2*(256-56)*1US)Ơ ĐÂU RA VẬY[/QUOTE]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); |
![]() |
![]() |
![]() |
#6 |
Đệ tử 6 túi
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
: |
Pác tungtot_vl ơi!: pác coi hộ lại giúp cái ngắt timer0 1s của pác sao mà khi mở nguồn thì khoảng 30s sau ngắt mới làm việc vậy pác.Sau khi ngắt đã làm việc thì nhấn reset thì ngắt làm việc lại liền còn cúp nguốn thì chịu khó đợi 30s nữa.Vậy là nó bị trục trặc chổ nào phải không pác?
|
![]() |
![]() |
![]() |
#7 |
Nhập môn đệ tử
Tham gia ngày: Nov 2008
Bài gửi: 2
: |
các pro xem giúp em cái code này với .mạch đồng hồ , hh:mm:ss , dùng ngắt timer0 nhưng không hiểu tại sao lại không xảy ra ngắt . code nè :
Code:
#include<16f877a.h> #include<def_877a.h> #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #device *=16 ADC=8 #use delay(clock=20000000) int16 count; int8 h10,h1,m10,m1,s10,s1,i;//khai bao bien gio,phut,giay #int_TIMER0 void timer0() { set_timer0(6); ++count; if(count==5000) { ++s1; if(s1==9){ s1=0; ++s10; if(s10==5) { s10=0; ++m1; if(m1==9){ ++m10; m1=0; if(m10==5){ m10=0; ++h1; if(h1==2){h1=0; ++h10; if(h10==1){h10=0;} } } } } } count=0; } } void main() { trisd=0x00; trise=0x00; s1=0; s10=0; m1=0; m10=0; h1=0; h10=0; enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); enable_interrupts(global); while(1) { i=0; for(i=0;i<=5;i++) { porte=i; switch(i) { case 0: portd=h10;break; case 1: portd=h1;break; case 2: portd=m10;break; case 3: portd=m1;break; case 4: portd=s10;break; case 5: portd=s1;break; } } } } thay đổi nội dung bởi: namqn, 18-12-2008 lúc 05:59 PM. |
![]() |
![]() |
![]() |
#8 | |
Đệ tử 2 túi
|
Trích:
|
|
![]() |
![]() |
![]() |
|
|