Timer1 harici clock/osilatör yardımm CCS C

Başlatan calyon, 04 Ocak 2013, 15:57:06

calyon

merhaba arkadaşlar benim projemde timer kesmesi ile frkens üretiyorum 2 tane ayrı şekill portb0 ve portb1 den 2 adet butonlada frekansları artırıp azaltıyorum ayrıca lcd de frekans ve sıcaklık gösteriyorum  programda tek sorunum timer1 için harici osilatörü çalıştırmak araştırmalarıma göre

setup_timer_1(t1_external|t1_div_by_1|t1_clk_out); bu komut ile oluyormuş ancak bi türlü çalışmadı ne proteusta nede gerçek te fakat aynı satırı

setup_timer_1(t1_internal|t1_div_by_1);

yapınca devre çalısıyor ama istediğim hızlara çıkamıyorum ve belli seviyeden sonra çıkışım bozulmaya başlıyor bu yüzden timer1 için harici osilatör kullanmak istedim (benim istediğim frekans 10khz-20khz arası) eğer bu konu hakkında bilgisi olan ve yardım edebilecekler için şimdiden teşekkürler. devrenin


#include <18f4620.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10  // 10 bitlik ADC kullanılacağı .

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(d) //Port yönlendirme komutları D portu için geçerli
#define use_portd_lcd TRUE
#include <lcd.c>
#define OSC_32MHZ    8


int i=0;
unsigned long int a,b,c,d; // Tamsayı tipinde değişken tanımlanıyor
int dijital;
float sicaklik,Mvolt,frekans;

#int_timer1  // Timer1 kesmesi
void  timer1_kesme ()   // Kesme fonksiyonu ismi
{

 
  if(i==3){
  output_high(PIN_b0);
  set_timer1(65536-(b));
  i=0;
  }else  if(i==2){
  output_low(PIN_b1);
  set_timer1(65536-(d));
  i++;
  }else if(i==1){
  output_high(PIN_b1);
  set_timer1(65536-(c));
  i++;
  } 
   else if(i==0){
  output_low(PIN_b0);
  set_timer1(65536-(d));
  i++;
  }






}



/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
     

   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı


   set_tris_c(0xff); //ra0 aktif
   set_tris_a(0xff); //ra0 aktif
   setup_adc(adc_clock_div_32);
   setup_adc_ports(AN0);
   lcd_init();
   set_adc_channel(0);
   delay_us(50);
   printf(lcd_putc,\"\\fSicaklik=\");





   set_tris_b(0x00);   // B portu komple çıkış
   output_b(0x01);   
   setup_oscillator(OSC_32MHZ | OSC_TIMER1);
   clear_interrupt(int_timer1);

   setup_timer_1(t1_external|t1_div_by_1|t1_clk_out);
   set_timer1(65536-(b));   // TMR1 değeri belirleniyor
   enable_interrupts(int_timer1);
   enable_interrupts(global);
   
     

     a=150;
   
   while(1){
 

   
   
   

   dijital=read_adc(); 
   Mvolt=(0.0048828412*dijital)*1000;
   sicaklik=(Mvolt/10)+2;
   frekans=a;
   lcd_gotoxy(10,1);
   printf(lcd_putc,\"%f%cC\",sicaklik,223);
   lcd_gotoxy(1,2);
   printf(lcd_putc,\"Frekans=%f\",frekans);
 

        if(input(pin_a1)){
            while(input(pin_a1));
              delay_ms(10);
              a=a-100;
         }
       if(input(pin_a2)==1){
     
         while(input(pin_a2)==1);
           delay_ms(10);
           a=a+100; 
      }
     
     
              b=(a/2);
              c=30*(a/100);
              d=10*(a/100);
 
   
   }

 }



proteus dosyasını ve kodları da yolluyorum.


Hızlı Yanıt

Not: Bu konu bir moderatör tarafından onaylanmadan görüntülenmeyecektir.

Adı:
E-Posta:
Doğrulama:
Lütfen bu kutuyu boş bırakın:
IRFP250 Nedir:
kısayollar: göndermek için alt+s veya önizleme yapmak için alt+p'ye basın