PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

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

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 27-09-2007, 03:13 PM   #1
littlephoc
Đệ 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.
littlephoc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-09-2007, 10:32 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
Trích:
Nguyên văn bởi littlephoc View Post
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.
Bạn đang dùng C18 phải không? Thời gian dài hơn ở mức độ nào, 1 vài chu kỳ xung clock hay gấp đôi, gấp ba thời gian mong muốn?

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-10-2007, 09:50 AM   #3
littlephoc
Đệ 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ビットモード,割込 使用
littlephoc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2007, 02:18 AM   #4
littlephoc
Đệ 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 ạ.
littlephoc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2007, 12:33 PM   #5
littlephoc
Đệ tử 3 túi
 
Tham gia ngày: Dec 2006
Bài gửi: 60
:
giúp em với ạ.
littlephoc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2007, 05:23 PM   #6
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
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
}
Đoạn code xử lý ngắt như sau:
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;
	}
Tất cả code chỉ nằm trong 1 tập tin (có chứa main và các chương trình con, chương trình xử lý ngắt khác). Mọi sự diễn ra bình thường, cờ flag2 bị đổi trạng thái mỗi 1 ms, với tần số clock là 8 MHz (thử bằng phần cứng, đo thời gian bằng DSO).

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 13-11-2007, 02:14 AM   #7
littlephoc
Đệ 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.
littlephoc 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à 08:34 AM.


Đượ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