PİCBASİC de bir modifiye sorusu:) MB1502 PLL

Başlatan sozkarabacak, 26 Şubat 2009, 22:46:41

sozkarabacak

Elimizde yine bu forumdan bir arkadaşımızın yazdığı aşağıdaki yazılım var bu yazılım tek kanal olarak bizim mb1502 pll entegresine data yollayarak çok sağlıklı bir şekilde kilitliyebiliyor.
ELİMİZDEKİ YAZILIM:
'**************************************************************** 
'*  Name    : MB1502.BAS                                      * 
'*  Author  : [select VIEW...EDITOR OPTIONS]                    * 
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] * 
'*          : All Rights Reserved                               * 
'*  Date    : 02.01.2008                                        * 
'*  Version : 1.0                                               * 
'*  Notes   :MB1502 PLL SÜRÜCÜ                                                   * 
'*          :                                                   * 
'********************   TANIMLAR   ****************************** 
 
@ DEVICE pic16F628                                                   
@ DEVICE pic16F628, WDT_OFF              
@ DEVICE pic16F628, PWRT_ON 
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT              
@ DEVICE pic16F628, PROTECT_OFF  
'***********************  DEĞİŞKEN VE SABİTLER  ****************** 
DTT VAR PORTA.1 
CL VAR PORTA.0  
LE VAR PORTA.2    
REF VAR Word      
SW VAR Bit     
N VAR Word       
A VAR Byte        
X VAR WORD   
'***********************  AYARLAR  ******************************** 
CMCON=7                
OPTION_REG.7=1  
'***********************  GİRİŞ ÇIKIŞ AYARLARI  ******************* 
TRISA=%11111000  
TRISB=%11111111  
'*******************  DEĞER ATAMASI  ****************************** 
SW=0     'Prescaler değeri 128 seçildi. 
REF=160  '4 MHz Xtal ile karşılaştırma frekansı 25 KHz seçildi.  
N=57     '184,600 MHz frekansına göre "N" değeri 
A=88     '184,600 MHz frekansına göre "A" değeri 
'*******************  PROGRAM ANA BÖLÜM  *************************** 
BASLA: 
GoSub HESAP  
GoSub GONDER 
GoTo BASLA 
'*************************  HESAP  ********************************* 
HESAP: 
X=((128*N)+A) 
X=X/40 
Return 
'*******************  PLL ENTEGRESİNE VERİ GÖNDER (ara program)  **** 
GONDER: 
DTT=0:CL=0:LE=0     
shiftout DTT,CL,1,[SW\1,REF\13,1\1]  
PulsOut LE,10 
PAUSE 50                     
shiftout DTT,CL,1,[N\11,A\7,0\1]    
PulsOut LE,10                     
PAUSE 50 
DTT=%0:CL=%0:LE=%0      
Return   

End


Şimdi dikkat ederseniz burda bir A değeri var bu A değeri 25 KHZ değere sahip aşağıdaki şemadanda göreceğiniz üzere ben dip swichlere değer atayarak bir frekans etrafında gezmek istiyorum bunu bu programa nasıl ekleriz?
Şema:


Şöyle ki diyelim 1 nolu dip swici on konuma aldık 88 olan a değerini 87 yapacak ve frekans 25 khz düşmüş olacak. Diyelim 3 nolu dip swici on konuma aldık o anki kombinasyonun değeri olan a değerini 3 azaltacak yani frekansı 75 khz azaltmış olacak.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

tyildizak

Hocam, şöyle olabilir sanırım:

'****************************************************************
'*  Name    : MB1502.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 02.01.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :MB1502 PLL SÜRÜCÜ                                                   *
'*          :                                                   *
'********************   TANIMLAR   ******************************
 
@ DEVICE pic16F628                                                   
@ DEVICE pic16F628, WDT_OFF             
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT             
@ DEVICE pic16F628, PROTECT_OFF 
'***********************  DEĞİŞKEN VE SABİTLER  ******************
      DTT VAR PORTA.1
      CL VAR PORTA.0 
      LE VAR PORTA.2   
      REF VAR Word     
      SW VAR Bit     
      N VAR Word       
      A VAR BYTE       
      X VAR WORD   
'***********************  AYARLAR  ********************************
      CMCON=7               
      OPTION_REG.7=1 
'***********************  GİRİŞ ÇIKIŞ AYARLARI  *******************
      TRISA=%11111000 
      TRISB=%11111111 
'*******************  DEĞER ATAMASI  ******************************
      SW=0     'Prescaler değeri 128 seçildi.
      REF=160  '4 MHz Xtal ile karşılaştırma frekansı 25 KHz seçildi. 
      N=57     '184,600 MHz frekansına göre "N" değeri
      
'*******************  PROGRAM ANA BÖLÜM  ***************************
      BASLA:
      A=88     '184,600 MHz frekansına göre "A" değeri
      gosub test_A             
      GoSub HESAP 
      GoSub GONDER
      GoTo BASLA
'*************************  HESAP  *********************************
      HESAP:
      X=((128*N)+A)
      X=X/40
      Return
'*******************  PLL ENTEGRESİNE VERİ GÖNDER (ara program)  ****
      GONDER:
      DTT=0:CL=0:LE=0     
      shiftout DTT,CL,1,[SW\1,REF\13,1\1] 
      PulsOut LE,10
      PAUSE 50                     
      shiftout DTT,CL,1,[N\11,A\7,0\1]   
      PulsOut LE,10                     
      PAUSE 50
      DTT=%0:CL=%0:LE=%0     
      Return   



'*************************  HESAP(A)  *********************************

test_A:

     if portb.0 = 1 then A = A  - 1      
     if portb.1 = 1 then A = A  - 2
     if portb.2 = 1 then A = A  - 3
     if portb.3 = 1 then A = A  - 4
     if portb.7 = 1 then A = A  + 1
     if portb.6 = 1 then A = A  + 2
     if portb.4 = 1 then A = A  + 3
     if portb.5 = 1 then A = A  + 4

     return

End



portb ilk dört biti sırasıyla A(88 ) değerini 1,2,3 ve 4 azaltıyor,üst 4bit ise artırıyor.

sozkarabacak

Teşekkür ederim. Deneyip sonuç hakkında bilgi vereceğim.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

askuzucu

öyle yaparsanız dip swich den dolayı a değeri sürekli değişir.
bunun yerine en kolayı;

'A=88    A Değer atamasını iptal et
A=PORTB  'a değeri ikilik sistemde port b den okunacak

böyle yaparsan direkt portb den A değerini girebilirsin.

Kodu ben denememiş idim.sıkıntı çıkardı mı?

tyildizak

Alıntı yapılan: "askuzucu"öyle yaparsanız dip swich den dolayı a değeri sürekli değişir.


Hocam, bunu ben de düşündüm, böyle yapmaktaki amacım, dip-switch pozisyonu değiştirildiğinde cihazı resetlemeden yeni değeri pll entegresine basmaktı, zaten sürekli ardarda ayarlanan değeri gönderiyor

(ayrıca, değer dip-switchten dolayı sürekli değişmez, dip-switch neye ayarlıysa o değerde sabit kalır, ta ki dip konumu değiştirilene kadar.)

askuzucu

Bir yanlış anlama oldu, kusura bakmayın.
a değerini ana gövdenin içine yerleştirmişsiniz.ona dikkat etmemişim.
bu durumda çalışır...
benim tavsiyemde de A değeri ana gövde içinde olmalı.

sozkarabacak

Yazılımı denedim bu haliyle çalışıyor ama bazı sorunlar var. Birinci sorun dip swici birkaç kere ileri geri yapınca algılıyor. İkinci sorun değişen değer dip eski pozisyonuna alınınca eski frekans geri gelmiyor gidiş o gidiş:) Ben düşündüm bu durumu şuna bağladım bu hesaplamada tersi durum belirtilmemiş acaba ondan olabilir mi?
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

OG

PORTB dirençleri yok. Pullup aç
OPTION_REG.7=0
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

tyildizak

@OG üstat, evet, şemada gözden kaçırmışım, hatta pull-down olarak algılamışım, tabii bu durumda bağlıyken portb pull-up'ları da option_reg'den aktif edilirse, dip switch'ler on konumunda bağlı oldukları portu gnd'a çekecekler, bu yüzden en sondaki if "1" koşulları 0 olmalı.
Toparlarsak:


'****************************************************************
'*  Name    : MB1502.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 02.01.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :MB1502 PLL SÜRÜCÜ                                                   *
'*          :                                                   *
'********************   TANIMLAR   ******************************
 
@ DEVICE pic16F628                                                   
@ DEVICE pic16F628, WDT_OFF             
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT             
@ DEVICE pic16F628, PROTECT_OFF
'***********************  DEĞİŞKEN VE SABİTLER  ******************
      DTT VAR PORTA.1
      CL VAR PORTA.0
      LE VAR PORTA.2   
      REF VAR Word     
      SW VAR Bit     
      N VAR Word       
      A VAR BYTE       
      X VAR WORD   
'***********************  AYARLAR  ********************************
      CMCON=7               
      OPTION_REG.7=0
'***********************  GİRİŞ ÇIKIŞ AYARLARI  *******************
      TRISA=%11111000
      TRISB=%11111111
'*******************  DEĞER ATAMASI  ******************************
      SW=0     'Prescaler değeri 128 seçildi.
      REF=160  '4 MHz Xtal ile karşılaştırma frekansı 25 KHz seçildi.
      N=57     '184,600 MHz frekansına göre "N" değeri
     
'*******************  PROGRAM ANA BÖLÜM  ***************************
      BASLA:
      A=88     '184,600 MHz frekansına göre "A" değeri
      gosub test_A             
      GoSub HESAP
      GoSub GONDER
      GoTo BASLA
'*************************  HESAP  *********************************
      HESAP:
      X=((128*N)+A)
      X=X/40
      Return
'*******************  PLL ENTEGRESİNE VERİ GÖNDER (ara program)  ****
      GONDER:
      DTT=0:CL=0:LE=0     
      shiftout DTT,CL,1,[SW\1,REF\13,1\1]
      PulsOut LE,10
      PAUSE 50                     
      shiftout DTT,CL,1,[N\11,A\7,0\1]   
      PulsOut LE,10                     
      PAUSE 50
      DTT=%0:CL=%0:LE=%0     
      Return   



'*************************  HESAP(A)  *********************************

test_A:

     if portb.0 = 0 then A = A  - 1     
     if portb.1 = 0 then A = A  - 2
     if portb.2 = 0 then A = A  - 3
     if portb.3 = 0 then A = A  - 4
     if portb.7 = 0 then A = A  + 1
     if portb.6 = 0 then A = A  + 2
     if portb.4 = 0 then A = A  + 3
     if portb.5 = 0 then A = A  + 4

     return

End

sozkarabacak

Öncelikle şunu belirteyim yazılımın A değerini azaltma arttırma işlemi bu son haliyle tıkır tıkır çalıştı ilgilenen arkadaşlara teşekkür ediyorum.
Alıntı yapılan: "askuzucu"
Kodu ben denememiş idim.sıkıntı çıkardı mı?

Yazılımın frekans kısmında şöyle bir sorun var. Benim hesaplamalarıma göre bölücü 128 seçilmiş ve referans 160 olduğunda 184.600 frekansı için n=57 a=88 oluyor.

Bu değerleri yazıp sistemi çalıştırınca osilatör 183.800 frekansında çalşıyor. A değeri ile nekadar oynarsak oynayalım 60 lı değerlerden sonra a değeri hesaplamayı etkilemiyor yani a=100 de yazsak birşey değişmiyor ama a değeri 60 lı değerlerin altında mantık olarak 25 khz kaydırıyor. N değeride gerekli değerlerde çalışıyor. Bende bu sorunu şöyle bir denemeyle çözdüm ama deneme yanılma ile tabi rferans değerini 159 yaptım. Bu şekilde istediğim frekansa deneme yanılma ile getirdim.

Aklıma birde şu geldi benim yazılım denediğim devrede mb1502 nin 4mhz referans osilatörünün kristaline 0/6pf değerlikli bir trimer bağlı be trimer belki yetersiz kalıyor olabilir tabi.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

askuzucu

Kristal frekansını kontrol et.datasheet teki hesaplar doğrudur.datasheet demiş ki;

PULSE SWALLOW FUNCTION
fvco  = [(PxN)+A] x fosc ÷ R
fVCO: Output frequency of external voltage controlled oscillator (VCO)
N: Preset divide ratio of binary 11-bit programmable counter (16 to 2047)
A: Preset divide ratio of binary 7-bit swallow counter (0≤A≤127, A<N)
fOSC: Output frequency of the external reference frequency oscillator
R: Preset divide ratio of binary 14-bit programmable reference counter (8 to 16383)
P: Preset modulus of external dual modulus prescaler (64 or 128)

buraya baktığın zaman anlaşılıyor zaten."A" bölücüsünün alacağı değer 0 ile 127 arasında olabilir ve "A" değeri "N" değerinden küçük olmalıdır.
frekens hesabında sorun yok:datasheete göre hesaplayacaksın.yazılımda görülen kısım girilen "A" ve "N" değerlerine göre frekansı ekranda görebilmek içindi.sonuçta bu bir deneme yazılımı...
kristal bacaklarına bağlı kapasiteler ile kalibrasyonu düzeltebilirsin.

askuzucu

istediğin frekans için şu değerleri dene;
REF=160
P=64
N=115
A=0 ile 114 arası
bu durumda n değerini değiştirmeden 184.000 dan 186.850 ye kadar ayarlayabilirsin.
184.600 için A=24 olur.
Sadece A değerini kullanarak kanal değiştirecek isen bu frekanslarda prescaler 64 e ayarlı olması daha mantıklı.
daha yüksek frekanslarda  f/128 yapabilirsin.
REF değerini değiştirme.4 MHz kristalde ref değerini 159 yaparsan step 25 KHz değil, 25.157 KHz olur...

sozkarabacak

Evet eğer N değerei büyük olmalıdır A değerinden kuralı varsa o zaman programın çalışması normal demektir. Ben bu yazılımı başka bir arkadaşın yaptığı devrede denediğim içim bölücüyü 128 olarak seçmişti ondan o şekil denedim. Teşekkürler. Bu mantıkta galiba N değerinide aynı şekilde gövdenin içine alsak bir dip swicide ona atasak çalışır değil mi mantıken.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

askuzucu

Önbölücü seçimi önemli değil.mb 1502 registerinden atanıyor.64 de seçsen çalışır, 128 de.ama 64 seçersen a bölücüsü ile değiştireceğin kanal sayısı artar. n değerini de değiştirirsin.ama bu iş pratik değil.frekansa dayalı a ve n değerini işlemciye hesaplatmak en mantıklısı.aslan korhan ın bir yazılımı vardı.onu incele.

sozkarabacak

Şimdi şu noktada o zaman ben datasheeti yanlış yorumlamışım datasheetten ben şunu anlamıştım datasheette SW diye bir uç var onu 1 yapınca bölücü 64 oluyor şaseye çekip 0 yapınca bölücü 128 oluyor. Ben böyle anlamıştım. yanlış mı anlamışım. Bölücü seçimi için donanımla oynamak gerek miyor mu?
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]