Các bạn và anh chị xem giúp mình về capture của pic 16f887

biencualo2000

Trứng gà
Mình muốn thử chức năng capture của PIC, mình viết ch trình đơn giản sau , dùng capture 1, phát hiện xung cạnh lên,mình lấy chân RA1 của pic để phát xug cứ 50ms, chân RC2 để nhận xung từ chân RA1 (mình nối 2 chân này với nhau qua 1 con trở trên breadboard), chân RB1 nối led. led sẽ đảo trạng thái khi nhận đc 1 xung cạnh lên phát ra từ chân RA1. viết vậy nhưng sao cắm vô nó chả ra cái gì hết :confused::confused::confused: Các anh chị các bạn xem giúp mình, mình cảm ơn rất nhiều

Code:
#include <htc.h>


__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word
__CONFIG(BORV21); //2st config. Word
#define _XTAL_FREQ     4000000

int timer_result;
//=====================================
void timer_init()
{
ANSEL=0;
ANSELH=0;
TRISA=0x00;       //RA1 LAM CHAN PHA'T XUNG
TMR1CS=0;
TMR1IF=0;
TMR1IE=1;
GIE=1;
T1CKPS1=1;
T1CKPS0=1;
PEIE=1;
TMR1ON=1;
TMR1H=0x00;
TMR1L=0x00;
};
//===================================
void int_ccp1()
{CCP1M3=0;				//do canh len
CCP1M2=1;
CCP1M1=0;
CCP1M0=1;
TRISC=0B00000100;	 //RC2 CHUYEN THANH INPUT CHO CCP1
}
//================================
void interrupt isr()
{
if (CCP1IF)
{
RB1^=1;                           //DAO TRANG THAI DEN LED TAI CHAN RB1
CCP1IF=0;
};
}
//=====================================
void main(void)
{
timer_init();
int_ccp1();
while(1)
{
RA1=^1;
__delay_ms(50);                //phat xung tai chan ra1
};
}
//=======================================
 

biencualo2000

Trứng gà
Lý do mình hỏi về capture là do mình đang làm đề tài thực tap ky thuat , phần siêu âm SRF05.:D:D
Mình đã chỉnh sửa lại code và đây là toàn bộ code mình viết chiều nay, đã test và chạy tốt.:o:o
Theo yêu cầu của admin, mình post lên cho mọi người góp ý.
Code này kết nối phần cứng như sau:
_Ngõ ra output echo của srf05 noi vao chân 16 và 17 của pic (chân CCP1 và CCP2)
_PORTD nối ra LCD
_Chân RE1 nối vào trigger input của cảm biến.
Code này chỉ xuất ra LCD d74 liệu dang thô :mad::mad:, tức là thời gian có xung ở chân echo out của cảm biến, các ban phải lấy số hiện trên lcd chia cho 2, rồi đem nhân cho 4uS rồi nhân cho 344m/s là sẽ ra kết quả với đơn vị là mét.:rolleyes::rolleyes:
Chúc CLB ngày càng phát triển:o
/****************************************************************
*
*
* Description : SRF05
*
timer 1 prescale 1/4=>4us len 1 so
* Tool : HI-TECH PIC
* Chip : 16F887
* History : 05/03/2011
*
* Author : NGUYEN TRUONG GIANG,DD08TD1, CLB NCKH
* Notes :
*
*
****************************************************************/
#include <htc.h>
#include "lcd.h"

