PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT 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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 23-03-2010, 02:34 PM   #1
vanlv
Đệ tử 1 túi
 
Tham gia ngày: Oct 2009
Bài gửi: 25
:
Talking Lấy số liệu sau khi có ngắt ngoài

Mình mới học về PIC, đã thử đưa xung vào để test ngắt INT_EXT được rồi. Giờ còn thuật toán là đếm bằng timer1 và khi có xung sườn âm thì sẽ xảy ra ngắt ngoài rồi lấy số đếm đó gửi ra máy tính và cho đếm tiếp. Các anh, các bạn có thể gợi ý giúp mình thuật toán đó không. Mình dùng ccs, đây là code của mình đã viết và sơ đồ nguyên lý.
http://www.mediafire.com/?ojrlbntwnyn

#include "G:\Electronics\CCS C\Cac bai thuc hanh tu lam\Easiest\v2.h"
#include <def_877a.h>
//#include <math.h>
//#include <ctype.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOLVP //XT: thach anh <= 4MHz
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD

//void delay(int16 N); // Khai bao ham delay
//void tre_ms(unsigned int time);

int16 i=0,second=0,tseconds=0,tpreset=10;
unsigned int16 value;
//char c;
/////////////////////////////////
/*
void delay(int16 N)
{
int16 j=0,i=0;
for(i=0;i<=200;i++)
if(j<N)j++;
}*/

/////////////////////////////////
#INT_TIMER0
void time()
{
i++;
if(i>=2000){second++; i =0; tseconds++;}
if(tseconds>=tpreset){tseconds=0; value = get_timer1(); set_timer1(0); }

}
/////////////////////////////////


#INT_EXT
void get_data()
{
printf("ok"); //test khi có ngat se in ra man hinh

}

/////////////////////////////////


void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_DIV_2|RTCC_INTERNAL); //Timer0 lam bo dem thoi gian
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); //Timer1 dem xung ngoai (lay tu dau ghi)
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(GLOBAL); //Khoi tao cho ngat toan cuc
enable_interrupts(INT_TIMER0); //Khoi tao cho ngat timer0
enable_interrupts(INT_TIMER1); //Khoi tao cho ngat timer1
enable_interrupts(INT_EXT); //Khoi tao cho ngat ngoai
ext_int_edge(H_TO_L); //Chon suon am de xay ra ngat ngoai

/*
lcd_init();
lcd_putcmd(0x01);
lcd_putcmd(0x80);
printf(LCD_putchar,"OK");
lcd_putcmd(0xC0);
printf(LCD_putchar,"Hello");
*/

// TODO: USER CODE!!
set_timer0(5);
tpreset=10;
TRISB=0XFF;
TRISC=0x00;
PORTC=0XFF;
//i =0;
while(TRUE)
{
//value=get_timer1();
delay_ms(50); //Thoi gian tre la 50ms
printf("%5ld %5ld \n",second,value);
PORTC=0;

}


}

thay đổi nội dung bởi: vanlv, 23-03-2010 lúc 02:38 PM. Lý do: Không up được file
vanlv vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2010, 09:30 PM   #2
vanlv
Đệ tử 1 túi
 
Tham gia ngày: Oct 2009
Bài gửi: 25
:
hic, chẳng có ai góp ý với tui thế này.
vanlv vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2010, 09:34 PM   #3
greenfield
Đệ tử 6 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 152
:
Ý là bạn muốn đếm xung theo thời gian định trước hả?
greenfield vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2010, 10:40 PM   #4
vanlv
Đệ tử 1 túi
 
