PDA

View Full Version : Capture Mode


nguyen.geo
23-05-2007, 02:49 PM
; PIC16F877A HOAT DONG O CHE DO CAPTURE MODE
;
WAIT EQU 0x22
WAIT1 EQU 0x23
WAIT2 EQU 0x24
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF
org 0x000
CLRF STATUS
; DOAN CHUONG TRINH KHOI TAO CHO CAPTURE MODE
BSF STATUS,RP0
BSF TRISC,2 ; RC2 IN-PUT CHON CHAN RC2 LAM CHAN DUA XUNG VAO
CLRF TRISB
BCF STATUS,RP0
CLRF CCP1CON ; KHOI TAO CHO CHE DO CAPTURE MODE
MOVLW .4 ; NAP GIA TRI TRUYEN VAO THANH GHI CCP1CON
MOVWF CCP1CON ; CHI KIEM TRA SUON XUNG XUONG

CLRF T1CON ; KHOI DONG CHO TIMER1
BSF T1CON,TMR1ON
Loop
CLRF CCPR1H ; XOA THANH GHI CCPR1
CLRF CCPR1L
BCF PIR1,CCP1IF ; XOA CO NGAT DE TIEP TUC.
NOP
BTFSS PIR1,CCP1IF ; DOI CCP1IF SET LEN 1
GOTO $-1
MOVF CCPR1H,0 ; DOC GIA TRI TU THANH GHI CCPR1L
MOVWF PORTB ; HIEN THI RA PORTB
CALL DELAY
MOVF CCPR1L,0 ; DOC GIA TRI TU THANH GHI CCPR1L
MOVWF PORTB ; HIEN THI RA PORTB
CALL DELAY
GOTO Loop ; LAP VO THOI HAN

DELAY ; DOAN CHUONG TRINH TAO THOI GIAN TRE
MOVLW .250
MOVWF WAIT
D1
MOVLW .250
MOVWF WAIT1
D2
MOVLW .250
MOVWF WAIT2
DECFSZ WAIT2,1
GOTO $-1
DECFSZ WAIT1,1
GOTO D2
DECFSZ WAIT,1
GOTO D1
RETURN
END


Em da thu phat xung vao chan RC2 tan so la 10KHz.nhung no khong chay va khong hieu la no sai o cho nao. cac anh giup em voi.

namqn
23-05-2007, 08:46 PM
Bạn nên cho biết bạn muốn làm gì với đoạn code này.

Tốt nhất bạn mô tả bài toán, sau đó là các thao tác cần thiết (theo bạn), rồi mới đến code. Từ đó sẽ dễ dàng đối chiếu code của bạn với các thao tác, cũng như kiểm tra các thao tác dựa vào datasheet.

Bạn chỉ đưa đoạn code lên thì sẽ rất khó cho người đọc. Theo tôi thì bạn viết code không tốt, bạn đang phát xung 10 kHz, nghĩa là sẽ có sự kiện được capture mỗi 100 us (bạn thiết lập để capture mỗi cạnh xuống tại RC2), trong khi đó vòng lặp của bạn lại có đến 2 lần delay với thời gian không dưới 100 us mỗi lần, như vậy sẽ xảy ra sự kiện tiếp theo trước khi bạn đọc giá trị CCPR1L, và CCPR1L sẽ bị ghi đè bởi giá trị mới. Bạn phát biểu rằng 'nó không chạy', nhưng theo bạn như thế nào là 'không chạy'?

Thân,

nguyen.geo
24-05-2007, 11:54 AM
Bạn nên cho biết bạn muốn làm gì với đoạn code này.

Tốt nhất bạn mô tả bài toán, sau đó là các thao tác cần thiết (theo bạn), rồi mới đến code. Từ đó sẽ dễ dàng đối chiếu code của bạn với các thao tác, cũng như kiểm tra các thao tác dựa vào datasheet.

Bạn chỉ đưa đoạn code lên thì sẽ rất khó cho người đọc. Theo tôi thì bạn viết code không tốt, bạn đang phát xung 10 kHz, nghĩa là sẽ có sự kiện được capture mỗi 100 us (bạn thiết lập để capture mỗi cạnh xuống tại RC2), trong khi đó vòng lặp của bạn lại có đến 2 lần delay với thời gian không dưới 100 us mỗi lần, như vậy sẽ xảy ra sự kiện tiếp theo trước khi bạn đọc giá trị CCPR1L, và CCPR1L sẽ bị ghi đè bởi giá trị mới. Bạn phát biểu rằng 'nó không chạy', nhưng theo bạn như thế nào là 'không chạy'?

