Kesme içindeki bu program ne kadar sürede döner?

Başlatan Yasin, 01 Ekim 2015, 01:53:22

Yasin

Aşağıda kodunu verdiğim kesme rutini tahmini bekleme komutları hariç ne kadar sürede tamamlanır? Farklı bir bilgisayarda olduğum için simu. ile vs. ölçme imkanım yok. Yardımcı olursanız sevinirim. (18F452, 80MHz)


DISABLE
KESME:

PAUSEUS A*SATIR
CIZGI_A=CIZGI
PAUSEUS SATIR
CIZGI=0

PAUSEUS (B*SATIR)-(A*SATIR)
CIZGI_B=CIZGI
PAUSEUS SATIR
CIZGI=0

PAUSEUS (C*SATIR)-((B*SATIR)-(A*SATIR))
CIZGI_C=CIZGI
PAUSEUS SATIR
CIZGI=0

INTCON.1=0
RESUME
ENABLE

END


Not: Kodlar 16F628'e göre. Ama yapılacak iş için uygun olmadığı sebebiyle değişiklikler yapılıp 18F452'ye uyarlanacak. Karışıklık olmasın.

Burak

Sistemde bir LCD ekran kullanıyo musun ?

Burak
Ω Gens Una Sumus Ω

Yasin


İlyas KAYA

Yasin bey;

Kesme içinde bekleme komutu kullanılmaz normalde. Ayrıca A , B, C  ve SATIR değişken değerleri nedir ? Bunların değerlerini bilmeden yorum yapmak imkansız.

Pauseus komutu mikrosaniye cinsinden bekleme yapar.

PAUSEUS SATIR komutu SATIR değişkeninin değeri kadar mikrosaniye bekler. Diğer komutlarda ise aynı şekilde 4 işlem yapılmış. 4 işlemin sonucu kadar bekler.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Burak

Alıntı yapılan: Yasin - 01 Ekim 2015, 17:59:33
Kullanmıyorum Burak Bey.

Bu durumda Timer1 sayacını kullanıp sayaç değişkenini EEPROM'a yazarak bir PIC programlayıcıda okuyabilirsin ... Bunuda sürekli yapmaman gerektiğini zaten biliyorsundur çünkü EEPROM'larda bir yazma sayısı limiti mevcut  , kolay bir algoritma ile bu sayacı bir kereye mahsus çalıştırıp , döngü sonunda durdurarak Timer1 kayıtçılarında biriken sayıyıda bir kereye mahsus EEPROM'a yazdırabilirsin. Programına pek bakmadım ama pauseus'ların olduğunu görebiliyorum .. Bu durumda Timer1 kullanımının müsaitliğini pauseus'ların ardından gelen değişkenlerin yaratacağı beklemelerin boyutuyla yorumlamak gerek çünkü Timer1 65535 değerine ulaşıp taşma meydana getiren bir sayaçtır ... Düzgün bir önbölücü oranıyla bunun önüne belki geçebilirsin .. Gerisi sende ...

Burak
Ω Gens Una Sumus Ω

Yasin

#5
Alıntı yapılan: İlyas KAYA - 01 Ekim 2015, 18:14:55
Yasin bey;

Kesme içinde bekleme komutu kullanılmaz normalde. Ayrıca A , B, C  ve SATIR değişken değerleri nedir ? Bunların değerlerini bilmeden yorum yapmak imkansız.

Pauseus komutu mikrosaniye cinsinden bekleme yapar.

PAUSEUS SATIR komutu SATIR değişkeninin değeri kadar mikrosaniye bekler. Diğer komutlarda ise aynı şekilde 4 işlem yapılmış. 4 işlemin sonucu kadar bekler.

İlyas Bey, gözünüzden kaçtı sanırım, bekleme komutları hariç diye yazmıştım.

Yasin