Tham gia ngày: Oct 2009
Bài gửi: 25
:
Ý mình không phải vậy. Ý mình là: giả sử khi bắt đầu có xung thì timer1 sẽ đếm và đến khi bắt đầu đến sườn âm sẽ làm ngắt con PIC và khi ngắt xảy ra thì PIC làm nhiệm vụ lấy số đếm đó truyền ra máy tính và hiển thị lcd. Sau khi gửi số liệu ra máy tính thì PIC ra lệnh start để đếm xung tiếp đó. Mình mới chỉ biết gửi ra máy tính 1 chuỗi sau khi có ngắt ngoài còn số liệu sau khi get_timer1 thì vẫn chưa biết.
vanlv vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2010, 11:02 PM   #5
greenfield
Đệ tử 6 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 152
:
À hóa ra vậy mà ứng dụng của bạn cũng lạ thiệt. Mình tưởng bạn muốn đếm xung như của encorder để xác định tốc độ thì mình giúp bạn được.hihi Hi vọng ai đó làm về cái này rồi giúp bạn.
greenfield vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-06-2010, 12:29 AM   #6
tungbka
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Mình chưa hiểu rõ lắm, bạn muốn đếm số xung sau 1 khoảng thời gian cố định hay bạn muốn tính toán khoảng thời gian giữa 2 xung?
- Nếu đếm số xung thì giống như bài toàn xác định tốc độ động cơ, trên diễn đàn có rất nhiều code về cái này.
- Còn nếu tính toán khoảng thời gian giữa 2 xung thì mình nghĩ cũng không khó, nó chỉ là ngược lại của việc đếm số xung trong 1 khoảng thời gian mà thôi.
tungbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2010, 12:48 AM   #7
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi vanlv View Post
Ý mình không phải vậy. Ý mình là: giả sử khi bắt đầu có xung thì timer1 sẽ đếm và đến khi bắt đầu đến sườn âm sẽ làm ngắt con PIC và khi ngắt xảy ra thì PIC làm nhiệm vụ lấy số đếm đó truyền ra máy tính và hiển thị lcd. Sau khi gửi số liệu ra máy tính thì PIC ra lệnh start để đếm xung tiếp đó. Mình mới chỉ biết gửi ra máy tính 1 chuỗi sau khi có ngắt ngoài còn số liệu sau khi get_timer1 thì vẫn chưa biết.
đầu từ có tốc độ xung quá nhanh ==> mỗi xung cách nhau thời gian ngắn thì liệu rằng việc hiển thị ra LCD + truyền lên PC có update kịp k ?

t hỉu í u là đang đo lấy thời gian giữa 2 xung . nếu t k nhầm thì đây chính là tính toán để làm led quay ma trận 1 cột (Propeller) . U nên làm thế này :
- Dùng chân timer0 nhận ngắt ngoài . Vô hàm ngắt ngoài , nếu lần ngắt đầu tiên thì cho biến c=1 , lần ngắt thứ 2 thì cho biến c=2 (nên dùng hàm switch() case )
- trong hàm main , nếu biến c=1 thì cho 1 biến d++ . Biến d cứ tăng đến khi nào c=2 thì dừng (có lẽ biến d nên là int16 hoặc là int32) .
- sau khi c=2 . Cho cấm ngắt ngoài , sử lí : truyền PC, gửi ra LCD , xóa biến d , xóa biến c , delay_1s để nhìn thấy giá trị . Chạy lại chưong trình

Vì rằng gia tốc của động cơ gần như k đổi nên cách này mới chạy đc . Chưong trình của u dùng quá nhìu hàm có sẵn (có lẽ chưa hiểu ngọn ngành nó hoạt động ra sao mới dùng hàm có sẵn
Trích:
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_DIV_2|RTCC_INTERNAL); //Timer0 lam bo dem thoi gian
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); //Timer1 dem xung ngoai (lay tu dau ghi)
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(GLOBAL); //Khoi tao cho ngat toan cuc
enable_interrupts(INT_TIMER0); //Khoi tao cho ngat timer0
enable_interrupts(INT_TIMER1); //Khoi tao cho ngat timer1
enable_interrupts(INT_EXT); //Khoi tao cho ngat ngoai
ext_int_edge(H_TO_L); //Chon suon am de xay ra ngat ngoai
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Tags
ngắt, số liệu


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:28 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