Thân,

chao anh namqn!
thu nhat em rat cam on anh da nhiet tinh giup em va em xin trinh bay van de nhu the nay anh xem va giup em cai nhe. Thu nhat em se tra loi tung cau hoi cua anh nhu sau:
Mo Ta Bai Toan:
Bai toan chi don gian la do tan so bang cach khi phat xung vao chan RC2. cho CCP1 hoat dong o che do Capture Mode va gia tri nhan duoc se nam trong thanh ghi CCPR1H va CCPR1L dung khong anh. Du lieu nay khong can xu ly ma dua truc tiep ra PortB luon . de hien thi gia tri trong thanh ghi CCPR1H ca CCPR1L ra PortB.
Con van de anh bao la 2 Delay:
Em xin duoc noi the nay anh nhe. Theo em doc trong Datasheet thi Sau moi lan do xung va khi hoan tat qua trinh thi co bao ket thuc la PIR1<2> tuc la CCP1IF se duoc set. Va no se khong bi xoa Neu khong co lenh xoa boi phan men. Va khi co CCP1IF =1 thi che do Capture Mode dung hoat dong va doi cho den khi CCP1IF duoc xoa. Trong thoi gian CCP1IF chua duoc xoa. thi em doc gia tri cua CCPR1H ra PortB va quan sat bang mat qua may con LED tre 1 khoang thoi gian du de nguoi quan sat thay duoc gia tri trong CCPR1H thi tiep tuc truyen gia tri CCPR1L ra PortB de quan sat. khi quan sat lan 2 nay xong dong thoi cung la luc ta bat dau vong lap chuong trinh tiep theo. Ta xoa Thanh ghi CCPR1x va PIR1<CCP1IF> = 0.
Chac le den day em da tra loi cau hoi Ve di lay cua anh roi dung khong. Va la no se khong anh huong den chuong ket qua chuong trinh.

Con cau hoi ? The nao moi la chay ?
Hien tai no chay rat linh tinh va so dem trong CCPR1x rat linh tinh khi thi chi 2.000 khi thi 40-50.000 trong khi do xung cua em phat la xung chuan 10Khz va sai so xung nay chi la 1 xung (neu co).
Con trong doan Code em da viet rat day du ve mat chu thich tung cau lenh cung nhu tung buoc thuc hien che do Capture Mode. Nhung em cung xin noi lai nhu sau :
1. dat chan RC2 lam chan InPut.
2. khoi dong Timer1
3. xoa thanh ghi CCPR1x va PIR1<CCP1IF>
4. Dat gia tri Cho che do Capture Mode la 4 de bat dau qua trinh
5. doi co CCP1IF bao ket thuc duoc SET.
6. Doc va hien thi Ket Qua ra PortB
7. Chu trinh lap lai.
Mong Cac anh chi giup em nhe.

falleaf
24-05-2007, 11:56 AM
Nhớ viết tiếng Việt có dấu. Diễn đàn có bộ gõ tiếng Việt.

Chúc vui

namqn
24-05-2007, 07:59 PM
...
Con van de anh bao la 2 Delay:
Em xin duoc noi the nay anh nhe. Theo em doc trong Datasheet thi Sau moi lan do xung va khi hoan tat qua trinh thi co bao ket thuc la PIR1<2> tuc la CCP1IF se duoc set. Va no se khong bi xoa Neu khong co lenh xoa boi phan men. Va khi co CCP1IF =1 thi che do Capture Mode dung hoat dong va doi cho den khi CCP1IF duoc xoa. Trong thoi gian CCP1IF chua duoc xoa. thi em doc gia tri cua CCPR1H ra PortB va quan sat bang mat qua may con LED tre 1 khoang thoi gian du de nguoi quan sat thay duoc gia tri trong CCPR1H thi tiep tuc truyen gia tri CCPR1L ra PortB de quan sat. khi quan sat lan 2 nay xong dong thoi cung la luc ta bat dau vong lap chuong trinh tiep theo. Ta xoa Thanh ghi CCPR1x va PIR1<CCP1IF> = 0.
Chac le den day em da tra loi cau hoi Ve di lay cua anh roi dung khong. Va la no se khong anh huong den chuong ket qua chuong trinh.