#6
Alıntı yapılan: Burak GÜNAY - 01 Ekim 2015, 18:44:24
Bu durumda Timer1 sayacını kullanıp sayaç değişkenini EEPROM'a yazarak bir PIC programlayıcıda okuyabilirsin ... Bunuda sürekli yapmaman gerektiğini zaten biliyorsundur çünkü EEPROM'larda bir yazma sayısı limiti mevcut  , kolay bir algoritma ile bu sayacı bir kereye mahsus çalıştırıp , döngü sonunda durdurarak Timer1 kayıtçılarında biriken sayıyıda bir kereye mahsus EEPROM'a yazdırabilirsin. Programına pek bakmadım ama pauseus'ların olduğunu görebiliyorum .. Bu durumda Timer1 kullanımının müsaitliğini pauseus'ların ardından gelen değişkenlerin yaratacağı beklemelerin boyutuyla yorumlamak gerek çünkü Timer1 65535 değerine ulaşıp taşma meydana getiren bir sayaçtır ... Düzgün bir önbölücü oranıyla bunun önüne belki geçebilirsin .. Gerisi sende ...

Burak

Bazı sebeplerden dolayı Windows 10 yüklü bir bilgisayar kullanmak zorundayım. Bu merette Mcs'yi ne yaptıysam çalıştıramadım. Programlarımı not defterinde yazmak zorunda kaldım. Isis falan çalıştırabilseydim RB.0'ı 500 miko saniyede bir kesmeye sokup kesme içinde toggle komutu yardımıyla tamamlanma süresini hesaplamayı düşünüyordum.

İlyas KAYA

Pardon ben bekleme hariç olan kısmı gözden kaçırmışım. 3 saatlik uyku ile ancak bu kadar oluyor :)

Kesme içerisinde bekleme sağlıklı bir mantık değildir. Kesmede geçen zaman bu sefer ana döngüyü etkileyecektir.

Bekleme komutu işlemciyi uyku moduna sokuyor yani durduruyor ve hiçbir işlem yapmıyor. Bu neden ile kesme çalışırken işlemcinin durdurulması o esnada bir encoder sayıyor ise o palsin kaçması anlamına gelir.

Yahut bekleme anında bir buton ile kesme oluşuyor ise butonu yakalayamaz bile.
En iyisi kesmenin oluştuğunu anladığınızda küçük bir zaman döngüsü ve işaret biti ile süre saymaktır.

Komut gecikmesi için 4 mhz sistem saatinde her bir ASM komutu 1mikrosaniye sürüyor. Gerçek değeri öğrenmek istiyorsanız PBP nin ASM çıktısına bakıp asm çıktısındaki komutları saymanız ve 4 mhz 'e göre 1 mikro saniye ise sizin kullandığınız osilatöre göre hesaplamanız gerekecek.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Yasin

Alıntı yapılan: İlyas KAYA - 01 Ekim 2015, 23:52:35
Pardon ben bekleme hariç olan kısmı gözden kaçırmışım. 3 saatlik uyku ile ancak bu kadar oluyor :)

Kesme içerisinde bekleme sağlıklı bir mantık değildir. Kesmede geçen zaman bu sefer ana döngüyü etkileyecektir.

Bekleme komutu işlemciyi uyku moduna sokuyor yani durduruyor ve hiçbir işlem yapmıyor. Bu neden ile kesme çalışırken işlemcinin durdurulması o esnada bir encoder sayıyor ise o palsin kaçması anlamına gelir.

Yahut bekleme anında bir buton ile kesme oluşuyor ise butonu yakalayamaz bile.
En iyisi kesmenin oluştuğunu anladığınızda küçük bir zaman döngüsü ve işaret biti ile süre saymaktır.

Komut gecikmesi için 4 mhz sistem saatinde her bir ASM komutu 1mikrosaniye sürüyor. Gerçek değeri öğrenmek istiyorsanız PBP nin ASM çıktısına bakıp asm çıktısındaki komutları saymanız ve 4 mhz 'e göre 1 mikro saniye ise sizin kullandığınız osilatöre göre hesaplamanız gerekecek.

