counter problemi

Başlatan myprayer14, 23 Kasım 2016, 22:04:44

myprayer14

Herkese hayırlı akşamlar,
Bir counter problemim var. Yarıklı sensör üzerinden çıkış alıp sayma işlemi yaptığım devremde counter problemi yaşıyorum. Motor miline bağlanmış dişli şeklinde bir aparat yarıklı sensör üzerinde sabitlenmiş bir halde. Arada counter fonk. saymayı durduruyor sanırım. Lcd üzerinde durduğunda bir kere saymış gibi +1 arttırma işlemi yazıp duruyor. Ya da hiç sayma yapmayıp hiç bir şey göstermiyor. En son hangi sayımda kaldıysa onu gösteriyor. Bunlardan hariç bazen de 0 dan başlayıp bir kere sayıyor.

Örnek vermek gerekirse en son ki sayım 1200.  Soldan sağa geçiyorum. 1230 olup duruyor. Ya da baştan başlatıp 30 yazıp duruyor. Ya da Mustafa yazıyor.(en başta başlarken ki lcd komutu.)

Bu şu olaylarda daha sık oluyor; Counter ın saymaya başlama kısmını 65520 değil daha yüksek tutarsam 35530-35 gibi . Ya da pwm(i)  de ki "i" değerini daha yüksek tutarsam.

Bunun önüne nasıl geçebilirim bu sorun neden kaynaklanıyor olabilir?

Kod şöyle;
#include <18F2520.h>
#FUSES INTRC
#FUSES NOWDT                    //No Watch Dog Timer
//#FUSES XT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
//#FUSES NOMCLR

//#use delay (clock=4000000)
#use delay(internal=4Mhz)

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
//#define use_portb_lcd TRUE   // LCD B portuna bağlı

#define LCD_ENABLE_PIN PIN_B3
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2

#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#include <lcd.c>   // lcd.c dosyası tanıtılıyor
int16 x=1;      // Tamsayı tipinde değişken tanımlanıyor
int16 y=0;    // Ondalıklı tipte değişken tanımlanıyor
char z;     //  Karakter tipinde değişken tanımlanıyor
int16 kesme=0;
float RPM;
int i=25;


#use fast_io(c) //Port yönlendirme komutları C portu için geçerli

#int_timer0  //timer0 kesmesi zamanlayıcı modunda
void timer0_kesme()
{
set_timer0(60);
y++;
if(y==20) {
//output_high(pin_b0);
//RPM=kesme*30;
//printf(lcd_putc,"\f \n RPM DEGERI=%f ", RPM );
//kesme=0;

delay_ms(5000);
//output_low(pin_b0);
y=0;
}

}
//***********************************timer1 kesmesi**************************
#int_timer1 // timer1 kesmesi sayıcı modunda
void timer1_kesme()
{ delay_ms(25);
set_timer1(65520); //tmr1 kesme değeri
kesme++;
delay_ms(50);
RPM=kesme*30;
delay_ms(25);
printf(lcd_putc,"\f \n RPM DEGERI=%f ",RPM );

}

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   //setup_timer_0(RTCC_INTERNAL);
   //setup_timer_1(T1_DISABLED);
   //setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   setup_oscillator(OSC_4MHZ);
   
   
   set_tris_a(0x1F);   // RA0 ve RA1 pinleri giriş
   set_tris_b(0x00);
   set_tris_c(0x01);   // RC0 pini giriş
   output_b(0x00);
   output_c(0x00);
   
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   
   setup_ccp1(CCP_PWM);  // CCP1 birimi PWM çıkışı için ayarlandı
   setup_ccp2(CCP_PWM);  // CCP2 birimi PWM çıkışı için ayarlandı
   lcd_init();
   setup_timer_2(T2_DIV_BY_1,100,1);
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 | RTCC_8_BIT);
   set_timer0(60);
   
   setup_timer_1(T1_EXTERNAL | T1_DIV_BY_2);
   set_timer1(65520);
   disable_interrupts(INT_timer0);
   enable_interrupts(INT_timer1);
   
   enable_interrupts(GLOBAL);
   
   

   
   delay_ms(50);
   printf(lcd_putc,"\f MUSTAFA ");
   

   // TODO: USER CODE!!
   
      while(1)
      {
       
       
         if(!input(pin_a3)){
         
            delay_ms(150);
            set_pwm1_duty(0);
            output_low(pin_c3);
         
           
            output_high(pin_c4) ;
            set_pwm2_duty(i);
           
            //while(input!(pin_a3));
         }
         
         if(!input(pin_a4)){
         
            delay_ms(150);
            set_pwm2_duty(0);
            output_low(pin_c4);
           
            output_high(pin_c3) ;
            set_pwm1_duty(i);
               
           
           
            //while(input!(pin_a4));
         }   
         if(!input(pin_a2)){
         
            delay_ms(150);
           
            output_low(pin_c3);
            output_low(pin_c4) ;
           
            set_pwm1_duty(0);
            set_pwm2_duty(0);
           
           
            //while(input!(pin_a2));
         }
       
         
         } 
         
       

         
         
       
}
         
         
   

     
     

Powered by EzPortal