Con cau hoi ? The nao moi la chay ?
Hien tai no chay rat linh tinh va so dem trong CCPR1x rat linh tinh khi thi chi 2.000 khi thi 40-50.000 trong khi do xung cua em phat la xung chuan 10Khz va sai so xung nay chi la 1 xung (neu co).
...
Bạn hiểu là như vậy, còn trong datasheet thì có đoạn sau (mục 8.1):
The type of event is configured by control bits, CCP1M3:CCP1M0 (CCPxCON<3:0>). When a capture is made, the interrupt request flag bit, CCP1IF (PIR1<2>), is set. The interrupt flag must be cleared in software. If another capture occurs before the value in register CCPR1 is read, the old captured value is overwritten by the new value.
Như vậy datasheet không hề nói đến chuyện CCP1IF được set thì quá trình capture bị ngưng, mà họ chỉ nói rằng giá trị của CCPR1 sẽ bị ghi đè nếu có một capture khác xảy ra.

Kết quả chạy chương trình của bạn cũng xác nhận điều đó, vì số đếm bạn đọc ra được nhảy lung tung. Nghĩa là nó capture liên tục, và nếu bạn xóa CCP1RH và CCP1RL ở những mốc thời gian khác nhau thì bạn sẽ capture được những giá trị khác nhau.

Tôi gợi ý thế này, trước tiên bạn chỉ capture đúng một lần và hiển thị kết quả. Thử chạy nhiều lần chương trình đó xem kết quả thế nào. Sau đó bạn thử capture lần đầu, sau đó tắt Timer 1, hiển thị kết quả, và bật Timer 1 trở lại để bắt đầu capture lần thứ hai, so sánh kết quả. Tạm thời là như thế.

Thân,

tdm
26-05-2007, 12:42 AM
Sao khong dung duoc tieng viet nhi
ban dung thu nhe!
PIC16F877A HOAT DONG O CHE DO CAPTURE MODE
;
WAIT EQU 0x22
WAIT1 EQU 0x23
WAIT2 EQU 0x24
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF
org 0x000
CLRF STATUS
; DOAN CHUONG TRINH KHOI TAO CHO CAPTURE MODE
BSF STATUS,RP0
BSF TRISC,2 ; RC2 IN-PUT CHON CHAN RC2 LAM CHAN DUA XUNG VAO
CLRF TRISB
BCF STATUS,RP0
CLRF CCP1CON ; KHOI TAO CHO CHE DO CAPTURE MODE
MOVLW .4 ; NAP GIA TRI TRUYEN VAO THANH GHI CCP1CON
MOVWF CCP1CON ; CHI KIEM TRA SUON XUNG XUONG

CLRF T1CON ; KHOI DONG CHO TIMER1
Loop
CLRF TMR1H
CLRF TMR1L
CLRF CCPR1H ; XOA THANH GHI CCPR1
CLRF CCPR1L
BCF PIR1,CCP1IF ; XOA CO NGAT DE TIEP TUC.
NOP
;CHO PHAT HIEN CANH LEN DE LAY MAU CHO CHUAN
BTFSS PIR1,CCP1IF ; DOI CCP1IF SET LEN 1
GOTO $-1
BCF PIR1,CCP1IF ; XOA CO NGAT DE TIEP TUC.
;BAT DAU LAY MAU
BSF T1CON,TMR1ON
;CHO CANH LEN LAN NUA DE LAY CA CHU KI
BTFSS PIR1,CCP1IF ; DOI CCP1IF SET LEN 1
GOTO $-1
BCF T1CON,TMR1ON
MOVF CCPR1H,0 ; DOC GIA TRI TU THANH GHI CCPR1L
MOVWF PORTB ; HIEN THI RA PORTB
CALL DELAY
MOVF CCPR1L,0 ; DOC GIA TRI TU THANH GHI CCPR1L
MOVWF PORTB ; HIEN THI RA PORTB
CALL DELAY
GOTO Loop ; LAP VO THOI HAN

