PİC PROJE ÖRNEKLERİ
  Pic Basic Pro Öğreniyoruz 10
 

 

DERS-10
 
PROGRAM ÖRNEKLERİ
 
ÖRNEK PROGRAM: 1     *********** LED ANİMASYONU***********
İşe fantezi ile başlayalım ve bir LED-ANİMASYON projesi verelim. Bu projede PortA ve PortB nin tamamı kullanılarak 16 led’den oluşan bir görsel gösteri ünitesi yapacağız. Ledler değişik şekillerde yanarak bize bir gösteri sunacaklar.
 
Önce Şemamız;
 

 
 
 
Aslında 16F628 de PortA.5 (MCLR bacağı) çıkış olarak kullanılamaz. Ancak sırf görsel amaçlı olarak bu projede simulasyon olarak denedim ve çalıştığını gördüm. Gerçekte çalışmaması gerekir. Devreyi yapacaklar için kısa bir açıklama olarak vereyim istedim.
 
Diğer taraftan gerçek devrede Pic pinleri ile Led ler arasında 330 Ohm direnç kullanılması gerekmektedir. Aksi halde Pic bozulur. BU açıklama da devreyi fiilen yapmak isteyenler içindir.
Tüm pinlere 330Ohm seri olarak LED Bağlanacak 
        
PORTA=0
TrisA=%00000000
TrisB=%00000000
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanlımııyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7    '16F628 de komparatör pinleri iptal hepsi dijital
'-----------------------------------------------------------------
I var WORD
Z VAR BYTE
W VAR BYTE
T VAR BYTE
Y var byte
SON VAR BYTE '128 - 192 -224 - 240 - 248 - 124
'-----------------------------------------------------------------
'A portundan başlayarak ledleri birer birer yakıyoruz. Sonra B portuna
'atlıyoruz. Hepsi yandıktan sonra teker söndürüyoruz. Bu sefer ikişer
'yakıyoruz ve söndürüyoruz. Üçer yakıyoruz söndürüyoruz. Bu sefer Dıştan
'içe doğru yakıp söndürüyoruz. Sonra içten dışa doğru. SOnra kara şimşek yapıyoruz.
'------------------------------------------------------------------
PORTA=0
PORTB=0
I=1:Z=2:W=1
'---------------------------ANA PROGRAM BÖÜMÜ-----------------------------------
BASLA:
     PORTA=I                        ‘1. bit den başlayarak ledleri yakıyoruz
     PAUSE 100
     I=I*2                 ‘bir sonraki bit yakıldı
     IF I<254 THEN BASLA
     PORTA=0    ‘tüm bitler yandıktan sonra portun tamamını söndür
     I=W
BIR: PORTB=I ‘Aynı işi B portu içinde yap
     PAUSE 100
     I=I*2
     IF I<254 THEN BIR
     PORTB=0
     T=I/2                ‘bu sefer geriye doğru yakıyoruz ledleri
     I=T
IKI:PORTB=I
     PAUSE 100
     I=I/2
     IF I>0 THEN IKI
     PORTB=0
     I=T
UC:PORTA=I     ‘Geriye doğru A portunu yakıyoruz
     PAUSE 100
     I=I/2
     IF I>0 THEN UC
     Z=Z+1:I=2*W+1:W=I
     IF Z<8 THEN BASLA
     PORTA=0
     I=128
     Z=1
'------------------BURAYA KADAR 1-5 SIRA ÇİFT YÖN YAKILDI----------------------- 
DORT: PORTA=I
      PORTB=Z
      PAUSE 100
      I=I/2
      Z=Z*2
     IF I>0 THEN DORT
ARA: I=1:Z=128:W=I:T=7:y=z
BES: 
      PORTA=I
      PORTB=Z
      PAUSE 100
      I=I*2
      Z=Z/2
      IF Z>1 THEN BES
      z=w:I=y
ALTI: PORTA=I
      PORTB=Z
      PAUSE 100
      I=I/2
      Z=Z*2
      IF I>1 THEN ALTI
      T=T-1:I=W*2+1:Z=DCD T+Y:W=I:Y=z
      IF I<33 then BES
      porta=0:portb=0
      I=1:Z=2:W=1:T=7
      goto basla
      END
     
ÖRNEK PROGRAM : 2          ***********OTO CAM KONTROLU*********
 
