CCS de kod işleme süresi

Başlatan savvase, 27 Eylül 2007, 16:56:21

savvase

Arkadaşlar CCS ile yazdığımız bir kod parçacığının ne kadar zamanada yapıldığını nasıl hesaplarız?
Daha doğrusu örneğin bir döngü var programımızın bir yerinde döngü içindeki  işlemlerin bitirilip tekrar döngü başına geçmesi ne kadar sürer? Bunu öğrenmemizin -yada hesaplamamızın bir yolu var mıdır?  
Yardımcı olursanız sevinirim..

sigmoid

uzun süredir ccs kullanmıyorum. Eskiden böyle bir şeye ihtiyac duyduğumda mplab içinden ccs i kullanırdım. Adım adım komutları çalıştırarak mplabtaki stopwatch özelliği ile süreleri ölcerdim. programların debuger özelliği kod yazmayı kolaylaştırıyor.

XX_CİHAN_XX

Programını derledikten sonra list dosyası oluşur.Bu dosyanın içersinde programının asm kodları vardır.Asm kodlarında komutun işleniş süreleri bellidir.Komutun çeşidine göre 1 yada 2 saykıllık bir gecikme olur.Asm biliyorsan döngünün süresini rahatlıkla elde edersin.Bilmiyorsan ve bahsettiğin döngü çok uzun değilse list dosyasından o kısmın asm halini buraya koy sana işleniş süresini söyleyelim.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

savvase

Alıntı Yap....................    while (over_flow_sayaci==1)
....................    {
01B5:  DECFSZ 31,W
01B6:  GOTO   1CF
....................    disable_interrupts(INT_RDA);
01B7:  BSF    03.5
01B8:  BCF    0C.5
....................    say_buf=get_timer0();
01B9:  BCF    03.5
01BA:  MOVF   01,W
01BB:  MOVWF  34
....................    
....................     if(say_buf=A)
01BC:  MOVF   35,W
01BD:  MOVWF  34
01BE:  MOVF   34,F
01BF:  BTFSC  03.2
01C0:  GOTO   1C5
....................     {output_low(PIN_B1);}
01C1:  BSF    03.5
01C2:  BCF    06.1
01C3:  BCF    03.5
01C4:  BCF    06.1
....................     if(say_buf=B)
01C5:  MOVF   36,W
01C6:  MOVWF  34
01C7:  MOVF   34,F
01C8:  BTFSC  03.2
01C9:  GOTO   1CE
....................     {output_low(PIN_B2);}
01CA:  BSF    03.5
01CB:  BCF    06.2
01CC:  BCF    03.5
01CD:  BCF    06.2
....................      
....................    }
Umarım yanlış kısmı almamışımdır.
Döngü bunun gibi birşey olacak uzayacak biraz daha yani aynı if göngüsünden 6 tane daha olacak.Eğer hesaplarken neyin kaç saykıl olacağını da yazaranız öğrenmiş olurum.
Kullandığım kristal de 4Mhz. Fakat ilerde 16Mhz veya 20Mhz ile de deneyeceğim.Bir de sanırım
Alıntı Yapsetup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
bu kısım timer resolution u gösteriyor. Bu kısma da değinirseniz sevinirim.
Bu durumda 0-255 arası sayan (sanırım) timer0 haç us de bir atıyor gibi.
İlgilendiğin için teşekkürler

XX_CİHAN_XX

.................... while (over_flow_sayaci==1) 
.................... { 
01B5: DECFSZ 31,W    *1 saykıl
01B6: GOTO 1CF           2 saykıl
.................... disable_interrupts(INT_RDA); 
01B7: BSF 03.5             1 saykıl
01B8: BCF 0C.5            1 saykıl
.................... say_buf=get_timer0(); 
01B9: BCF 03.5            1 saykıl 
01BA: MOVF 01,W         1 saykıl 
01BB: MOVWF 34          1 saykıl
.................... 
.................... if(say_buf=A) 
01BC: MOVF 35,W         1 saykıl
01BD: MOVWF 34          1 saykıl
01BE: MOVF 34,F           1 saykıl
01BF: BTFSC 03.2          1 saykıl
01C0: GOTO 1C5           2 saykıl
.................... {output_low(PIN_B1);} 
01C1: BSF 03.5              1 saykıl
01C2: BCF 06.1              1 saykıl 
01C3: BCF 03.5              1 saykıl  
01C4: BCF 06.1              1 saykıl
.................... if(say_buf=B) 
01C5: MOVF 36,W           1 saykıl
01C6: MOVWF 34            1 saykıl
01C7: MOVF 34,F            1 saykıl
01C8: BTFSC 03.2           1 saykıl
01C9: GOTO 1CE             2 saykıl 
.................... {output_low(PIN_B2);} 
01CA: BSF 03.5              1 saykıl
01CB: BCF 06.2               1 saykıl
01CC: BCF 03.5              1 saykıl
01CD: BCF 06.2              1 saykıl
.................... 
.................... }

* DECFSZ komutu registerin içeriğini 1 eksiltir ve eksilme sonucunda register 0 oldu mu diye kontrol eder.Register 0 a düşmediği sürece 1 saykıl harcar 0a düşerse 2 saykıl harcar.
Programın 01B5 ten 01BF ye kadar 11 saykıl harcıyor.Eğer 01BF deki koşul olumlu ise program 1C5 e atlamadan 01C1 den devam ediyor.01C8 deki sorguya kadar 8 saykıl daha harcar.Bu sorguda olumlu sonuc verirse program 1CE ye atlamadan 01CA dan 01CD ye kadar devam eder ve burasıda 4 saykıl tutar.
Bütün sorgulardan dallanmadan devam edildiği taktirde verdiğin kodlar toplamda 23 saykıl tutmaktadır.Ancak buradaki sorgu kısımlarında programın farklı yerlere dallanıyor.Eğer bu dallanmalar olursa bu süre değişecektir.23 saykıl 4mhz de 23uS yapar.16mhz 23/4uS, 20mhz de 23/5uS zaman harcar demektir.

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);

Bu kodlarda timer sayacının prescaler değerini 1:32 olarak seçmiş oluyorsun.Bu durumda 4mhz için konuşursak 32uS de 1 artacak demektir.Yani timer0 sıfırdan saymaya başladığında 32x256us kadar süre sonra kesmeye gidecektir.
Kolay gelsin...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

savvase

Teşekkürler anladım sanırım hesaplama biçimini.
Aslında timer ayarlarını css wizardla yaptım ve overflow time olarak 1 ms göstermişti.  Fakat sizde biraz farklı çıktı. Acaba hangisi doğru?

XX_CİHAN_XX

Alıntı yapılan: "savvase"Teşekkürler anladım sanırım hesaplama biçimini.
Aslında timer ayarlarını css wizardla yaptım ve overflow time olarak 1 ms göstermişti.  Fakat sizde biraz farklı çıktı. Acaba hangisi doğru?
Eğer tmr 0 dan başlayarak overflow olması bekleniyorsa bu bölenle 1ms olamaz.
Bak burada tmr ve wdt bölenlerini gösteriyor.



Bu başlıktada daha detaylı bilgi var.
https://www.picproje.org/index.php/topic,2795

1ms lik gecikme için 1:4 bölenini kullanman gerekir.(4x256 =1024uS)
Bu bölen için 4 değil 1 yüklemen gerekir(tabloda gözüküyor)
Tabi kristalinin 4mhz olduğunu varsayarak söylüyorum.
Kolay gelsin...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.