CCS C Delay Fonksiyonları Sorunu

Başlatan hakansefau, 24 Nisan 2016, 22:51:02

hakansefau

Merhabalar,

Mesajlarınızı okudum denemeleri yaptım hiçbir değişiklik yok, ben anlamadım bu neden olur gerçekten. Tüm kodu aşağıda veriyorum:

#include <12F629.h>
#FUSES WDT                      //No Watch Dog Timer
#FUSES XT                       //Internal RC Osc, no CLKOUT
#FUSES CPD                      //No EE protection
#FUSES PROTECT                  //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES PUT                      //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset

#use delay(clock=4000000,RESTART_WDT)

#use fast_io(A)

#define LED pin_a2

void main()
{
   
   SET_TRIS_A( 0x00 );
   
   output_low(LED);   delay_ms(100); 
int16 i;

   while(1)
   {
      for(i=0;i<=288;i++) 
      {
         output_toggle(LED);   
         delay_us(5);
      }

      output_low(LED);                
      delay_ms(40);      
      }
}


Kartımda 4 MHz kristal ve 22pF kondansatörlerim var. Bu işlemciden ben kesinlikle 5 us falan gibi gecikmeler alamıyorum

dursuncemal

ccs nin kendi fonksiyonlarini kulanarak alamayabiliirsin.  output_toggle(LED); fonksiyonu belkide 5 us den fazla bir zamanda gerceklesiyor olabilir . ustune 5 us de sen koyarsan tabiki olmaz  hic  delay koymadan dene. yinede sure uzun ise:
#include <12F629.h>
#FUSES WDT                      //No Watch Dog Timer
#FUSES XT                       //Internal RC Osc, no CLKOUT
#FUSES CPD                      //No EE protection
#FUSES PROTECT                  //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES PUT                      //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset

#use delay(clock=4000000,RESTART_WDT)

#use fast_io(A)

#byte PORTA = 0x05
#define LED  PORTA.2

void main()
{
   
   SET_TRIS_A( 0x00 );
   
   output_low(LED);   delay_ms(100); 
int16 i;

   while(1)
   {
      for(i=0;i<=288;i++) 
      {
         LED = 1;   
         delay_us(4);
          LED = 0;
         delay_us(4);
      }

     LED = 0;             
      delay_ms(40);      
      }
}

:=

Faruk53

Hocam kolay gelsin. Sizin yazmış olduğunuz kodu da derledim denedim çalışıyor. Her iki programında hex kodunu yüklüyorum. yani bende çalışan sizde neden çalışmıyor garip doğrusu.

NOT= İşlemcinin MCLR (4.pini) 1K5 direnç ile +5V konumuna almanız gerek.

http://s5.dosya.tc/server/wh12bd/HEX_kodlari.zip.html

dursuncemal

bu arada for dongusunu gozden kacirdim   for dongusunun harcadigi zamani da eklerseniz hic delay koymadan oldu oldu olmadi interrup olur.
:=

hakansefau

#19
Dursun bey, sizin verdiğiniz kodda hata veriyor. ; Expected diyor sanırım byte ve define yaptığınız PORTA.2 kısmında. Farkuk_53, valla deniyorum ben bulamıyorum sıkıntı var ama nerede belli değil, şimdi sizin derlediğiniz kodu yüklemeye çalışıyorum.

mesaj birleştirme:: 26 Nisan 2016, 17:51:49

faruk_53 şimdi denedim sizin benim yazdığım derlediğiniz kodu, high olma süresi 20uS tutuyor. Benim Programlama cihazında var galiba bir sıkıntı ya. Varmı pickit3 ile yükleme yapabileceğim bir arayüz benim deneyebileceğim??

Faruk53

Hocam pickit3'de kesinlikle bir sıkıntı olcağını zannetmiyorum. Bence bizde bir problem var. bende tekrardan bi hesaba kitaba oturcam. olmadı timer kullanarak yapıcaz hocam.

dursuncemal

#21
cok ozur dilerim su an ates 39 kafa gitti :: )eger asm girmez isen   en hizli benim tarif ettigim sekilde yazarsin

#byte PORTA  =0x05
#byte PORTB  =0x06
#byte TRISA  =0x85
#byte TRISB  =0x86



#bit ra7   =0x05.7
#bit ra6   =0x05.6
#bit ra5   =0x05.5
#bit ra4   =0x05.4
#bit ra3   =0x05.3
#bit ra2   =0x05.2
#bit ra1   =0x05.1
#bit ra0   =0x05.0

#bit rb7   =0x06.7
#bit rb6   =0x06.6
#bit rb5   =0x06.5
#bit rb4   =0x06.4
#bit rb3   =0x06.3
#bit rb2   =0x06.2
#bit rb1   =0x06.1
#bit rb0   =0x06.0


mesaj birleştirme:: 27 Nisan 2016, 09:52:42

bu surenini uzun olmasini programlayici ilie alakasi yok.
:=

hakansefau

Yok programlayıcı derken kast ettiğim şey şu: benim derlediğim program ile faruk_53 ün derlediği program çıktıları yani hexlerini ayrı ayrı denedim, yükledim sonuç gene saçma. Kodda 5us yazıyor fakar öyle bir süre yok. Bende şunu düşünüyorum, faruk_53 eğer derlediğin bu hexleri benimki veya seninki farketmez eğer osiloskopta 5uS gördüysen benim cihaz saçmalıyor hexi hatalı gömüyor derim.

RaMu

C de bu süreler zor,
aslında nop kullanarakda C de yapılabilir ama asm daha kolay geldi.

4MHz kristal bağlı ve MCLR aktif.



#include <12F629.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PUT                      //Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection

#use delay(crystal=4MHz)


#byte  PORT_ADI= getenv("SFR:GPIO")

#bit DENEME_PINI = PORT_ADI.1


void main()
{

OUTPUT_HIGH(PIN_A1);    //PİN ÇIKIŞ OLSUN DİYE, TRIS MİRİS KULLANILSA DAHA İYİ OLUR

   while(TRUE)
   {



#asm
TEKRAR:
   BSF   DENEME_PINI;   //1 SAYKIL
   NOP                  //1 SAYKIL
   NOP                  //1 SAYKIL
   NOP                  //1 SAYKIL
   NOP                  //1 SAYKIL

   BCF   DENEME_PINI;   //1 SAYKIL
   NOP                  //1 SAYKIL
   NOP                  //1 SAYKIL
   BRA   TEKRAR      //2 SAYKIL

#endasm



   }
}



Proje ve simulasyon dosyası:
http://www.mediafire.com/download/1knhm7vm5ycs35k/12F629_CcsC_5us_toggle.7z
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

dursuncemal

#24
Alıntı yapılan: hakansefau - 26 Nisan 2016, 21:31:32
Yok programlayıcı derken kast ettiğim şey şu: benim derlediğim program ile faruk_53 ün derlediği program çıktıları yani hexlerini ayrı ayrı denedim, yükledim sonuç gene saçma. Kodda 5us yazıyor fakar öyle bir süre yok. Bende şunu düşünüyorum, faruk_53 eğer derlediğin bu hexleri benimki veya seninki farketmez eğer osiloskopta 5uS gördüysen benim cihaz saçmalıyor hexi hatalı gömüyor derim.
oradaki 5 us sadece sizin delayiniz,  for dongusunun uretigi asm koda bakarak kac sakil harcadigini hesaplamaniz gerekir birde toggle komutu kullanmisiniz o komut bile sadece 5 us den fazla sure harcar. 
@RaMu hocanin yaptigi en mantikli yol ama hocam for dongusunu atlamis en basit sunu deneyebilirsin:sonsuz dongunun icine bir for yapisi kurun icine hic birsey yazmayin for a giriste portu set edin cikista sifirlayin bakın bakalim kac us geciyor. sizin bu yazilim sekli ile bunun altinda bir sureye ulasmaniz imkansiz .bunu birde toggle komutunda yapin komutun ustunde portu set edin baska bir potu togglle edin komutun sonnunda suresini olc dugunuz port sifirlayin bence asm yada interrup kullanmadan 4 mhz bbir kiristal ile sizin istediginiz is olmaz.bu arada tanimlamalari degistirdim hata yapmisim

yni sozun ozu sizin dongunuzde ki komutlarinizin harcadigi sureye koydugunuz delayi eklemelisiniz.
:=

hakansefau

peki 1us sürelik bir timer kurabilir miyim bu şekilde ? 12F629 işlemci ve 4MHz kristalim ile.

dursuncemal

#26
kurar siniz ama interruptan zor cikarsiniz eger bu sure disinda yapmaniz gereken isler var ise onlari yapamazsiniz.  4 mhz lik bir kristal ila olmaz sizin kristalinize gore 1 us bir komut islemek anlamina geliyor tabi pic te her komut 1 us de calismiyo bazi komutlar 2 us bazi durumlar ise cok daha fazla saykil ister sizin kulanabileceginiz kadar yuksek hizda kristal kulanmaniz.
:=