İkinci örneğimiz enteresan bir örnek olacak. 16F628 de komparatör kullanımına güzel bir örnekdir.
Projenin amacı otomobillerde motor kontrollu yan camların açılıp kapanmasını otomatik olarak kontrol etmekdir.
Cam açma butonuna kısa süreli basılır ise cam basılan süre kadar aşağı veya yukarı hareket edecek, butona biraz uzun basılması halinde ise cam otomatik olarak açılacak veya kapanacaktır. Tabiiki nereye kadar, cam son noktada gidecek yeri olmadığı için motor sıkışacak ve normalde 2 Amper dolayında motordan çekilen akım 3 amper veya daha fazlasına yükselecektir. İşte bu aşamada komparatörler devreye girerek motorun akımını keseceklerdir.
 
Motorun sıkışmasını simule edebilmek için çalışan motora paralel ikinci bir motor daha devreye sokulmaktadır. Bu sayede normalde 2 A dolayında olan çekilen akım iki katına çıkmaktadır ve sistem çekilen fazla amperi algılayıp motorları durdurmaktadır. Sistemin çekilen hangi amper seviyesinde durmasını sağlayacak ince ayarlar devrede bulunan 2 adet 220 Ohm ayarlı dirençler ile yapılmaktadır.
 
 
Önce şemamızı verelim;
 
 
 
 
 
                              
İşte Programımız;
 '****************************************************************
TRISB=%00000111
TRISA=%00001110
CMCON=3
MD      VAR BIT
ZAM     VAR BIT
TM      VAR BYTE
POZ     VAR BYTE
SURE    VAR word
TUS     VAR BYTE
CAM     VAR BYTE
ASAGI   VAR PORTB.7
YUKARI VAR PORTB.6
OPTION_REG.7=0
 
BASLA:                MD=0:TM=0:POZ=0:ZAM=0:PORTB=0:Low PORTA.0:CAM=0
TUSBAK:             TUS=PORTB & %11
CAM=CMCON.7 ‘CAM=komparatör çıkışı oluyor
Pause 1
                               IF YUKARI=1 AND SURE>0 THEN
                                    SURE=SURE+1
ENDIF
                               IF ASAGI=1 AND SURE>0 THEN
                                    SURE=SURE-1
ENDIF
                                IF TUS<3 Then DURUM   ‘TUSA BASILDI
                               IF MD=0 Then TUSBAK
                               POZ=2
                                IF CAM=1 Then KONTROL
                                IF ZAM=0 Then BASLA
                                IF POZ=0 Then BASLA
                                GOTO TUSBAK
       
CALIS: MD=1:   TM=0:POZ=1:ZAM=0    'MD=motor durumu MD=0 motor durmuş MD=1 motor çalışıyor
                               IF TUS=1 Then
                                   High ASAGI
EndIF
                               IF TUS=2 Then
                                   High YUKARI:IF SURE=0 THEN SURE=1
                               EndIF
                                PauseUs 5
              GOTO TUSBAK
       
