16f877a ile CCP2 ve timer1 kullanımı

Başlatan Atima, 03 Haziran 2021, 14:14:16

Atima

Merhabalar, 16f877a ile ccp2 ve timer1 kullanarak sensör out pininden frekans ölçmek istiyorum. Yardımcı olur musunuz?
Kullandığım derleyici CCS C.

sadogan

 
Merhaba ,
 CCP2 capture modunda çalışıp peryot ölçmen lazım,
neler yaptığını paylaşabilirsen yardımcı olmaya çalışalım.
 

Atima

Alıntı yapılan: sadogan - 03 Haziran 2021, 21:24:38Merhaba ,
 CCP2 capture modunda çalışıp peryot ölçmen lazım,
neler yaptığını paylaşabilirsen yardımcı olmaya çalışalım.
 
Acikcasi cok bisey yapmadim nette hazir kodlarla kendime gore duzenledim fakat duzgun calismiyor. renk ayirma sistemi yapiyorum tcs3200. Renklerin frekanslarini olcmem gerektigini dusundugum icin.

Atima

Alıntı yapılan: sadogan - 03 Haziran 2021, 21:24:38Merhaba ,
 CCP2 capture modunda çalışıp peryot ölçmen lazım,
neler yaptığını paylaşabilirsen yardımcı olmaya çalışalım.
 





Bu kodlarla timer1ve2 kullanilmus gerekli baglantilarla renklere tuttugumda frekanslari olculuyor fakat kararsiz olcuyor.

mr.engineer

#4
Kullandığın PIC'de neler var bilmiyorum ama ben son yaptığım işlemde IOC(İnterrupt On Change) ve Timer kullanarak gelen bir kare sinyalde bit aralıklarını ölçmüştüm.

İlk edge geldiğinde IOC kesmesi gelir ve timer saymaya başlar, sonraki edge'de timer değerini okur ve timer'ı sıfırlarsın. Daha sonraki edge'de yine timer'ı oku ve sıfırla....
Zaten ilk iki pulse aralığını okuyunca frekansı bulmuş olursun. Ama frekansın değişme durumu olacağı için okuma işlemini her gelen edge için yapmalısın.
Tam hatırlamıyorum ama bu yöntem CCP'den daha basitti.

Atima

Alıntı yapılan: mr.engineer - 04 Haziran 2021, 10:01:12Kullandığın PIC'de neler var bilmiyorum ama ben son yaptığım işlemde IOC(İnterrupt On Change) ve Timer kullanarak gelen bir kare sinyalde bit aralıklarını ölçmüştüm.

İlk edge geldiğinde IOC kesmesi gelir ve timer saymaya başlar, sonraki edge'de timer değerini okur ve timer'ı sıfırlarsın. Daha sonraki edge'de yine timer'ı oku ve sıfırla....
Zaten ilk iki pulse aralığını okuyunca frekansı bulmuş olursun. Ama frekansın değişme durumu olacağı için okuma işlemini her gelen edge için yapmalısın.
Tam hatırlamıyorum ama bu yöntem CCP'den daha basitti.
Duruyorsa kodu paylasabilir misiniz ?

sadogan

#include <16f877A.h>      
 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)  
#use RS232(baud=19200, xmit=PIN_C6, rcv=PIN_c7,STREAM = UART1, ERRORS )
#use fast_io(b)  
#use fast_io(c)  

#INT_CCP2   
void CapTur2INT()
{
   set_timer1(0);
}
void main ( )
{
   delay_ms(10);
   setup_psp(PSP_DISABLED);         
   set_tris_c(0x07);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
 
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF);              
 
   enable_interrupts(INT_CCP2);  
   enable_interrupts(GLOBAL);    

 
   setup_ccp2(CCP_CAPTURE_RE);    //Yükselen kenarda 
   CCP_2_HIGH=0x00;  
   CCP_2_LOW=0x00;   
   set_timer1(0);


  
   while(true)
   {
          printf("%LU \n\r",CCP_2);// peryot'u yaz.
          delay_ms(1000);
   }
}
Capture modu ile kare dalganın peryodunu ölçmek için bir örnek.
Ölçmek istediğin peryot uzunluğuna göre ayarlama yapman gerekebilir.

Atima

Alıntı yapılan: sadogan - 04 Haziran 2021, 11:55:52
#include <16f877A.h>      
 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)  
#use RS232(baud=19200, xmit=PIN_C6, rcv=PIN_c7,STREAM = UART1, ERRORS )
#use fast_io(b)  
#use fast_io(c)  

#INT_CCP2   
void CapTur2INT()
{
   set_timer1(0);
}
void main ( )
{
   delay_ms(10);
   setup_psp(PSP_DISABLED);         
   set_tris_c(0x07);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
 
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF);              
 
   enable_interrupts(INT_CCP2);  
   enable_interrupts(GLOBAL);    

 
   setup_ccp2(CCP_CAPTURE_RE);    //Yükselen kenarda 
   CCP_2_HIGH=0x00;  
   CCP_2_LOW=0x00;   
   set_timer1(0);


  
   while(true)
   {
          printf("%LU \n\r",CCP_2);// peryot'u yaz.
          delay_ms(1000);
   }
}
Capture modu ile kare dalganın peryodunu ölçmek için bir örnek.
Ölçmek istediğin peryot uzunluğuna göre ayarlama yapman gerekebilir.

.

Oncelikle tesekkur ederim.
Bu program ile renk sensorunu renklerin uzerinde tutup degerleri olcecegim. Sonra karsilastirma ile renkleri tanimasini deneyecegim.

Atima

Alıntı yapılan: sadogan - 04 Haziran 2021, 11:55:52
#include <16f877A.h>      
 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)  
#use RS232(baud=19200, xmit=PIN_C6, rcv=PIN_c7,STREAM = UART1, ERRORS )
#use fast_io(b)  
#use fast_io(c)  

#INT_CCP2   
void CapTur2INT()
{
   set_timer1(0);
}
void main ( )
{
   delay_ms(10);
   setup_psp(PSP_DISABLED);         
   set_tris_c(0x07);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
 
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF);              
 
   enable_interrupts(INT_CCP2);  
   enable_interrupts(GLOBAL);    

 
   setup_ccp2(CCP_CAPTURE_RE);    //Yükselen kenarda 
   CCP_2_HIGH=0x00;  
   CCP_2_LOW=0x00;   
   set_timer1(0);


  
   while(true)
   {
          printf("%LU \n\r",CCP_2);// peryot'u yaz.
          delay_ms(1000);
   }
}
Capture modu ile kare dalganın peryodunu ölçmek için bir örnek.
Ölçmek istediğin peryot uzunluğuna göre ayarlama yapman gerekebilir.

lcd ekranda yazmıyor sanırım çalıştıramadım

sadogan

Uartan yazıyor bu, lcd için düzenlemeniz lazım.

Atima

Alıntı yapılan: sadogan - 05 Haziran 2021, 01:09:55Uartan yazıyor bu, lcd için düzenlemeniz lazım.
Lcd dosyasini ekledim ve printf(lcd_putc 
Komutuunu kulladim rs232 kismini silerek fakat deger alamadim

sadogan


Atima

Alıntı yapılan: sadogan - 05 Haziran 2021, 12:33:09LCD herhangi bir şey yazıyormu ?

Herhangi bir karakter olmuyor ama siyah kareler mevcut. Baglantidan dolayi olabilir mi cok kez kontrol ettim ama

tekosis

Önce başka bir programda sadece lcd ekrana yazı yazdırmayı deneyin. O kısmı hallettikten sonra frekans ölçümünü halledersinz.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.