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)
-   -   Lấy số liệu sau khi có ngắt ngoài (http://www.picvietnam.com/forum/showthread.php?t=5989)

vanlv 23-03-2010 02:34 PM

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;

}


}

vanlv 31-03-2010 09:30 PM

hic, chẳng có ai góp ý với tui thế này.

greenfield 31-03-2010 09:34 PM

Ý là bạn muốn đếm xung theo thời gian định trước hả?

vanlv 31-03-2010 10:40 PM

Ý 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.

greenfield 31-03-2010 11:02 PM

À 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.

tungbka 01-06-2010 12:29 AM

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.

Mr.Bi 02-06-2010 12:48 AM

Trích:

Nguyên văn bởi vanlv (Post 34629)
Ý 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


Múi giờ GMT. Hiện tại là 03:17 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam