Neden kullanılacak kristal tanımlanmıyor?

Başlatan ziyaretci, 29 Ekim 2013, 15:55:52

ziyaretci

 Merhaba, öncelikle herkese hayırlı bayramlar.

Assembly'e yeni başladım. Bugün uzun uğraşlar sonucu sanal ortamda bir 0.4 ms aralıklarla led yakıp söndürdüm. Ama hesaplarım 5 sn üzerine idi, belkide yanlış hesaplamışımdır bilmiyorum ama ilk aklıma gelen osilatörü tanımlamadığım içindir diye düşündüm bu kadar düşük zaman aralıklarıyla gecikme vermesini, uzatmayayım bu kristali nasıl tanımlıyoruz assembly de?  Yani nette bir çok kod gördüm hiçbirinde göremedim tanımlanan kristali.

Teşekkürler.

pwm.c

zaman gecikmesi kodlarının hesaplaması için programı kullanabilirsin:
http://www.ikarab.narod.ru/Delay.html

derleyicide kristal için osilatörü XT yapacaksın ancak bunun değerini tanımlamana gerek yoktur. kodları osilatörün değerine göre sen üreteceksin ve yukarıda verdiğim yardımcı program senin osilatör frekansına uygun kodları üretmede gayet iyi iş görüyor.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

z

#2
Program yazarken her zaman parametrik fonksiyonlar hazirlamayiz. Aslinda makbul olani parametreik yazimdir fakat ilave kodlama gerektirir.

Bu nedenle bazen Delay rutinini kullandigimiz xtal frekansi icin dogrudan yazariz. Sen, tasarimda ongorulen "xtal"den daha farkli bir xtal kullandiginda tum zamanlama degerlerin degisir.

Muhtemelen ornek aldigin delay rutini, tek bir Xtal frekansi icin yazilmis bir koddur ve sen denemeni farkli bir frekans degeri icin yapmissindir.

Bu durumda delay rutinindeki kodlarda zaman asimini belirleyen degere mudahale etmen gerekecek.

Genellikle su yontem ise yarar.

Diyelimki delay rutininde zamani belirleyen sayisal deger 10 olarak sabit tanimlanmis olsun ve bu deger 1 saniyelik gecikme yapmasi gerekirken sen farkli frekansda xtal kullandigin icin 1.5 saniyelik gecikmeye neden olsun.


10, 1.5 saniye ederse 1 saniye kac eder?

A=10*1/1.5=6.6

10 degerini 6 yada 7 ile degistirirsen yaklasik olarak istedigin zamani yakalarsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ipek

Asm' de genelde dışarıdan include ile hazır delay makroları çağırılır ,yada program dibine delay rutinleri yazılır,gıcık bir iştir bu ben genelde makroyu özellikle bir iki rakam eksik yada fazla yazarım sonra araya nop komutlarını serpiştirip işimi görürüm.kristalin bitti yeni aldın tekrar oynamam icab eder. neden bu konuda hassasım bende bilemiyorum,?

Icarus

External Osilatörün çalıştığına eminmisiniz ? Belki kristal çalışmadı ve pic fail-safe ile internal RC osilatörü başlattı ??

ziyaretci

 Verdiğiniz cevaplar için çok teşekkür ederim.

Alıntı yapılan: Icarus - 29 Ekim 2013, 18:06:23
External Osilatörün çalıştığına eminmisiniz ? Belki kristal çalışmadı ve pic fail-safe ile internal RC osilatörü başlattı ??

LIST P=16F84

olarak başladım sonra dallandırdım programı yukarıdaki tanıtım komutundan başka tanıtım komutu yok, kod denememi isis te 4Mhz osilatör frekansı seçerek kullandım. 
  Gecikme için yazdığım kodu vereyim belki ben bir yerde yanlış hesaplıyor olabilirim.
ZAMAN              ; gecikme etiketi
 MOVLW 0XFF         
 MOVWF GECIKME      ; gecikme değişkenine 255 yükledim

 ZAMAN2           ; gecikme etiketi 2
 MOVLW 0XFF
 MOVWF GECIKME2     ; gecikme değişkenine 255 yükledim

 VER                ; gecikmeye başla etiketi
 DECFSZ GECIKME,F    ; gecıkme değişkeninden 1 çıkar kendisine yaz "0 ise
                    ;    alt satırı atla"
 GOTO VER                ; gecikmeye başla etiketine git
 DECFSZ GECIKME2,F    ; gecikme 2 den bir cıkar kendisine yaz 
 GOTO ZAMAN2



decfsz 2 saykıl
goto 2 saykıl
  diğerleri 1 saykıl

Bir 255 döngüsünde 1275 saykıl  geçiyor. 255 defa tekrar ettiriyoruz. 255x1275=325125 yaklaşık saykıl yapar.Bu değeri yaklaşık 1 sn'ye 65 000 e bölersek 5 sn yapar. Ama simülatörde 0.4 saniyeyi geçtiğini sanmıyorum.

Bir yerde hata yapıyorum. Ama nerede?

yani her bir döngü için +4 saykıl diyebiliriz.

RaMu

#6
-----------
Ek;
decfsz bazen tek bazen çift komut çevrimi kadar süre harcar,
komut çevrimi süresi 4 MHz kristalde 1 us dir,
decfsz eğer decfsz değişken,f durumunu yaparken
değişken içeriği sıfır olursa 2 komut çevrimi sürer
sıfır değilse bir komut çevrimi sürer

Birde zaman2 etiketinde gecikme değişkenine,
zaman etiketinde gecikme2 değişkenine değer yüklemek lazım,

böylece iç döngüde yani VER döngüsünde yaklaşık 3*255 = 765 us geçer
ve dış döngü yani ver döngüsünü tekrarlatacak olan döngüde (ZAMAN2 döngüsü) bunu 255 defa tekrarlatabilir
(dikkat edilirse herbir ZAMAN2 döngüsünde VER döngüsü baştan başlıyor)
bu sayede 255*765 = 195075 us = yaklaşık 0,2 saniye sürer.


Şuan yazılı olan kodda GOTO ZAMAN2 ile gecikme2 ye 255 yükleniyor
ve tekrar gecikme2 bir azaltılıp ZAMAN2 etiketine gidiyor
yani burada sonsuzdöngü olmuş, buradan çıkamaz.

-----------

Eğer z hocanın söylediği gibi dinamik bir gecikme rutini yazılmayacaksa,
misal 16f628 (veya çoğu 16f için)

__CONFIG      _CP_OFF & _CPD_OFF & _LVP_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

gibi konfigurasyon tanımlaması yapılır,
burada & _INTRC_OSC_NOCLKOUT ile
dahili rc osilatör kullanılacak ve dışarıya clock verilmeyecek denmiş,
&_XT_OSC  şeklinde 4 MHz ye kadar kristal için
&_HS_OSC  şeklinde 4 MHz üstü kristal için
diyerek yazılabilir.

Birde bu konfigurasyon tanımlamasını asm kod içinde yapmadan
yani hex dosyasında konfigurasyon biilgisi olmadanda yazmak mümkün
bu durumda pic programlayıcı ile konfigursayon bitleri ayarlanabilir.

z hocanın bahsettiği gibi eğer hangi kristal değerini kullanacağımı başta tanımlayayım
ve kullandığım gecikme altprogramı (rutini) buna göre herbir seçilen kristal için bana tanımlanan süreyi sağlasın
dersen onun için gecikme rutinlerini ona göre yazmak gerekir,
öncelikle gecikme rutinlerinin çalışma prensibini çözersen gerisi için yardımcı olurum.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Kabil ATICI

İstersen birde gerçek işlemci üzerinde dene.

Simülatörün gerçek zamanlı çalışmadığı ortada.
ambar7

ziyaretci

Alıntı yapılan: RaMu - 29 Ekim 2013, 19:12:04
-----------
Ek;
decfsz bazen tek bazen çift komut çevrimi kadar süre harcar,
komut çevrimi süresi 4 MHz kristalde 1 us dir,
decfsz eğer decfsz değişken,f durumunu yaparken
değişken içeriği sıfır olursa 2 komut çevrimi sürer
sıfır değilse bir komut çevrimi sürer

Birde zaman2 etiketinde gecikme değişkenine,
zaman etiketinde gecikme2 değişkenine değer yüklemek lazım,

böylece iç döngüde yani VER döngüsünde yaklaşık 3*255 = 765 us geçer
ve dış döngü yani ver döngüsünü tekrarlatacak olan döngüde (ZAMAN2 döngüsü) bunu 255 defa tekrarlatabilir
(dikkat edilirse herbir ZAMAN2 döngüsünde VER döngüsü baştan başlıyor)
bu sayede 255*765 = 195075 us = yaklaşık 0,2 saniye sürer.


Şuan yazılı olan kodda GOTO ZAMAN2 ile gecikme2 ye 255 yükleniyor
ve tekrar gecikme2 bir azaltılıp ZAMAN2 etiketine gidiyor
yani burada sonsuzdöngü olmuş, buradan çıkamaz.

-----------

Eğer z hocanın söylediği gibi dinamik bir gecikme rutini yazılmayacaksa,
misal 16f628 (veya çoğu 16f için)

__CONFIG      _CP_OFF & _CPD_OFF & _LVP_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

gibi konfigurasyon tanımlaması yapılır,
burada & _INTRC_OSC_NOCLKOUT ile
dahili rc osilatör kullanılacak ve dışarıya clock verilmeyecek denmiş,
&_XT_OSC  şeklinde 4 MHz ye kadar kristal için
&_HS_OSC  şeklinde 4 MHz üstü kristal için
diyerek yazılabilir.

Birde bu konfigurasyon tanımlamasını asm kod içinde yapmadan
yani hex dosyasında konfigurasyon biilgisi olmadanda yazmak mümkün
bu durumda pic programlayıcı ile konfigursayon bitleri ayarlanabilir.

z hocanın bahsettiği gibi eğer hangi kristal değerini kullanacağımı başta tanımlayayım
ve kullandığım gecikme altprogramı (rutini) buna göre herbir seçilen kristal için bana tanımlanan süreyi sağlasın
dersen onun için gecikme rutinlerini ona göre yazmak gerekir,
öncelikle gecikme rutinlerinin çalışma prensibini çözersen gerisi için yardımcı olurum.

Bilgiler için teşekkürler.

Alıntı yapılan: ambar7 - 29 Ekim 2013, 20:45:50
İstersen birde gerçek işlemci üzerinde dene.

Simülatörün gerçek zamanlı çalışmadığı ortada.

Ama normal ccs c ile yazılan herhangi bir programda 1000 MS yaklasık 1 sn simülasyonda alıyorum. @RaMu nun ekte verdiğine göre asıl zaman hesabı o tekrar komut işleme sürelerine göz gezdirmem gerekiyor. Teşekkürler cevaplar için..