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