DELAY ; DOAN CHUONG TRINH TAO THOI GIAN TRE
MOVLW .250
MOVWF WAIT
D1
MOVLW .250
MOVWF WAIT1
D2
MOVLW .250
MOVWF WAIT2
DECFSZ WAIT2,1
GOTO $-1
DECFSZ WAIT1,1
GOTO D2
DECFSZ WAIT,1
GOTO D1
RETURN
END

nguyen.geo
26-05-2007, 12:31 PM
Sao khong dung duoc tieng viet nhi
ban dung thu nhe!
PIC16F877A HOAT DONG O CHE DO CAPTURE MODE
;
WAIT EQU 0x22
WAIT1 EQU 0x23
WAIT2 EQU 0x24
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF
org 0x000
CLRF STATUS
; DOAN CHUONG TRINH KHOI TAO CHO CAPTURE MODE
BSF STATUS,RP0
BSF TRISC,2 ; RC2 IN-PUT CHON CHAN RC2 LAM CHAN DUA XUNG VAO
CLRF TRISB
BCF STATUS,RP0
CLRF CCP1CON ; KHOI TAO CHO CHE DO CAPTURE MODE
MOVLW .4 ; NAP GIA TRI TRUYEN VAO THANH GHI CCP1CON
MOVWF CCP1CON ; CHI KIEM TRA SUON XUNG XUONG

CLRF T1CON ; KHOI DONG CHO TIMER1
Loop
CLRF TMR1H
CLRF TMR1L
CLRF CCPR1H ; XOA THANH GHI CCPR1
CLRF CCPR1L
BCF PIR1,CCP1IF ; XOA CO NGAT DE TIEP TUC.
NOP
;CHO PHAT HIEN CANH LEN DE LAY MAU CHO CHUAN
BTFSS PIR1,CCP1IF ; DOI CCP1IF SET LEN 1
GOTO $-1
BCF PIR1,CCP1IF ; XOA CO NGAT DE TIEP TUC.
;BAT DAU LAY MAU
BSF T1CON,TMR1ON
;CHO CANH LEN LAN NUA DE LAY CA CHU KI
BTFSS PIR1,CCP1IF ; DOI CCP1IF SET LEN 1
GOTO $-1
BCF T1CON,TMR1ON
MOVF CCPR1H,0 ; DOC GIA TRI TU THANH GHI CCPR1L
MOVWF PORTB ; HIEN THI RA PORTB
CALL DELAY
MOVF CCPR1L,0 ; DOC GIA TRI TU THANH GHI CCPR1L
MOVWF PORTB ; HIEN THI RA PORTB
CALL DELAY
GOTO Loop ; LAP VO THOI HAN

DELAY ; DOAN CHUONG TRINH TAO THOI GIAN TRE
MOVLW .250
MOVWF WAIT
D1
MOVLW .250
MOVWF WAIT1
D2
MOVLW .250
MOVWF WAIT2
DECFSZ WAIT2,1
GOTO $-1
DECFSZ WAIT1,1
GOTO D2
DECFSZ WAIT,1
GOTO D1
RETURN
END



Thứ nhất rất chân thành cảm ơn anh đã giúp đỡ để em có thể lập trình cho chế độ này.
Em biết sẽ có rất nhiều người gặp phải trường hợp như em. Chính vì vậy em Post lên bài đầy đủ về Capture Mode để những người như em có thể lấy làm tài liệu tham khảo. Chương trình dưới đây đã chạy tốt các bạn coi như đây là 1 Modul cho Capture Mode :

; ************************************************** *************
; Đặt chế độ cho Capture Mode
CLRF STATUS
BSF STATUS,RP0
BSF PORTC,2 ; RC2 IN-PUT
CLRF PORTB ; PORTB OUT-PUT
BCF STATUS,RP0
CLRF CCP1CON
MOVLW .4 ; NAP GIA TRI TRUYEN VAO THANH GHI CCP1CON
MOVWF CCP1CON ; CHI KIEM TRA SUON XUNG XUONG
CLRF T1CON
LOOP
BCF PIR1,CCP1IF ; XOA CO NGAT DE TIEP TUC.
BTFSS PIR1,CCP1IF ; DOI CCP1IF SET LEN 1
GOTO $-1
CLRF TMR1H ; XOA GIA TRI TRONG THANH GHI TIMER1
CLRF TMR1L ; GIA TRI TRONG THANH GHI CCPR1x SE TU DONG XOA
BCF PIR1,CCP1IF ; XOA CO NGAT DE TIEP TUC.
BSF T1CON,TMR1ON; BAT DAU LAY MAU
BTFSS PIR1,CCP1IF ; DOI CCP1IF SET LEN 1
GOTO $-1
BCF T1CON,TMR1ON
MOVFW CCPR1H ; DOC GIA TRI TU THANH GHI CCPR1L
MOVLW PORTB ; HIEN THI RA PORTB
CALL DELAY
MOVFW CCPR1L ; DOC GIA TRI TU THANH GHI CCPR1L
MOVLW PORTB ; HIEN THI RA PORTB
CALL DELAY
GOTO LOOP