DURUM:    IF CAM=1 Then KONTROL ‘CAM SONA DAYANDI (NORMALDE CAM=0, SIKISINCA CAM=1 OLUYOR
                       IF MD=0 Then CALIS
                       IF POZ=2 Then CEK
                       IF ZAM=1 Then TUSBAK
                      TM=TM+1
       Pause 1
       IF TM<150 Then TUSBAK    'TUS KILITLEME ZAMANI TM ILE
                      ZAM=1
      High PORTA.0
      PauseUs 200
      IF POZ<2 Then TUSBAK
                   GoTo TUSBAK
CEK:           PORTB=0
     Low PORTA.0
     TUS=PORTB & %011
      Pause 2
      IF TUS<3 Then CEK
                     GOTO  BASLA                             'POZ = tuşun hala basılı olup olmadığı poz=1.basış bırakınca Poz=2 oluyor.
 
KONTROL:         IF ASAGI=1 THEN SON
                               IF SURE>2500 THEN SON
                               LOW YUKARI
PAUSE 10
HIGH ASAGI
PAUSE 300
LOW ASAGI
SON:                     SURE=0
GOTO BASLA
 
END
               
ÖRNEK PROGRAM : 3           ***********DTMF İLE CİHAZ KONTROLU*********
 
Bu örneğimizde Telefonla cihaz kontrol sistemini inceleyeceğiz. Kısaca DTMF kontrol ismi verilen program ile bir telefon hattına bağlayacağımız sistemimizle 5-6 adet cihazı istediğimiz zaman açıp kapatabileceğiz. Arada mesafe olduğundan yapılan işlerin onayı sesli olarak  hattan verilmektedir.
Bu aleti fiziki olarakda yaptım ve kullanıyorum.
Bu devrede simulasyon imkanımız olmadığı için devre şeması vermekle yetineceğiz.;


 
 
Programa geçmeden kullanımla ilgili bazı açıklamalar vermek istiyorum.
 
Program öncelikle çalan telefon zilini saymakta ve önceden ayarlanmış adedi bulduğunda hattı otomatik olarak açmaktadır. Zilin çalma sayısı program içinden değiştirilebilmektedir.
 
Hat açıldıktan sonra program şifre girmenizi beklemektedir. Şifre 4 haneli bir rakam olup default olarak 1111 şeklinde ayarlanmıştır. Ayrıca birde master şifre vardır. Ana şifrenin unutulması durumunda master şifre girilerek şifrenin default şifre ye dönüştürülmesi sağlanmıştır.
 
Şifre girişini takiben program role kontrol bölümüne atlamaktadır. Burada ;
-          önce # tuşu sonra 1-2-3-4-5 rakamlarından herhangi birisi girildiği tatirde girilen rakama karşılık gelen role çıkışı aktif edilmekte bu durum ilgili led in yanması ile anlaşılmaktadır. Açılan rolenin sayısı kadar da hatta beep sesi verilmektedir. Örneğin 2 nolu role açılmış ise Beep – Beep şeklinde 2 adet beep sesi alınmaktadır.
-          Önce # tuşu ardından 8 tuşu girilir ise Zil çalma adedi değiştirilebilir. 8 rakamının hemen ardından yeni zil adedi girilmelidir.
-          Önce # sonra 9 rakamı girilir ise şifre değiştirilecek demektir. Burada önce eski şifre ardından yeni şifre girilmelidir.
-          Önce # ve ardından 0 rakamı girilir ise sistemden çıkış yapılır. Hat kapatılır.
-          Önce * tuşu ve ardından 0 rakamı girilir ise açık olan tüm roleler kapatılmaktadır.
-          Önce * ardından 1-2-3-4-5 rakamlarından biri girilir ise ilgili rakama karşılık gelen role kapatılır.
 
Devrede kullanılan trafo 600/600 sarımlı telefon hat trafosudur. Eski modemlerin üzerinde bulunmaktadır.
 


İşte programımız;
 
'****************************************************************
PORTA=0:PORTB=0
TRISB=%00000001   'PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=%00111111   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-----------------------------------------------------------------
SIFRE VAR WORD
RAKAM var WORD
TEMP   VAR WORD
BASKA VAR WORD
ZAMAN VAR WORD
SURE   VAR word
SAYAC VAR BYTE
SAYI   VAR BYTE
DURUM VAR BYTE
BIRLER VAR BYTE
ONLAR VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE 
ZIL    VAR BYTE    'ÇALACAK ZİL ADEDİ
X      VAR BYTE
CIK    VAR BIT
SYMBOL HAT=PORTB.0
SYMBOL CIKIS1=PORTB.1
SYMBOL CIKIS2=PORTB.2
SYMBOL CIKIS3=PORTB.3
symbol CIKIS4=PORTB.4
SYMBOL CIKIS5=PORTB.5
SYMBOL ISD =PORTB.6
SYMBOL ROLE=PORTB.7
SYMBOL VALDAT=PORTA.0
SYMBOL BUZZER=PORTA.7
 
'--------------------------------------------------------------------------
'DATA @ 0,1,2,3,4
'data @ 0,255,255,255,255,255
'DATA @ 16,5
PAUSE 200
CLEAR
read 0,SAYI:PAUSE 10
IF SAYI=$FF THEN
   SIFRE=1234
   GOSUB SIFREYAZ
endIF
READ 0,BINLER
READ 1,YUZLER
READ 2,ONLAR
READ 3,BIRLER
SIFRE=BINLER*1000+YUZLER*100+ONLAR*10+BIRLER
READ 16,ZIL
IF ZIL=255 THEN
   ZIL=5
   WRITE 16,ZIL
ENDIF  
 
'--------------------------------------ANA--------------------------------------
BASLA: Sayac=0
'-------------------------------PORTB.0=HIGH-------------
ILK:    IF HAT=1 THEN ILK
'------------------------------PORTB.0=LOW---------------
BAK:     SAYAC=SAYAC+1
BIR:     IF HAT=0 THEN BIR
'------------------------------PORTB.0=LOW-----------------
       IF SAYAC=ZIL THEN
            PAUSE 1800
            HIGH ROLE
            pause 300
            GOTO BIRINCI
         ENDIF
         SURE=0
         WHILE HAT=1
         SURE=SURE+1
         IF SURE=300 THEN ILK
         PAUSE 1
         WEND
         IF SURE<100 THEN BIR
         GOTO BAK
'------------------ZİL SAYMA BÖLÜMÜ BİTTİ------------------                                                                   
BIRINCI: :SAYAC=0:GOSUB SES1:GOSUB SES2:gosub ses1
YINE:    RAKAM=0:GOSUB SIFREAL
           IF CIK=1 THEN BITIR
           IF RAKAM=7676 THEN
              SIFRE=1234
              GOSUB SES2
              GOSUB SES1
              GOSUB SES2:gosub ses1
              GOSUB SIFREYAZ
              GOTO ROLEKONTROL
           ENDIF  
           IF RAKAM=SIFRE THEN
            GOSUB SES2:pause 50
            GOSUB SES1:pause 50
            GOSUB SES1:gosub ses1
            GOTO ROLEKONTROL
           ENDIF
           SAYAC=SAYAC+1
           IF SAYAC=3 THEN
 ATLA:        GOSUB EXIT
              SLEEP 600
              GOTO BASLA
           ENDIF  
           GOSUB SES2
           GOSUB SES1
           GOSUB SES3 
           GOTO YINE
 
ROLEKONTROL:    GOSUB ALBILGI
                IF CIK=1 THEN BITIR
                IF SAYI=12 THEN ACMA  '#
                IF SAYI=11 THEN KAPAT '*
                gosub ses2
                GOTO BASLA
ACMA:    
          GOSUB ALBILGI
          IF CIk=1 THEN BITIR
           IF SAYI=0 THEN
              gosub ses3
              GOSUB EXIT
              GOTO BASLA
           ENDIF
  
           DURUM=PORTB 
          
           IF SAYI=1 THEN
              IF durum.1=0 THEN
                GOSUB SES1
                PORTB=DURUM | %00000010
                goto ROLEKONTROL
              ENDIF
           ENDIF
          
           IF SAYI=2 THEN
              IF durum.2=0 THEN
                GOSUB SES1:GOSUB SES1
                PORTB=DURUM | %00000100
                goto ROLEKONTROL
              ENDIF 
           ENDIF     
                
           IF SAYI=3 THEN
              IF durum.3=0 THEN
                 FOR X=1 TO 3:GOSUB SES1:NEXT
                 PORTB=DURUM | %00001000
                 goto ROLEKONTROL
              ENDIF  
           ENDIF
         
           IF SAYI=4 THEN
              IF durum.4=0 THEN
                 FOR X=1 TO 4:GOSUB SES1:NEXT
                 PORTB=DURUM | %00010000
                 goto ROLEKONTROL
              ENDIF  
           ENDIF
          
           IF SAYI=5 THEN
              IF durum.5=0 THEN
                 FOR X=1 TO 5:GOSUB SES1:NEXT
                 PORTB=DURUM | %00100000 '#5
                 goto ROLEKONTROL
              ENDIF  
           ENDIF
 
           IF SAYI=8 THEN                         '#8
              GOSUB SES2
              GOSUB ALBILGI
              GOSUB SES1:gosub ses2
              IF CIK=1 THEN BITIR
                IF SAYI>0 AND SAYI<13 THEN
                   ZIL=SAYI:WRITE 16,ZIL:PAUSE 10
                ENDIF
                GOTO ROLEKONTROL
           ENDIF    
 
           IF SAYI=9 THEN        '#9
              GOSUB SIFREAL
              GOSUB SES1:gosub ses2
              IF CIK=1 THEN BITIR
                IF RAKAM=SIFRE THEN
                  GOSUB SES1:GOSUB SES1:GOSUB SES2
                  GOSUB SIFREAL
                  IF CIK=1 THEN BITIR
                  SIFRE=RAKAM
                  GOSUB SES1:gosub ses2
                  gosub SIFREYAZ
                ENDIF
           ENDIF
        GOTO ROLEKONTROL   
       
                 
KAPAT:     GOSUB ALBILGI
           IF CIK=1 THEN BITIR
           durum=PORTB
          
           IF SAYI=0 THEN
              GOSUB SES3
              PORTB=DURUM & %11000001 '*0
           ENDIF  
 
           IF SAYI=1 THEN
              IF durum.1=1 THEN
                 GOSUB SES2
                 PORTB=DURUM & %11111101
                 goto ROLEKONTROL
              ENDIF
           ENDIF  
             
           IF SAYI=2 THEN
             IF durum.2=1 THEN
                GOSUB SES2:GOSUB SES2
                PORTB=DURUM & %11111011
                goto ROLEKONTROL
             ENDIF
           ENDIF 
 
           IF SAYI=3 THEN
              IF durum.3=1 THEN
                 FOR X=1 TO 3:GOSUB SES2:NEXT
                 PORTB=DURUM & %11110111
                 goto ROLEKONTROL
              ENDIF  
           ENDIF
 
           IF SAYI=4 THEN
              IF durum.4=1 THEN
                 FOR X=1 TO 4:GOSUB SES2:NEXT
                 PORTB=DURUM & %11101111
                 goto ROLEKONTROL
              ENDIF  
           endif
 
           IF SAYI=5 THEN
              IF durum.5=1 THEN
                 FOR X=1 TO 5:GOSUB SES2:NEXT
                 PORTB=DURUM & %11011111 '*5
              ENDIF
           ENDIF
           GOTO ROLEKONTROL   
 
SIFREAL: GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=SAYI*1000
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI*100
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI*10
          GOSUB ALBILGI
          IF CIK=1 THEN RETURN
          RAKAM=RAKAM+SAYI
          RETURN     
 
ALBILGI:
         SURE=0:ZAMAN=0
         WHILE VALDAT=0
          SURE=SURE+1
          PAUSEus 270
            IF SURE=65500 THEN
              CIK=1:RETURN
            ENDIF
          WEND      
              
SAYIAL: SAYI=0
        WHILE VALDAT=1
        SAYI.0=PORTA.4
        SAYI.1=PORTA.3
        SAYI.2=PORTA.2
        SAYI.3=PORTA.1
        WEND
        IF SAYI=10 THEN SAYI=0
        RETURN
 
 
SIFREYAZ:TEMP=SIFRE         
         BINLER=TEMP DIG 3
         YUZLER=TEMP DIG 2
         ONLAR =TEMP DIG 1
         BIRLER=TEMP DIG 0
         WRITE 0,BINLER
         PAUSE 10
         WRITE 1,YUZLER
         PAUSE 10
         WRITE 2,ONLAR
         PAUSE 10
         WRITE 3,BIRLER
         PAUSE 10
         RETURN
         
SES1: SOUND BUZZER,[110,12]:pause 30:RETURN
SES2: SOUND BUZZER,[95,12] :pause 30:RETURN
SES3: SOUND BUZZER,[85,25] :pause 30:RETURN        
         
 
BITIR: GOSUB EXIT:GOTO BASLA:RETURN         
EXIT : SURE=0
       HAT=0
        CIK=0
        SAYAC=0
        RAKAM=0
        LOW ROLE
        LOW ISD
        gosub ses2
        gosub ses2
        GOSUB SES3
        GOSUB SES3
        RETURN     
 
End        
 
ÖRNEK PROGRAM : 4        ***********DİJİTAL POT (DS1868) KONTROLÜ**********
 
Dallas firmasının DS1868 kodlu dijital potansiyometre kullanımına ait bir örnek vermek istiyorum.
Söz konusu potansiyometrenin model dosyası bulunmadığından dolayı simulasyon bir shift register kullanılarak yapılmıştır.
Neticede DS1868 in içinde bir shift register bulunmaktadır ve pot değeri bu registere yazılarak sağlanmaktadır.
 
Önce şemamız;

 
 
Programımız;
 
 
'****************************************************************
 
RAW               VAR   BYTE
ZAMAN         VAR   WORD
RST                 VAR   PORTA.0
CLK                 VAR   PORTA.2
BILGI              VAR   PORTA.1
TUSA              VAR   PORTB.0
TUSB              VAR   PORTB.1
KONUM          VAR   BYTE
I                        VAR   BYTE
STK                 VAR   BYTE
                   
TRISA=%00000000
TRISB=%00000011
               
PORTB=0
PORTA=0
ZAMAN=0
STK=1
PAUSE 500
konum=0
raw=0
I=0
               
               
BASLA:
                IF TUSA=0 THEN
                   IF I=1 THEN BASLA
                   if konum=255 then basla
                   konum=konum+1:I=1:GOTO CIK
                ENDIF 
               
                 IF TUSb=0 THEN
                    IF I=1 THEN BASLA
                   if konum=0 then basla
                   konum=konum-1:I=1:GOTO CIK
                ENDIF  
             
                IF RAW<>KONUM THEN GOSUB POTYAZ
                I=0
CIK:        GOTO BASLA
   
   
   
POTYAZ:     HIGH RST:PAUSE 1
                      HIGH BILGI
                      PULSOUT CLK,1
                      SHIFTOUT BILGI,CLK,1,[KONUM]
                      SHIFTOUT BILGI,CLK,1,[KONUM]  
                     LOW RST:PAUSE 1
                     RAW=KONUM                                             
                      RETURN
  
                      end  
 
 
 
 
ÖRNEK PROGRAM :   5    **************FREKANSMETRE – PALS SAYICI*******************
 
Bu örneğimizde Bir Frekansmetre yapacağız. Bu programda Pic16F628 kullanacağız. 16F628 de 16 bitlik TMR1 sayacını dışarıdan gelen palsleri sayacak şekilde ayarlayıp sonuçta belirli örnekleme süreleri kullanarak frekans veya pals sayacı olarak kullanacağız.
Frekans ölçme aralığımız kullandığımız örnekleme süresine bağlı olarak 1 Hz ile yaklaşık 40 MHz arasında olacaktır. Teorik olarak üst sınır 65 MHz dolayındadır. Ancak kullanılan malzemeler bu frekanslara çıkmadığı için denemelerle sabit olan ölçülebilecek maksimum frekans yaklaşık 40 MHz dolayındadır. Ancak frekans kaynağından Pic’e direkt giriş yapabilirseniz bu durumda üst sınır yükselebilmektedir.
Frekansmetre’nin üst ölçüm sınırını daha da yukarı çekebilmek için arada birde 64’e bölücü (U664) kullanılmaktadır. Bu durumda üst ölçüm sınırı 1,2 GHz ye kadar çıkabilecektir.
Program PicBasicPro ile birlikte ASM nin kullanılmasına iyi bir örnekdir. BU programda frekans ölçümünde kullanılacak olan örnekleme süreleri için ASM kullanılmıştır. Zira, 1ms – 10 ms – 100 ms ve 1000 ms lik süreleri hassas olarak elde etmenin en iyi yolu ASM kullanmaktır. Temel mantık olarak düşük frekanslarda büyük süre yüksek frekanslarda ise düşük süre kullanılarak ölçüm yapılmaktadır.

Programı İsis de simule edebilmek için basit bir devre kullanıyoruz. Önce bu devremizi verelim;
 

 
Programda TMR1 kullanıldığını söylemiş idik. TMR1 şayet dışarıdan gelen pals leri sayacak ise giriş bacağı olarak yalnızca PortB.6 pini kullanılmaktadır. Dolayısıyla programda da bu bacak kullanılmıştır.
 
Program girilen frekansa bağlı olarak ölçüm modu (örnekleme süresi) seçimini otomatik yapmaktadır. Bunu anlayabilmek için önce bir kısa süreli ölçüm yapmakta ve bulduğu değere bağlı olarak mod seçmektedir.
 
İşte Programımız;
 
'****************************************************************
 
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_off
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_ON
@ DEVICE pic16F628, HS_OSC
DEFINE OSC 10
DEFINE LCD_DREG     PORTA
DEFINE LCD_DBIT     0
DEFINE LCD_RSREG    PORTB
DEFINE LCD_RSBIT    2
define LCD_RWREG    PORTB
DEFINE LCD_RWBIT    1
DEFINE LCD_EREG     PORTB
DEFINE LCD_EBIT     0
DEFINE LCD_BITS     4
DEFINE LCD_LINES    2
DEFINE LCD_COMMANDUS 4000             
DEFINE LCD_DATAUS    250
 
 
TRISA=0
TRISB=%11111000
low PORTB.1
 
'-------------------------------------------------------------------------------
Frekans     var word
FrekansL    var Frekans.byte0
FrekansH    var Frekans.byte1
sure     VAR WORD
sureL    var SURE.Byte0
sureH    var SURE.Byte1
 
TOPLAM   var word
sayac    var word
counter var byte
HAS      VAR BYTE
I        var byte
 
X        var bit
Z        VAR  BIT
ilk      var bit
SEC      VAR PORTB.7
'------------------------------------------------------------------------------- 
 Z=0    
 CMCON=7
 has=0:ilk=0
 lcdout $FE,1
 lcdout "***EROL ERDAL***"
 lcdout $FE,$C0,"**FREKANSMETRE**":pause 300
 
'******************************* FREKANSMETRE***********************************
START:  
'         gosub olc
'         gosub modsec
'         lcdout $FE,1,"fre:",#frekans," mod=",#has,"S=",#SEC
'         pause 500:goto start
ATLA:    IF SEC=1 THEN
          HAS=4:goto birinci
          else
          gosub MODSEC
         endif
         pause 200
        
Birinci: SELECT CASE has
'----------bölücüsüz ölçüm--- Mode=0-------0 Hz - 65 KHz.----------------------
         CASE 0
         gosub binms
         Lcdout $FE,$80,"0-65 KHz : MOD=",#has
         if frekans<1000 then
         Lcdout $FE,$C0,"Fre:",#frekans," Hz        "
         gosub tus
         goto ATLA
         endif 
         sayac=frekans/1000:Toplam=(frekans//1000)
         Lcdout $FE,$80,"0-65 KHz : MOD=",#has
         Lcdout $FE,$C0,"Fre:",#sayac,".",dec3 Toplam," Hz    "
         GOSUB TUS
        ' pause 500
         goto ATLA
'----------bölücüsüz ölçümler ---Mode=1-------65 KHz.- 650 KHz-------------------  
         CASE 1
         gosub yuzms
         Sayac=frekans/100:Toplam=(frekans//100)
         Lcdout $FE,$80,"65-650KHz: MOD=",DEC has
         Lcdout $FE,$C0,"Fre:",#Sayac,",",#Toplam," KHz "
         GOSUB TUS
        ' pause 500
         GOTO ATLA
        
'---------BÖLÜCÜSÜZ ÖLÇÜMLER----Mode=2------650 KHz - 6,5 MHz-------------------
         CASE 2
         gosub onms
         sayac=frekans/10:Toplam=(frekans//10)
         Lcdout $FE,$80,"065-6 MHz: MOD=",#has
         if sayac<1000 then
         Lcdout $FE,$C0,"Fre:",#sayac,",",dec3(Toplam*100)," KHz "
         gosub tus:goto ATLA
         endif
         toplam=sayac/1000
         lcdout $fe,$C0,"Fre:",#toplam,",",#(sayac//1000)," MHz     "        
         gosub tus
         goto ATLA
 
 '---------BÖLÜCÜSÜZ ÖLÇÜMLER------Mode=3------6,5 MHz - 30 MHz-----------------
         CASE 3
         gosub Birms
         sayac=frekans
         toplam=sayac/1000
         Lcdout $FE,$80,"6,5-50MHz: MOD=",#has
         lcdout $fe,$C0,"Fre:",#toplam,",",#(sayac//1000)," MHz    "        
         gosub tus
'         pause 500
         goto ATLA
               
'---------BÖLÜCÜ İLE ÖLÇME BÖLÜMÜ----Mode=4------30 mhZ - 1200 mhZ--------------
         case 4
         gosub birms
         sayac=Frekans**64
         frekans=div32 10
         sayac=frekans/100:Toplam=(frekans//100)
         Lcdout $FE,$80,"50 MHz>:   MOD=",#has
         Lcdout $FE,$C0,"Fre:",#Sayac,",",dec3 (Toplam*10)," MHz   "
         gosub tus
'         pause 500
         Goto ATLA
 '------------modların sonu ----------------------------------------------------
          case 5                          
          HAS=0:GOTO START  
          END SELECT
          Z=0
          GOTO START
'                  
TUS:      if PortB.3=1 then
          IF Z=1 THEN CIK
          has=has+1:pause 1
          IF has=5 THEN has=0
          Z=1
          RETURN
          ENDIF
          Z=0             
CIK:      RETURN
'--------------------------------MODSEC-----------------------------------------
MODSEC: 'pause 5:gosub olc':return
         pause 100
'         if frekans>340 then
'           has=4:RETURN
'         endif
'         if (frekans>43) and(frekans<217) then
'           has=3:RETURN
'         endif  
         gosub birms
         if Frekans<66 then has=0
         if frekans>65 and frekans<651 then has=1
         if frekans>650 and frekans<6501 then has=2
         if Frekans>6500 and Frekans<32001 then Has=3
'         IF frekans >50000 THEN HAS=4 
         return
 
OLC:
   ASM
                movlw     0x01
                movwf     _SureL
                movlw     0x03
                movwf     _SureH
delay_0
                btfss portb,6
                goto   tamamolc
                decfsz    _SureL, f
                goto        $+3
                decfsz    _SureH, f
                goto        Delay_0
                Goto    son 
tamamolc
                call   zaman
                movlw     0x01
                movwf     _SureL
                movlw     0x01
                movwf     _SureH
Delay_1
                decfsz    _SureL, f
                goto        $+2
                decfsz    _SureH, f
                goto        Delay_1
                goto        $+1
                Goto    son 
zaman
                bcf STATUS,RP0
                bcf STATUS,RP1
                 clrf TMR1L
                clrf TMR1H
                movlw 7    
                movwf T1CON
                return
                endasm
Binms:
ASM
                movlw     0x20   
                movwf     _SureL  
                movlw     0x80   
                movwf     _SureH   
                movlw     0x06
                movwf     _Counter 
delay_2
                btfsc   portb,6
                goto tamambin
                decfsz    _SureL, f
                goto        delay_2
                decfsz    _SureH, f
                goto        $+2
                decfsz    _Counter, f
                goto        Delay_2
                goto son
tamambin  
    call    zaman
                movlw     0x19   
                movwf     _SureL  
                movlw     0x74   
                movwf     _SureH   
                movlw     0x06
                movwf     _Counter 
Delay_3
                decfsz    _SureL, f
                goto        $+2
                decfsz    _SureH, f
                goto        $+2
                decfsz    _Counter, f
                goto        Delay_3
                Goto son
                endasm
   
Yuzms:
    ASM
                movlw     0x4e      
                movwf     _SureL
                movlw     0xCa      
                movwf     _SureH  
Delay_4
                btfsc   portb,6
                goto tamamyuz  
                decfsz    _SureL, f
                goto        delay_4
                decfsz    _SureH, f
                goto        $+2 
                goto son
tamamyuz 
                movlw     0x4f      
                movwf     _SureL
                movlw     0xC4      
                movwf     _SureH
                call   zaman
      
Delay_5
                decfsz    _SureL, f
                goto        $+2
                decfsz    _SureH, f
                goto        Delay_5
                goto        $+1
                 Goto    Son
                endasm
   
Onms:
    asm
                movlw     0x86
                movwf     _SureL 
                movlw     0x20  
                movwf     _SureH 
Delay_6
                btfsc   portb,6
                goto   tamamon
                decfsz    _SureL, f
                goto        delay_6
                decfsz    _SureH, f
                goto        $+2
                goto   son
Tamamon
                movlw     0x87
                movwf     _SureL 
                movlw     0x14  
                movwf     _SureH
                call    zaman
Delay_7
                decfsz    _SureL, f
                goto        $+2
                decfsz    _SureH, f
                goto        Delay_7
                goto        $+1
                goto   son
                endasm
Birms:
    ASM
                movlw     0xf2
                movwf     _SureL
                movlw     0x04
                movwf     _SureH
Delay_8
                btfsc   portb,6
                goto    tamambir  
                decfsz    _SureL, f
                goto        delay_8
                decfsz    _SureH, f
                goto        $+2
                goto        son   
tamambir  
                call     zaman
                movlw     0xf2
                movwf     _SureL
                movlw     0x02
                movwf     _SureH
               
Delay_9
                decfsz    _SureL, f
                goto        $+2
                decfsz    _SureH, f
                goto        Delay_9
                goto        $+1
son 
                nop
                movlw 6   
                 movwf T1CON
                movf TMR1L,0
                 movwf _FrekansL
                 movf TMR1H,0
                 movwf _FrekansH
                endasm
RETURN
   
      END
 
  Bugün 1 ziyaretçikişi burdaydı!  
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol