ccs c dili ile yazılmış yardımcı programlar

Başlatan yusuf3101, 27 Temmuz 2012, 03:38:23

yusuf3101

https://rapidshare.com/#!download|740|147116721|M%C4%B0KRO%20%C4%B0%C5%9ELEMC%C4%B0LER.rar|5206

merhaba arkadaşlar.. bu notları akdeniz ünüversitesinde gördüğüm derslerde kendimde ekleyerek tutmuştum belki sizede faydası olur.. okulu bitirdim ve mıcro işlemcilere aşırı merak saldım, serdar çiçeğin ccs c ile pic programlama kitabınıda aldım gayet faydalı bi kitap..

     istediğim gibi yönetemediğim tek bir mod var ve bilen arakadaşların yardımını bekliyorum..
sleep(); modu ile uykuya soktuğumuz işlemciyi tekrar uyandırmak için WDT haricinde başka yolu varmı?
yapmak istediğim aşşağıda verdiğim örnekte while(a==1) olan döngünün sonunda pici uykuya sokmak ve her saniye uyandırıp tekrar uyutmak.. while(a==0) olan döngüdede başka işlemler yapmak
ve bu örnekde sleep(); modundan WDT ile çıkarttığım zaman değişkenlerim ilk baştaki değerini alıyor yani MLCR ile resetlemiş gibi oluyor.. timer1 kesmesi ile uyandırmaya çalıştım oldu fakat harici bir sinyal uygulama ile oldu.. kendi içinde taşma yaratarak uyanmıyor.. galiba uyku modunda pic'in osilatörüde duruyor.. dıştan buton eklemeden kendi içinde değişkenlerede karışmadan nasıl uyandırırım sleep(); modundan? yardımcı olursanız çok sevinirim... şimdiden teşekürler...

#include <16f628.h>
#use delay (clock=4000000)
#include <yusuf_lcd.c>
int a=1, sayı;

main()
{
lcd_init();

while (1) // sonsuz döngü
  {
   while(a==1)   // a=1 ise sonsuz döngüde kal
   {

     if (input(pin_a0))   // pin_a0 butonuna basılınca a değeri 0 olsun ve
        {         // bu döngüden çıkıp while(a==0) yazılı döngüde işlem görsün
         delay_ms(20);
         while(input(pin_a0);
         a=0;
        }

     printf (lcd_putc,"\f%02d",sayi);  // lcd'ye sayı değişkeninin değerini aktar
     sayı++                 // sayı değişkeni 1 arttır
              if(sayı>=60)sayı=0;              // sayı=60 olduğunda sıfırla
        sleep();                 // pic uyku modunda
   }

   while(a==0)   // a=0 ise sonsuz döngüde kal
   {
          printf (lcd_putc,"\f%02d",sayi);
         
     if (input(pin_a0))          // pin_a0 butonuna basılınca a değeri 1 olsun ve
        {          // bu döngüden çıkıp while(a==1) yazılı döngüde işlem görsün
         delay_ms(20);
         while(input(pin_a0);
         a=1;
        }
             
             if (input(pin_a1))   // pin_a1deki butona basılıp çekilince sayı 1 artsın
        {
         delay_ms(20);
         while(input(pin_a1);
         sayi++;
        }
             if (input(pin_a1))   // pin_a1deki butona basılıp çekilince sayı 1 eksilsin
        {
         delay_ms(20);
         while(input(pin_a1);
         sayi--;
        }

     if(sayi>=60)sayi=0;  // sayı 60 olunca sıfırla
     if(sayi<0)sayi=59;   // sayı sıfırdan küçük olunca 59 yükle

     delay_ms(200);
   }
  }
}

sadogan

Merhaba ,
Sorunun cözümü islemcinizin RB6 ve RB7 uclarına 32768 Khz kristal bağlayıp tmr1 bunla caliştırıp tmr1 kesemsi ile uyanmanda.
40300c.pdf dökümanda Timer1 mödülü incelemende fayda var.

ahmetgokce01

hocam iyi hoşta sorun timer1 kesmesi ile nasıl uyanacağında datasheetini incelediğimizde şunu şunu aktif yap diyor ama ccs c de register değerlerini nasıl değiştireceğiz yani biraz daha bilgi paylaşımında bulunsanız olmaz mı nasıl yapacağımıza dair

JKramer

Register değerlerini tanımlamak için: https://www.picproje.org/index.php/topic,35103.msg247839.html#msg247839

Daha sonra katalogda yazanları uygulayabilirsiniz.

yusuf3101

Merhaba arkadaslar çalistigim icin uzun suredir giremiyordum nete. İlginiz icin tesekkurler..
Sorunu şu sekilde hallettim..
Sleep modunda uykuya soktugum zaman wdt diger adi bekci köpegi olan resetleme ile uykudan uyandirdim ve tanimladigimiz degiskenlerede baslangicta deger vermeyip programda dongu icinde deger atadim bu sekilde sistem wdt süresine ulastiginda pici sifirlamasini onlemek icin restart_wdt komutunu kullandim ve programimda hic delay suresi koymadim hep wdt suresini kullandim yani tamamiyla sleep modu ile calismakta.. Suan telefondan yazdigim icin ornek program yukleyemiyorum en kisa zamanda ornek programda verecegim o zaman daha iyi anlayacaginiza eminim.. Saygilar..

yusuf3101

SLEEP(); modundan uyandırma yöntemi

burada bir saat yapacak olursak tanımlanacak saat ayar değişkenlerine
başlanıcta değer vermeyiz ve program içerisinde butonlar ile değer yüklersek bu değer wdt resetlemesi gelse dahi onu verdiğimiz değer ile gösterir.. bunu yapamadan önce değişkenlere hep ilk başta 0 yada 1 gibi başlangıç değeri yüklüyordum böyle olunca her sleep(); modundan wdt ile uyanmasında ilk değr ne ise onu alıyordu değişkenler ama hiç değişken atamadan bu sorunu çözebildim.. bu şekilde istediğim olunca TMR sıfır kesmesi ile sleep(); modundan uyandırmaya uğraşmadım


#include <16f877.h>
#fuses XT,WDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#include <lcd420.c>

int ayar=1;

void main(void)
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   setup_wdt(wdt_952ms); // resetleme süresi bu süreyi kullandığımız picin
          // driver kısmında kendimizde ayarlayabiliyoruz

   while(1)
   {
    while(ayar==1) // ayar değişkeni 1 ise bu döngüde kal
     {
      
      if(input(pin_a0))ayar=0; // pin a0 daki butona 1 sn kadar bastığımızda
                // ayar değişkenine 0 atıyor ve aşşagıdaki döngüye geçiyor
                // burada kesme kullanarak butona bastığımız anda bu işlemi yapmasıda sağlanabilir
      // b portundaki ledleri wdt süresi kadar aralıklarla yak söndür //

      output_b(0xff); // b potundaki tüm ledleri yak.
      sleep();      // uyku moduna geç
      output_b(0x00); // b potundaki tüm ledleri söndür.
      sleep();      // uyku moduna geç
     }
   
    while(ayar==0)
     {
         
      if(input(pin_a0))ayar=1;  // pin a0 daki butona basılınca ayar değişkenine 1 yükle ve While(ayar==1) döngüsüne geç
   
      restart_wdt(); // wdt sıfırla ve resetlenmeyi önle aksi taktirde
           // program yeniden başlayacağı için ayar değişkeni ilk değerini alacaktır

      // c portundaki ledleri 500 ms aralıklarla yak söndür //

      output_c(0xff);
      delay_ms(500);
      
      restart_wdt(); // wdt süresi dolmayacak şekilde ikinci bir sıfırlama yapılırsa picin yine resetlenmesi önlenir

      output_c(0xff);
      delay_ms(500);
      
     }
   }

}

yusuf3101

http://s2.dosya.tc/server25/Sn0NpK/M_KRO__LEMC_LER.rar.html

link bozulmuş galiba yeniledim.. birde extra olarak birkaç program daha eklendi..
Word belgesi, kodlar ve isisde uygulama olarak hepsi içerisinde umarım işinize yarar birşeyler vardır..

saygılar..