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

calyon

Üye
Katılım
25 May 2008
Mesajlar
40
Puanları
1
Yaş
39
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 proteus dosyasını ve kodları da yolluyorum.

Kod:
#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);
 
  
   }

}
 
setup_timer_1(t1_external|t1_div_by_1|t1_clk_out);


​bunu nerden okudunuz :S ?
 
setup_timer_1(t1_external|t1_div_by_1|t1_clk_out);


​bunu nerden okudunuz :S ?

internette değşik sitelerde ve yabancı sitelerde bu şekilde çalıştırmışlar ama ben yapamadsım ne yazıkki bir öneriniz varsa veya tavsiyeniz çok ihtiyacım var
 
Böyle şeyleri yazmadan önce picin hangi picv oldugunu söylemek doğru olur.
dışardan tanımlamayı dene bence pickin ilgili byte larını devrede #define komutlarını yazdıgımız yere tanımla.
Naısl dersen.

#byte T1CON=0X10 ( Bu T1CON un adresi 010 demektir. pic16f877 için de öyle , senin işlemci içinde adresine bak bundan sonra yapacagın ayarlar picin datasheetinde timer kısmında mevcut)

Senin istedigin ayarlar için sonrada setup_timer1 dedigin satırı sil yerine şu ikisini de ayrı ayrı dene!!!!
T1CON=0X0F //00001111 veya birinden emin olamadım

T1CON=0X07 //00000111

İşini çözmesi lazım diye düşnüyorum. Yine olmuyorsa , Tris ayarların kesinlikle yanliştir. Tris ayarları içinde LCD de yazı yazdıkça değişebiliyor CCS C nin salaklıgıdır , proteusda durdurunca görebiliyorsun. Onu kontrol et , bence sorun buyuk ihtimalle o. lcd init den sonra C portunu tris ayarını bir daha ata. Hatta her lcd yazdırma işleminden sonra c portunu trisini (bu arada timerin C de diye düşündüm başkasındaysa tabi ki onu ) bir daha set_tris_C.... bir daha ata


T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits11 = 1:8 prescale value
10 = 1:4 prescale value
01 = 1:2 prescale value
00 = 1:1 prescale value
bit 3 T1OSCEN: Timer1 Oscillator Enable Control bit
1 = Oscillator is enabled
0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain)
bit 2 T1SYNC: Timer1 External Clock Input Synchronization Control bit
When TMR1CS = 1:
1 = Do not synchronize external clock input
0 = Synchronize external clock input
When TMR1CS = 0:
This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.
bit 1 TMR1CS: Timer1 Clock Source Select bit
1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
0 = Internal clock (FOSC/4)
bit 0 TMR1ON: Timer1 On bit
1 = Enables Timer1
0 = Stops Timer1
 
Böyle şeyleri yazmadan önce picin hangi picv oldugunu söylemek doğru olur.
dışardan tanımlamayı dene bence pickin ilgili byte larını devrede #define komutlarını yazdıgımız yere tanımla.
Naısl dersen.

#byte T1CON=0X10 ( Bu T1CON un adresi 010 demektir. pic16f877 için de öyle , senin işlemci içinde adresine bak bundan sonra yapacagın ayarlar picin datasheetinde timer kısmında mevcut)

Senin istedigin ayarlar için sonrada setup_timer1 dedigin satırı sil yerine şu ikisini de ayrı ayrı dene!!!!
T1CON=0X0F //00001111 veya birinden emin olamadım

T1CON=0X07 //00000111

İşini çözmesi lazım diye düşnüyorum. Yine olmuyorsa , Tris ayarların kesinlikle yanliştir. Tris ayarları içinde LCD de yazı yazdıkça değişebiliyor CCS C nin salaklıgıdır , proteusda durdurunca görebiliyorsun. Onu kontrol et , bence sorun buyuk ihtimalle o. lcd init den sonra C portunu tris ayarını bir daha ata. Hatta her lcd yazdırma işleminden sonra c portunu trisini (bu arada timerin C de diye düşündüm başkasındaysa tabi ki onu ) bir daha set_tris_C.... bir daha ata


T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits11 = 1:8 prescale value
10 = 1:4 prescale value
01 = 1:2 prescale value
00 = 1:1 prescale value
bit 3 T1OSCEN: Timer1 Oscillator Enable Control bit
1 = Oscillator is enabled
0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain)
bit 2 T1SYNC: Timer1 External Clock Input Synchronization Control bit
When TMR1CS = 1:
1 = Do not synchronize external clock input
0 = Synchronize external clock input
When TMR1CS = 0:
This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.
bit 1 TMR1CS: Timer1 Clock Source Select bit
1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
0 = Internal clock (FOSC/4)
bit 0 TMR1ON: Timer1 On bit
1 = Enables Timer1
0 = Stops Timer1


dediklerinizi yaptım ama gene olmadı zaten c portunun tris ayarları ne olursa olsun osilatörün çalışması gerekiyor datasheet de öyle yazıyor gene olmadı maalesef başka önerileri olan varsa şimdiden teşekkürler
 
32 Mhz'lik kristal kullanıyosun galiba :S ? Çıkmak istediğin hızdan kastınız nedir ? yani yeterince hızlı değil mi zaten devrenizin adım hızı ?
clock_out'u sizden öğrendim ve kullanmayın derim bence. acaba kullandığınız işlemci 32 Mhz'i destekliyo mu ?
 
kolay gelsin kulandığın kodda " #include <18f4620.h> " yazan yere sağ tıkla ve klasörünü aç de. pic ile alakalı kullanabileceğin timerler adc ler ccp ler v.s. tanımlamalara, kodlara ulaşırsın.

ya da pic wizart ile istediğin şekilde otomatik oalrak tanımlamalarını yaptırırsın.

belki yapmak istediğini tam olarak anlayamadığım içindir kusura bakma fikrim için. ama pwm modulunu kullanmanda nasıl bi sakınca var? ister frekansını istersen sinyalin doluluk oranını (duty) rahatlıkla ayarlayabilirsin.

kolay gelsin
 

Forum istatistikleri

Konular
127,955
Mesajlar
913,894
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Geri
Üst