; DOAN CHUONG TRINH TAO THOI GIAN TRE
DELAY
MOVLW .250
MOVWF WAIT
D1
MOVLW .250
MOVWF WAIT1
D2
MOVLW .250
MOVWF WAIT2
DECFSZ WAIT2,1
GOTO $-1
DECFSZ WAIT1,1
GOTO D2
DECFSZ WAIT,1
GOTO D1
RETURN
END

Một lần nữa chân thành cảm ơn mọi người. Tôi đã hỏi và mọi người trả lời bây giờ tôi chưa có câu hỏi nào nhờ mọi người. Nhưng nếu ai có câu hỏi mà tôi có thể trả lời được thì tôi rất sẵn sang. Tôi làm về thiết kế mạch Analog và lập trình.. Trước đây thường lập trình cho 89C52 nay chuyển sang PIC nên còn hơi mắc.
Có gì mong anh em giúp đỡ. Chào và chúc thành công.

anh_gioi
01-10-2008, 04:07 PM
xin hỏi, em cũng đang làm về modul capture và lập trình trên CCS với đoạn code sau:
công việc của em là hiển thị khoảng cách mà SRF05 đo được khi gặp vật cản. em dùng bộ capture để đọc tín hiệu đầu vào:

// RC2--ECHO
// RD1 --TRIGGER
#include "F:\NCKH 2009\PIC 16\count_timer2\count_timer2.h"
#include <lcd_lib_4bit.c>
#include <F:\NCKH 2009\PIC 16\count_timer2\def_877a.h>
#define CONVERT_TO_MICROSECONDS (20000000/((4*4)*1000000))
//BOOLEAN CCP1Captured;
int8 tram,chuc,donvi,nghin;
void convert_bcd(int8 x)
{
donvi=x%10; //chia lay phan du, so hang don vi
tram=x/100; //tach hang tram va hang chuc
chuc=x/10%10;
nghin = x/1000;
tram = tram + 0x30;
chuc = chuc + 0x30;
donvi = donvi + 0x30;
nghin = nghin +0x30;
}
/////////
#int_ccp1
void main()
{
int8 x,s;
int16 t;
LCD_init();
convert_bcd(x);
trisd = 0x02;
trisc = 0x04;

//---hien thi LCD---
LCD_putchar("anh_gioi");
LCD_putcmd(0xC0);
LCD_putchar("S = ");
LCD_putcmd(0xC9);
LCD_putchar(" Cm");

//-- khai bao timer-capture ----
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
while(true)
{

//---- 10uS cho trgger ----
output_high(pin_d1);
delay_us(10);
output_low(pin_d1);
//-- Wait for senser output to go high ----

if(input(pin_c2)==0)
{
t = 0;
//set_timer1(0);
LCD_putcmd(0xCE);
LCD_putchar("NO");
}


else
{

t = CCP_1;
s = t/58;
convert_bcd(s);
//time = get_timer1();
LCD_putcmd(0xCE);
LCD_putchar("CO");
//time = time/CONVERT_TO_MICROSECONDS; //chuyen doi ra mcrogiay
}

///// hien thi len gia tri LCD//////
LCD_putcmd(0xC4);
LCD_putchar(nghin);
LCD_putcmd(0xC5);
LCD_putchar(tram);
LCD_putcmd(0x6);
LCD_putchar(chuc);
LCD_putcmd(0xC7);
LCD_putchar(donvi);
}
}




sau khi test thì LCD của em hiển thị 0000, em ko bít tại sao hay em đã khai báo và cách đọc hàm capture sai???
mong mọi người giúp em ???