Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

4us kare dalga

Başlatan cevat, 24 Eylül 2007, 22:31:34

OG

Min bekleme=1 komut işlem süresi "NOP"

16 serisi için
20MHz de = 0,2usn
4MHz de= 1usn
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

XX_CİHAN_XX

Alıntı yapılan: "mech"2us bekleme için 20MHz yeterli olur mu? Çünkü bildiğim kadarıyla, 4MHz'de minimum 24 us'lik gecikme elde edilebiliyor(picbasic'te).
LOOP 
      MOVLW      .3 
      XORWF      PORTA,F 
      GOTO      LOOP

Bu kodlardaki loop dongusu her 4uS de bir porta,0 ve porta,1 pinlerinin konumunu değiştirir(yani bu pinlerden kare dalga çıkarır)
Burada 4mhz lik kristal ile bu işlemin gecikmesi 4uS dir bu süreyi daha aşağı çekmeniz mümkün değildir.
Bu işlemleri minimum 4uS sürede yapıldığına göre 2 uS ve daha aşağı gecikmeler için 4mhznin üstünde bir kristal kullanman gerekmektedir.10mhz yada 20mhz ile rahatlıkla 2us icersinde bu işlemleri yapabilirsin.
Gelelim picbasic olayına.Ben basic kullanmam dolayısıyla sana örnek kod veremiyeceğim ancak bu tür hızlı işlemlerde pause komutu kullanılmamalıdır. basic içersinde asm ye geçerek yukarıda yazdıgım gibi basit komutlar ile kare dalga üretilebilir hasas zaman ayarları nop komutları ile ayarlanabilir.Sen pasue kullanarak yukarıda örnek kod yazmışsın mesela.Verdiğin hex kodun uzunluguna bak birde benım asm de yazdıgım bu kodlardaki hex uzunluguna bak(ustelık benım kodlarda buton sorgusuda var)Asm ne kadar az yer kaplamış.Dolayısıyla daha hızlı çalışlmaktadır.Hangi komutun kaç uS de işlendiği bellidir.Ama basic te birçok komutun nekadar surede işlendiğini bilmeyiz oturup incelememiz gerekir.Bu nedenle bu tür hızlı çalışması gereken ve hasas zaman isteyen programları asm kullanarak yazmak gerek.Basic kullansanız bile asm ye geçip işinizi görüp tekrar basice geçebilirsiniz.Biraz çenem düştü sanırım neyse iyi çalışmalar.
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.

cevat

Microchipin MPASM la denedim sizin asably texti hatasız bir şekilde hex kodu almayı başardım sonunda :) pic 16f84a ya yükledim çıkış alabildim iki pinden
b0 porta (-) eksi verince çıkış alıyorum.ekside vermesem bir kablo bile deydirsem çıkış alıyorum .besleme voltajı kesince çıkış  duruyo.program tamam.sağolun

cevat

Çıkış aldığımız kare dalgaların  boy uzunluklarını değiştirirebilirmiyim? Değiştirebilirsem assebelyin hangi komutlarıyla oynamak gerekir.

XX_CİHAN_XX

cevat bu ne kadar gecikme yapmak istediğini bağlı.Birkaç uS daha yavaşlatmak istiyorsan NOP komutunu ekleyerek her eklediğin noktaya 1uS bekleme katabilirsin.Ancak daha büyük gecikmelerde döngü kurarak doldur-boşalt yöntemi ile gecikme sağlayacaksın.Assembly bu bakımdan kullanması biraz daha zor bir dildir.Basicteki gibi pause 10 diyerek 10mS lik gecikmeyi sağlayan bir komut yoktur.Oturup 10Ms için ne kadarlık bir döngü kuracam diye hesaplaman ve o şekilde birkaç satırlık bir gecikme alt programı yazman gerekir.Mesela verdiğim programdaki gecikmeyi 4uS den 10uS ye çıkarmak istersen aşağıdaki kou bir incele.

     LIST      P=16F84 
      INCLUDE      "P16F84.INC" 
      __CONFIG   _XT_OSC & _WDT_OFF & _CP_OFF 
      ORG         0x00 
      CLRF      PORTA 
      BSF         STATUS,5 
      MOVLW      0xFC 
      MOVWF      TRISA 
      MOVLW      0xFF 
      MOVWF      TRISB 
      CLRF      OPTION_REG 
      BCF         STATUS,5 
START 
      BTFSC      PORTB,0 
      GOTO      START 
      BSF         PORTA,0 
LOOP 
      MOVLW      .3            ;1uS 
      XORWF      PORTA,F   ;1uS
      NOP                          ;1uS
      NOP                          ;1uS
      NOP                          ;1uS
      NOP                          ;1uS
      NOP                          ;1uS
      NOP                          ;1uS
      GOTO      LOOP          ;2uS 
      END

Görüldüğü gibi 4uS lik bu döngünün içine 6 NOP komutu ekleyerek döngüyü 10uS ye yükselttim.Fakat daha yüksek gecikmeler için dediğim gibi döngü kurmak gerekir.
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.

cevat

10us hex koduda bu şekilde oluyo.peki aynı pinlerden   4us sonra 12us  sonra 14us daha sonra 10us peşpeşe tren misali gibi çıkış almak istersek nasıl yazmalıyız kodu nereyle oynama yapmak gerekiyor start bölümden başlamalı mı. Nasıl?

tyildizak

@cevat kardeşim, ben bu işi öğreneceğim diyorsan, kesinlikle şu kitabı al ve bölüm bölüm çalış:

Mikrodenetleyiciler ve  Pic programlama / Orhan Altınbaşak(Link)

cevat

Cihan kardeş lütfen bu zamanlarla ilgili kodlarıda verebilsen işin diğer mantığını anlamak açısından daha iyi olucak.kitabıda alıcam

XX_CİHAN_XX

Tam olarak yapmak istediğini açık yazsaydın daha iyi olurdu ama sanırım şöyle birşey istiyorsun.
     LIST      P=16F84 
      INCLUDE      "P16F84.INC" 
      __CONFIG   _XT_OSC & _WDT_OFF & _CP_OFF 
      ORG         0x00 
      CLRF      PORTA 
      BSF         STATUS,5 
      MOVLW      0xFC 
      MOVWF      TRISA 
      MOVLW      0xFF 
      MOVWF      TRISB 
      CLRF      OPTION_REG 
      BCF         STATUS,5 
START 
      BTFSC      PORTB,0 
      GOTO      START 
      BSF         PORTA,0 
LOOP 
      CALL	uS6         ;2uS	
      CALL	uS10        ;2uS
      CALL	uS15        ;2uS	
      GOTO      LOOP        ;2uS BU SATIR 2uS HARCADIGI ICIN SON YAZDIGIM uS15 ALTPROGRAMI 2uS KADAR KISALTILDI

uS6
      MOVLW      .3         ;1uS 
      XORWF      PORTA,F    ;1uS
      RETURN 	            ;2uS

uS10
      MOVLW      .3         ;1uS 
      XORWF      PORTA,F    ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      RETURN 	            ;2uS

uS15
      MOVLW      .3         ;1uS 
      XORWF      PORTA,F    ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
      NOP                   ;1uS
;      NOP                   ;1uS--->BU SATIR IPTAL EDILDI
;      NOP                   ;1uS--->BU SATIR IPTAL EDILDI
      RETURN 	            ;2uS
      END

NOT: Son yazdığım uS15 isimli alt programdan normalde olması gereken iki NOP satırını eksilttim çünkü bu altprogram bitiminde 2uS lik gecikme sağlayan GOTO satırı geliyor.
Birde normalde bukadar çok NOP kullanmana gerek yok ben rahat anla diye bu şekilde yaptım.Normalde bir sayac registeri açıp saydırma yaparsın ve bu şekilde gecikme sağlarsın ancak o kitabı aldıktan sonra sayaç mevzularına girersin şimdilik bu şekilde bilsen yeterli.
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.

XX_CİHAN_XX

Bu arada şunuda eklemek isterim dikkat edersen uS6 ile başladım.
CALL ile bu şekilde çağırma yaparsan altprogram çağırma ve geri dönüş gecikmelerin yüzünden minimum 6uS luk bir gecikme ortaya çıkıyor sen bunu dahada aşağıya mesela 4uS ye indirmek istersen orada CALL kullanmadan direk o alt programın içini yazıcaksın (ilk örneğimde gösterdiğim gibi)....
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.