![]() |
|
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 |
Đệ tử 3 túi
Tham gia ngày: Dec 2006
Bài gửi: 60
: |
timer của PIC18
mình muốn dùng timer1 để tạo ra xung 1ms , chip mình dùng là PIC18F2620, dùng thạch anh 8Hmz
OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_INT & T1_PS_1_8 & T1_OSC1EN_OFF); //タイマ1の設定,8ビットモード,割込 使用 ////////////////////// void isr_low_handler(void) { if(PIR1bits.TMR1IF){ // タイマ1割り込み? PIR1bits.TMR1IF=0; // タイマ1割り込みフラグを0にする if(--cnt1 <=0){ cnt1=10; LATAbits.LATA4=!LATAbits.LATA4; } Nhưng kết quả không ra như ý muốn, thời gian dài hơn và không chính xác. Mong chỉ giùm mình cách tính với. |
![]() |
![]() |
![]() |
#2 | |
Trưởng lão PIC bang
|
Trích:
Tôi sẽ đặt lệnh giảm biến cnt1 ra bên ngoài lệnh if trong đoạn code trên. 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 |
|
![]() |
![]() |
![]() |
#3 |
Đệ tử 3 túi
Tham gia ngày: Dec 2006
Bài gửi: 60
: |
bỏ biến cnt1 đi.
lẽ ra với setup như vậy, mình hi vọng time là 0.5*256*8=1024 micro second. Nhưng đo bằng máy thì thấy khoảng 30 mili giây. Dùng timer0 thì kết quả chính xác. OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_8); //タイマ1の設定,8ビットモード,割込 使用 |
![]() |
![]() |
![]() |
#4 |
Đệ tử 3 túi
Tham gia ngày: Dec 2006
Bài gửi: 60
: |
Đã test và kết quả như sau:
Nếu tạo file isr.c riêng, đặt tất cả các khai báo interrupt vào đấy thì Timer1 chạy đúng. Ngược lại, copy những dòng lệnh interrupt đã chạy đúng vào chỉ 1 file main.c thì -Timer0 chạy đúng -Timer1, cho dù set biến TMR1L hay WriteTimer1(i) thế nào đi nữa thì nó vẫn chạy như không hề được set TMR1L Xin cho hỏi nguyên nhân và giải pháp ạ. |
![]() |
![]() |
![]() |
#5 |
Đệ tử 3 túi
Tham gia ngày: Dec 2006
Bài gửi: 60
: |
giúp em với ạ.
|
![]() |
![]() |
![]() |
#6 |
Trưởng lão PIC bang
|
Tôi khởi tạo Timer 1 như thế này:
Code:
//Timer 1 initialisation void Init_TMR1(void) { T1CON = 0xB0; //Timer 1 is a 16-bit timer, 1:8 prescale TMR1H = 0xFF; //Count number for 1 ms period @ 8 MHz clock TMR1L = 0x06; PIR1bits.TMR1IF = 0; //Clear TMR1 interrupt flag IPR1bits.TMR1IP = 0; PIE1bits.TMR1IE = 1; //Enable TMR1 interrupt T1CONbits.TMR1ON = 1; //Turn Timer 1 on } Code:
if (PIR1bits.TMR1IF == 1) { PIE1bits.TMR1IE = 0; TMR1H = 0xFF; //Count number for 1 ms period @ 8MHz clock TMR1L = 0x06; flag2 |= 1; PIE1bits.TMR1IE = 1; PIR1bits.TMR1IF = 0; } 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 |
![]() |
![]() |
![]() |
#7 |
Đệ tử 3 túi
Tham gia ngày: Dec 2006
Bài gửi: 60
: |
em làm được rồi ạ. Cám ơn dòng code của anh.
|
![]() |
![]() |
![]() |
|
|