Aslında benim programımda ana işi kesme yapıyor. :) 500 mikro saniyede bir kesmeye girmem lazım ve bir kesmede çizgi isimli değişkenin 60 kere yani 8 mikro saniyede bir güncellemem lazım. O nedenle bu kadar önemli. Anlaşılan o ki düzgün bir bilgisayara geçip bakmam lazım.

Burak

#9
Öncelikle bir yanlışı düzelteyim .. Kesme rutininde bekleme komutları işletilmez ifadesi yanlıştır .. Doğrusu : "kesme bloğunun dışında pause komutlarının işletilmesi işlemcinin kesmeyi kaçırması durumu ihtimalini oluşturur" demek daha doğru olur.

Kesme rutinine geldiğimizde zaten işlemci bir dizi işlevi yerine getirip resume ile son dallandığı vektörel adrese geri gider .. Bu tüm mikroişlemcilerde böyledir .. Kısa ve öz olarak sana şunu ifade edeyim bu arada .. Bekleme satırları hariç bu işlemci 80 MHZ'de neredeyse hiç denecek kadar zaman harcamaktadır .. Çünkü 80 MHZ'de çalışan bir Pic MCU için bir komut çevriminin frekans olarak ifadesi 80/4'tür ..
Datasheet'lerden de ediniğimiz bilgiye göre 4 saat darbesi bir komut çevrimi süresine eşittir .. Bu durumda 80 MHZ için bir osilatör darbesi 12.5 nanosaniye'ye tekabül eder .. Bir komut çevrimide 50 nanosaniye zaman alır .. Bekleme satırları hariç diğer satırlara baktığımız zaman 2 us' süreyi geçmeyecek bir süre harcanacak (Takriben)



CIZGI_A=CIZGI
CIZGI=0

CIZGI_B=CIZGI
CIZGI=0

CIZGI_C=CIZGI
CIZGI=0

INTCON.1=0
RESUME



Son olarak kodu incelediğimde gözüme çarpan anlamsız kabul ettiğim bir kaç şeyi daha ifade etmeden geçemeyeceğim .. İşlemci kesme rutinine girdikten sonra CIZGI değişkeni içindeki sayıyı CIZGI_A'ya aktarıyor ardından CIZGI değişkenini temizleyerek 0 yapıyorsun ama CIZGI değişkeni 0 olduktan sonra CIZGI_B ve CIZGI_C değişkenlerinede 0 değerini aktarıp , zaten 0 olan CIZGI değişkenini tekrar tekrar sıfırlıyorsun ... Eğer amaç sadece CIZGI_A değişkenine rutine girildiğinde CIZGI değişkenini aktarmaksa kodu şu şekilde düzeltebilirsin ..



PAUSEUS A*SATIR
CIZGI_A=CIZGI
PAUSEUS SATIR

PAUSEUS (B*SATIR)-(A*SATIR)
CIZGI_B=0
PAUSEUS SATIR

PAUSEUS (C*SATIR)-((B*SATIR)-(A*SATIR))
CIZGI_C=0
PAUSEUS SATIR

CIZGI=0

INTCON.1=0
RESUME



Burak
Ω Gens Una Sumus Ω

Yasin

Alıntı yapılan: Burak GÜNAY - 02 Ekim 2015, 10:13:45
Öncelikle bir yanlışı düzelteyim .. Kesme rutininde bekleme komutları işletilmez ifadesi yanlıştır .. Doğrusu : "kesme bloğunun dışında pause komutlarının işletilmesi işlemcinin kesmeyi kaçırması durumu ihtimalini oluşturur" demek daha doğru olur.

Kesme rutinine geldiğimizde zaten işlemci bir dizi işlevi yerine getirip resume ile son dallandığı vektörel adrese geri gider .. Bu tüm mikroişlemcilerde böyledir .. Kısa ve öz olarak sana şunu ifade edeyim bu arada .. Bekleme satırları hariç bu işlemci 80 MHZ'de neredeyse hiç denecek kadar zaman harcamaktadır .. Çünkü 80 MHZ'de çalışan bir Pic MCU için bir komut çevriminin frekans olarak ifadesi 80/4'tür ..
Datasheet'lerden de ediniğimiz bilgiye göre 4 saat darbesi bir komut çevrimi süresine eşittir .. Bu durumda 80 MHZ için bir osilatör darbesi 12.5 nanosaniye'ye tekabül eder .. Bir komut çevrimide 50 nanosaniye zaman alır .. Bekleme satırları hariç diğer satırlara baktığımız zaman 2 us' süreyi geçmeyecek bir süre harcanacak (Takriben)



CIZGI_A=CIZGI
CIZGI=0

CIZGI_B=CIZGI
CIZGI=0

CIZGI_C=CIZGI
CIZGI=0

INTCON.1=0
RESUME



Son olarak kodu incelediğimde gözüme çarpan anlamsız kabul ettiğim bir kaç şeyi daha ifade etmeden geçemeyeceğim .. İşlemci kesme rutinine girdikten sonra CIZGI değişkeni içindeki sayıyı CIZGI_A'ya aktarıyor ardından CIZGI değişkenini temizleyerek 0 yapıyorsun ama CIZGI değişkeni 0 olduktan sonra CIZGI_B ve CIZGI_C değişkenlerinede 0 değerini aktarıp , zaten 0 olan CIZGI değişkenini tekrar tekrar sıfırlıyorsun ... Eğer amaç sadece CIZGI_A değişkenine rutine girildiğinde CIZGI değişkenini aktarmaksa kodu şu şekilde düzeltebilirsin ..



PAUSEUS A*SATIR
CIZGI_A=CIZGI
PAUSEUS SATIR

PAUSEUS (B*SATIR)-(A*SATIR)
CIZGI_B=0
PAUSEUS SATIR

PAUSEUS (C*SATIR)-((B*SATIR)-(A*SATIR))
CIZGI_C=0
PAUSEUS SATIR

CIZGI=0

INTCON.1=0
RESUME



Burak
Öncelikle Size ve İlyas beye teşekkürler.

Bahsettiğiniz hataya gelecek olursak, evet haklısınız. Bir yanlışlık olmuş. CIZGI_A, CIZGI_B ve CIZGI_C isimli değişkenleri CIZGI isimli değişkene eşitlemek yerine tam tersini yapmam gerekirdi. Yani cızgı isimli değişkeni diğerlerine eşitlemem gerekirdi. orada bir hata yapmışım.

DigMan

Bu işlemciyi 80 MHz de nasıl çalıştıracaksın?

Yasin

Alıntı yapılan: algos - 02 Ekim 2015, 14:16:46
Bu işlemciyi 80 MHz de nasıl çalıştıracaksın?

40MHz imiş. Pll ile 80 diye hatırlıyordum. Problem değil 40 MHz'de olur.

gogoce

Alıntı yapılan: Yasin - 01 Ekim 2015, 22:00:09
Bazı sebeplerden dolayı Windows 10 yüklü bir bilgisayar kullanmak zorundayım. Bu merette Mcs'yi ne yaptıysam çalıştıramadım. Programlarımı not defterinde yazmak zorunda kaldım. Isis falan çalıştırabilseydim RB.0'ı 500 miko saniyede bir kesmeye sokup kesme içinde toggle komutu yardımıyla tamamlanma süresini hesaplamayı düşünüyordum.

ORACLE VM VIRTUALBOX programını kullanıyorum . Pc de sanal 98 platformu oluşturuyo
tüm programlarımı burda yazıyorum
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

İlyas KAYA

Ben de windows 10 kullanıyorum ne proteus da ne Mcs de herhangi bir problem yok.

Bir de PBP3 'ün full sürümünü arayın deneyin. İçerisinde MSCX gelecektir ve haricen msc kurmanıza gerek yoktur.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal