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..
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.
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.
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
.................... 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...
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?
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,27951ms 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...