__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word
__CONFIG(BORV21); //2st config. Word
#define _XTAL_FREQ 4000000
long timer_khoangcach;
long timer_canhlen;
long timer_canhxuong;
//======================================
void int_timer1()
{ANSEL=0; //ngo vao digital
ANSELH=0;
TRISD=0x00; //pord xuat led
TRISE=0x00; //porE xuat trigger
TRISC=0xFF; //PORTC IN LAM CAPTURE RC1
TMR1CS=0; //che do timer
TMR1IF=0; //xoa ngat timer
TMR1IE=0; //cho phep ngat timer
GIE=1; //cho phep ngat toan cuc
T1CKPS1=1; //chia tan 1/4
T1CKPS0=0;
PEIE=1; //cho ngat ngoai vi
TMR1H=0x00; //nap gia tri dau
TMR1L=0x00;
TMR1ON=1; //chay timer
}
//======================================
void int_ccp1()
{
CCP1IE=1; //CHO PHEP NGAT CCP1
CCP1M3=0; //DO CANH LEN
CCP1M2=1;
CCP1M1=0;
CCP1M0=1;
}
//=====================================
void int_ccp2()
{
CCP2IE=1;
CCP2M3=0; //DO CANH xuong
CCP2M2=1;
CCP2M1=0;
CCP2M0=0;
}
//======================================
void timer_lcd(long k)
{
int p,q,m,n,l;
p=k/10000;
q=(k-p*10000)/1000;
m=(k-p*10000-q*1000)/100;
n=(k-p*10000-q*1000-m*100)/10;
l=k-p*10000-q*1000-m*100-n*10;
lcd_clear();
lcd_gotoxy(0,0);
lcd_putc(p+0x30);
lcd_putc(q+0x30);
lcd_putc(m+0x30);
lcd_putc(n+0x30);
lcd_putc(l+0x30);
};
//======================================
void trigger()
{
RE1=0;
__delay_us(20);
RE1=1;
};
//===================================

//==================================
void main(void)
{
lcd_init();
int_timer1();
int_ccp1();
int_ccp2();
__delay_ms(10);
while (1)
{
__delay_ms(50);
trigger();
timer_lcd(timer_khoangcach);
};
}
//======================================
void interrupt isr()
{
if (CCP1IE&&CCP1IF) //co canh len
{
timer_canhlen = (TMR1H<<8)|TMR1L;
CCP1IF=0;
}
else
{
if (CCP2IE&&CCP2IF)
{
timer_canhxuong = (TMR1H<<8)|TMR1L;
timer_khoangcach = timer_canhxuong-timer_canhlen;
CCP2IF=0;
};
};
}
 

doanvanlap

Trứng gà
mình cũng mới sờ đến chức năng capture của pic.nhưng ngay lần đầu tiên đã có vấn đề.mính cấp xung vào chân CCP2. dùng biến T đề đo giá trị hai thanh ghi CCPR2H và CCPR2L.cứ mỗi lần xảy ra ngắt thì mình cập nhật giá trị T một lần rồi cho in ra lcd, nhưng giá trị của nó luôn bằng 0. Mong mọi người góp ý.

Code:
#include<htc.h>
#include<stdio.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT
& BORDIS & IESODIS & FCMDIS & LVPDIS);
#include"lcd.h"
long int T;
int D;
void main()
{ 
  lcd_init();
   TRISC1=1;
  ANSEL=ANSELH=0;
  TRISA0=0;
  RA0=0;
  //KHOI TAO TIMER1
  T1OSCEN=1;
  TMR1CS=0;
  T1CKPS0=T1CKPS1=0;
  T1SYNC=1;
  TMR1ON=1;
  TMR1GE=0;
  TMR1L=TMR1H=0;
  // khoi tao capture
  CCP2CON=0X04;
  CCPR2H=CCPR2L=0;
  //khai bao ngat capture
 
  CCP2IE=1;
  CCP2IF=0;
  PEIE=1;
   GIE=1;
  while(1)
  {       
	      lcd_gotoxy(0,0);
          printf("T=%d",T);
          lcd_gotoxy(0,1);
          printf("%d",D);
         // TMR1H=TMR1L=0;
  }
  
}
void putch(char c)
{
  lcd_putc(c);
}
void interrupt isr()
{
  if(CCP2IF)
    {   RA0=1;
	    RA0=~RA0;
	    D++;
	  //if(D==10000) D=0;
	  
      T=CCPR2H*256+CCPR2L;
      CCP2IF=0;
      TMR1L=TMR1H=0;
    }
}
 
Top