avatar_ete

TEA5767 PIC16F628 Dijital PLL kontrollü FM Radyo Alıcı Sistemi

Başlatan ete, 28 Ağustos 2011, 14:14:12

ete

Uzun zamandır yeni bir proje yayınlamamıştım. Bunun sebepleri var elbette. Proje çok ama yayınlama isteğim yok.

Çünkü sürekli olarak projelerimi ticari mal haline getirip satıyorlar. Diyeceksiniz ki ne karışıyorsun sen açık kodu veriyorsun devreyide veriyorsun gerisi yapanın insafına kalmış. Ama durum öyle değil. İş ticarete gelince yapanın hakkınıda düşünmek gerekir. Her neyse hiç bir projemin ticari mal olarak satılmasına razı değilim bunu herkesin bilmesini istiyorum. Satmak isteyen banden izin alması gerekir.

Evet gelelim yeni projeye, bir "Dijital ve PLL kontrollü FM Radyo Alıcı Sistemi"  vereceğim. Bazılarına basit bir proje gibi gelebilir. Ama sistem geliştirmeye çok açık bir proje. Şu anda piyasada olan en modern radyoların tüm özelliklerini taşımasına rağmen kısıtlı imkanlar nedeni ile basite indirgeyerek yaptım bu projeyi. Bu bir tam digital PLL kontrollü FM radyo projesidir.









Radyo-57_YEN.bas yazılım içeriği;

'********************************************************
'*  Name    : UNTITLED.BAS                              *
'*  Author  : [E.T.E]                                   *
'*  Notice  : Copyright (c) 2006 [Ete]                  *
'*          : All Rights Reserved                       *
'*  Date    : 21.12.2006                                *
'*  Version : 1.0                                       *
'*  Notes   : İLERİ VE GERİ TARAMA TUŞLARI İLE ÇALIŞIR  *
'*          : OTOMATİK BANT SONUNA GİTME VAR
'*                                                      *
'********************************************************

@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT

DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 0 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTA 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 3 'LCD RS bacağı Hangi Bite bağlı ?
'define lcd_RWREG    PORTB
'define LC_RWBIT     2
DEFINE LCD_EREG PORTA 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 4 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE SHIFT_PAUSEUS 3500 'shift komutunda gecikme süresi
PORTA=0                     'PORTA yı sıfırladık
PORTB=240  'PortB=%11110000 = 240 yapıldı
TRISA=%11100100 'A portu giriş çıkış düzenlemesi yapıldı
TRISB=0 'B portu tamamı çıkış olarak ayarlandı

CMCON=7  'komparatörler iptal edildi

'--------------kullanılan değişkenlerimiz ------------
DATA_BIR  var byte
DATA_IKI  var BYTE
DATA_UC   VAR BYTE
DATA_DORT VAR BYTE
DATA_BES  VAR BYTE
FREKANS   VAR WORD
FREQ      VAR WORD
PLL       VAR WORD
TEMP      VAR word
SES       VAR BYTE
VOL       VAR BYTE
SAYI      VAR BYTE
VERI3     VAR BYTE
Z         VAR BYTE
I         VAR BYTE
TEST      VAR BYTE
SIRA      VAR BYTE
SISTEM    VAR BIT
YON       VAR BIT
POZ       VAR BIT

ACIK      CON 1   'ACIK=1 yapıldı sabit değer değişmez
KAPALI    CON 0   'KAPALI=0 yapıldı sabit değer değişmez

symbol DTA     =PORTA.0  'I2C DATA PİNİ
SYMBOL CLK     =PORTA.1  'I2C CLK PİNİ
SYMBOL ILERI   =PORTA.6 'YUKARI TARAMA TUSU
SYMBOL GERI    =PORTA.7 'AŞAĞI TARAMA TUSU
SYMBOL SES_AC  =PORTA.5  'SES AÇMA TUSU
SYMBOL SES_KAPA=PORTA.2 'SES KAPATMA TUSU

SES=5  'default ses değeri
DTA=1  'Radyo modülü data hattı=1 yapıldı
CLK=0  ' Radyo modülü CLK hattı=0 yapıldı
GOSUB STOP_VER 'Radyo modülüğne STOP bilgisi verildi
GOSUB STOP_VER  'emniyet için tekrar stop bilgisi verildi
GOSUB STOP_VER  'emniyet için tekrar stop bilgisi verildi
POZ=1 '1=HIGHSIDE TARAMA  , 0=LOW SIDE TARAMA

frekans=8700 'default açılış frekansı 88 MHz olarak verildi
FREQ=FREKANS:GOSUB EKRAN
gosub hesap
gosub UP_SCAN
BASLA:
if ILERI =0 then  'şayet tarama_ileri tuşuna basılmış ise
FREKANS=frekans+5
IF FREKANS>10800 THEN FREKANS=10800
IF POZ=1 THEN
GOSUB HIGHSIDE
ELSE
GOSUB LOWSIDE
ENDIF
TEST=TEST+1 'Otomatik bant sonuna gitme için test değerini bir artır
IF TEST>6 THEN pll=13211 'ileri tuşuna hala basılı tutyor isek pll=bant sonu değeri
DATA_BIR=PLL.BYTE1+$50 '1 nolu data registerine PLL değerini ve $C0 değerini
DATA_IKI=PLL.BYTE0  'iki nolu data registerine PLL low bayt'ını yükle
gosub UP_SCAN 'yüklenen değeri radyoya ver ve ilgili frekansı çaldır
gosub ISTASYON 'İstasyon bulundumu bak
GOTO CIK  'CIK etiketine git.
ENDIF

IF GERI=0 then 'şayet geri tarama tuşuna basılmış ise
FREKANS=FREKANS-5
IF FREKANS<8700 then FREKANS=8700           IF POZ=1 THEN              GOSUB HIGHSIDE            ELSE              GOSUB LOWSIDE            ENDIF           TEST=TEST+1 'tuşa hala basılı ise test değerini bir artır           IF TEST>6 THEN PLL=10653 'hala basılı ise otomatik bant sonu değerini al
DATA_BIR=PLL.BYTE1+$50 'data registerlerine yükle
DATA_IKI=PLL.BYTE0
gosub DWN_SCAN 'geri tarama bölümüne git ve değerleri modüle yükle
gosub ISTASYON           'istasyon bulundumu bak
GOTO CIK  'CIK etiketine git.
endif
TEST=0                     'şayet ileri ve geri tuşlarına basılmıyor ise Test=0 yap
CIK:    GOSUB SES_BAK 'ses değeri artırılıyormu git bak
GOTO BASLA 'aynı işlemleri için başa git.

UP_SCAN:  'İleri tarama alt programı
YON=0
gosub START_VER  'Radyo modülüne start komutunu ver
ShiftOut dta,clk,1,[$C0] ' Modüle Yazma yapılacağını bildir  mute iptal olursa $40 verilecek
GOSUB ACK_AL 'Byte yazıldı teyid (ACK) al.

ShiftOut dta,clk,1,[DATA_BIR] ' Data-1 gönderildi
GOSUB ACK_AL  'Byte gönderildi teyidini al

ShiftOut dta,clk,1,[DATA_IKI] ' Data-2 gönderildi
GOSUB ACK_AL 'Byte gönderildi teyidini al
IF POZ=1 THEN
VERI3=$D0   'HIGHSIDE
ELSE
VERI3=$C0   'LOWSIDE
ENDIF
ShiftOut dta,clk,1,[VERI3] ' Data-3 gönderildi B0=LOW A0 - D0=Mid C0 -F0=HIGH E0
GOSUB ACK_AL 'Byte gönderildi teyidini al  & 1011 0000

ShiftOut dta,clk,1,[$11] ' Data-4 gönderildi
GOSUB ACK_AL 'Byte gönderildi teyidini al

ShiftOut dta,clk,1,[$00] ' Data-5 gönderildi
'        GOSUB ACK_AL 'son bölümde teyid almaya gerek yok artık

gosub STOP_VER 'işlem tamam modüle stop bilgisini ver
return  'geri dön.

ACK_AL:
Input dta ' DATA hatı giriş olarak ayarlandı , ack alınacak
While dta=1 'ack=1 ise sıfır oluncaya kadar bekle
Wend
PulsOut clk,1 ' bu konuma ack alınınca geçilir, ack alındı bir clk palsi gönder
RETURN

ACK_VER:
OUTPUT DTA  'DATA hattı çıkış olarak ayarlandı ACK gönderilecek
LOW DTA 'DATA hattı LOW a çekildi
HIGH CLK 'CLK High yapıldı
LOW CLK 'CLK low yapıldı yani bir pals verilmiş oldu
HIGH DTA 'DATA hattı HIGH yapıldı
return 'ACK verilmesi tamamlandı geri dön.

ISTASYON:
pause 50
GOSUB RADYO_OKU
LCDOUT $fe,$80,dec1 DATA_BIR.7
IF DATA_BIR.7=1 then
PLL.byte1=DATA_BIR & %00111111
PLL.Byte0=DATA_IKI
PLL=(PLL/10)*10
IF POZ=0 then
TEMP=PLL+28
else
TEMP=PLL-28
ENDIF
TEMP=TEMP*1024
freq=div32 1250
freq=(freq/10)*10

'               freq=freq+5
'               temp=freq dig 0
'               temp=(temp/5)*5
'               freq=(freq/10)*10+temp

DATA_BIR=PLL.BYTE1
DATA_IKI=PLL.BYTE0
If yon=0 then
GOSUB UP_SCAN
GOTO ATLA
ENDIF
GOSUB DWN_SCAN 'şayet geri tarama modunda isek
ATLA:  'geri tarama değerleri module yazıldı
GOSUB EKRAN
frekans=freq
RETURN
endif
goto ISTASYON 'istasyon henüz bulunmadı tekrar bak

EKRAN:
LCDOUT $FE,$81,"   ",DEC FREq/100,",",DEC2 (FREq//100)," MHz   "
LCDOUT $FE,$8F,dec poz 'poz=1 ise HIGH side  Poz=0 ise LOW side tarama yapılıyor
lcdout $fe,$c7," PL:",dec5 PLL
RETURN

RADYO_OKU:
gosub START_VER  'okuma için modüle start ver
ShiftOut dta,clk,1,[$C1] ' okuma emri modüle gönderildi
GOSUB ACK_AL 'ACK yani teyid al.

GOSUB BYTEAL:DATA_BIR=SAYI  'ilk byte modülden alındı
GOSUB ACK_VER  'aldığının teyidini ver

GOSUB BYTEAL:DATA_IKI=SAYI     'ikinci byte alındı
GOSUB ACK_VER 'aldığının teyidini ver

GOSUB BYTEAL:DATA_UC=SAYI  'üçüncü byte alındı
GOSUB ACK_VER 'aldığının teyidini ver

GOSUB BYTEAL:DATA_DORT=SAYI   'dördüncü byte alındı
GOSUB ACK_VER  'aldığının teyidini ver

GOSUB BYTEAL:DATA_BES=SAYI  'beşinci byte alındı
'          GOSUB ACK_VER 'son byte için teyid vermeye gerek yok
GOSUB STOP_VER  'işlem sona erdi stop komutunu ver.
pause 50
RETURN

DWN_SCAN:
YON=1 'yon=1 geri tarama yapılıyor
gosub START_VER 'start komutunu ver
ShiftOut  dta,clk,1,[$C0] ' yazma yapılacak komut verildi
GOSUB ACK_AL 'byte yazıldı ack al.

ShiftOut  dta,clk,1,[data_bir] ' Data-1 gönderildi
GOSUB ACK_AL 'byte yazıldı ack al.

ShiftOut  dta,clk,1,[data_iki] ' Data-2 gönderildi
GOSUB ACK_AL 'byte yazıldı ack al.
IF POZ=1 THEN 'HIGHSIDE
VERI3=$50
ELSE
VERI3=$40
ENDIF
ShiftOut dta,clk,1,[VERI3] ' Data-3 gönderildi $20=Low - $40=Mid - $60=High
GOSUB ACK_AL                   'byte yazıldı ack al.

ShiftOut  dta,clk,1,[$11] ' Data-4 gönderildi
GOSUB ACK_AL 'byte yazıldı ack al.

ShiftOut dta,clk,1,[$00] ' Data-4 gönderildi
'        GOSUB ACK_AL  'son bölümde teyid almaya gerek yok artık

gosub STOP_VER 'işlem tamam stop komutu ver.
return

START_VER:
HIGH CLK
HIGH DTA
LOW DTA
LOW CLK
HIGH DTA
RETURN

STOP_VER:
low dta
high CLK
HIGH DTA
RETURN

SES_BAK:
IF SES_AC=0 then
SES=SES+1
IF SES=16 then SES=15
PAUSE 230
endif

IF SES_KAPA=0 then
SES=SES-1
IF SES=255 THEN SES=0
PAUSE 230
endIF
VOL=ses<<4                       PORTB=VOL 'pic in bacaklarına bağlı olarak 4066 ya değer gönder         lcdout $fe,$C0,"Ses:",dec2 (15-ses) '        lcdout $FE,$C0,rep $FF(16-SES),rep 32ses         RETURN                HESAP: ARA:          temp=FREKANS *1250        pll=div32 1024        IF POZ=1 THEN           pll=pll+28        else           pll=pll-28        endif              DATA_BIR=PLL.BYTE1        DATA_IKI=PLL.BYTE0        gosub ekran        PAUSE 10        RETURN        GERIYE:        goto ara    BYTEAL:     'bit bazında radyo modülünden bilgi almak için yazıldı        Z=128:SAYI=0  'sayı=0 ve karşılaştırma bit değeri 128        input DTA     'Data hattı giriş olarak ayarlandı        FOR I=0 to 7  '0-7 arasında toplam 8 adet döngü kur        HIGH CLK      ' CLK=High yapıldı        if dta=1 then SAYI=SAYI | Z  'Data hattı 1 ise Sayının Z bitini high yap        LOW CLK        'clk low yapıldı        Z=Z>>1         'bir sonraki bite geç
NEXT
output dta 'data hattı yeniden çıkış olarak ayarlandı
HIGH DTA  'data hattı High yapıldı
RETURN

HIGHSIDE:
temp=FREKANS *1250
pll=div32 1024
pll=pll+28
return

LOWSIDE:
temp=FREKANS *1250
pll=div32 1024
pll=pll-28
return


Sistemin Radyo alıcı katı Phillips firmasının üretmiş olduğu TEA5767 entegresine dayanmaktadır. Söz konusu entegre asgari malzemelr kullanılarak bir modül haline getirilmiş ve ve bu sistemde bu modül kullanılmıştır.

Söz konusu entegre hem I2C hemde SPI modunda haberleşme yapabilmekte olup ben SPI modunu kullandım.

Piyasada bulunabilecek en kaliteli digital radyolarda ne özellik var ise hepsini barındırmaktadır.

Vermiş olduğum projede ben hem yer darlığı hem seçtiğim işlemci nedeni ile kısıtlı imkanlarını kullandım. Projemde yalnızca sağa sola otomatik tarama yapmakta sistem. Uzun basılınca bant sonuna atlamaktadır.

Bu modül ile aşağıdaki işlemleri yaptırmak mümkündür;

1. Tuş takımından girilen bir frekans değerini çaldırmak

2. Bulunan istasyonları otomatik Ya da manuel kayda almak. 1-10 arası butonlarınız olursa ve bu butonların herhangi birisine 5 sn den fazla basarsanız istasyon otomatik kayda alınabilir. Daha sonra bu tuşa kısa basılarak o istasyonun çaldırılması sağlanabilir.

3. Bir tarafa doğru zayıf istasyonları diğer tarafa doğru yalnızca kuvvetli istasyonları bulması sağlanabilir.

Şimdilik aklıma gelenler bunlar. Entegrenin data sheeti incelenerek diğer özellikler hakkında bilgi alabilirsiniz.

Devrede TDA7056 entegresini amplifikatör olarak kullandım. Bu entegre voltaj kontrollü olarak volum kontrolü imkanı sağlamaktadır. Voltaj kontrolünü 4066 entegresi ile gerilim bölerek hallettim. Tabiiki devrem yalnızca Mono çalışıyor. Modül stereo çalışmakta olup ben iki kanalı birer kondansatörle birleştirerek mono anfiye giriş yaptım. İstenirse devre stereo olarak dizayn edilebilir.

Anfi olarak benzer şekilde çalışan modeller bulunmakta olup buna bağlı olarak daha değişik güçte ve özellikte sistemler kullanılabilir.

Şu anda devre yalnızca buton kontrollü volüm ayarı ile yine buton kontrollü istasyon bulma özelliğine sahiptir.

Modül tabiiki yurt dışından alınması gerekiyor. Bu konuda bir Kanada firmasını buldum ve onlardan 10 adet modül aldım. Ancak Birkaç kişiye radyo yaptım ve elimde yalnızca 4 adet modül kaldı. İsteyenlere verebilirim . Bana maliyeti 9 küsür Tl yi buldu. Bende tanesini 10 TL ye veriyorum.

Çin de bu modülleri daha ucuza bulmak mümkün hatta 1-2 dolara bulmak mümkün ancak miktarlı alımlarda bu fiyatı uyguluyorlar. Bir başka firma ile temasım sürüyor. Normalde 1000 adet den az sipariş kabul etmiyorlar. Ancak firma yetkilisi Bay Johnson ile görüştüm ve amatörler için min. 10 adetlik siparişleri kabul edebilecek. Ödeme Paypal ile yapılıyor sevkiyat posta yolu ile olunca ucuza gelebilecek.

Firma web sayfası;  http://www.szblessed.com/English/index.asp

Firmada temas halinde olduğum Bay Johnson var. Kendisine ismimi (Erol Tahir Erdal) verirseniz az miktar konusunda yardımcı olacaktır. Bay Johnson un mail adresi ; sales_tj@sohu.com

Diğer taraftan pek çok telefon üreticisi bu modülü kullanarak FM radyolu telefonda yapmaktadır. Bu nedenle hurdaya çıkmış radyolu telefonların içinde söz konusu radyoyu bulabilirsiniz.

Neyse dosyalar ilişiktedir. Bu devreden bir kaç tane yaptım. Şu anda kullanıyorum. Çalışmıyor diye bana lütfen geri dönmeyin. Kesin çalışıyor.

ete

Programın yeni versiyonu ilişikteki dosya içindedir.

Ete

rercan

hocam ben bu programı 16f877 ye içinde ses kontrol entegresini calıştıran bi programa dahil etmek istiyorum. calışması şöyle menü olacak tuşa bastıgımda radyo ya tuşa ikinci defa bastıgımda  pc ye geçecek.  sizin komutları inceledigimde kafam baya karıştı . epey bi gosub var. ses yükseltme alcaltmayı   devreden cıkartıp direk baglantı saglasamsizin kodların içersinden hangi ses satırlarını cıkarmalıyım. yada amfi katını iptal etsek , kodlardan anladıgım kadarıyla sürekli bi default degeri var sanırım ?

yada başka bir çözüm oalrak kabaca programın işleyişinden bahseder misiniz  ?  kanal atlamayı nasıl saglayabiliriz. modülden veri okumayı nerede kullanabiliriz ? 

yardımcı olursanız memnun olurum :)

ete

Bir sürü soru ile neredeyse bütün programın nasıl çalıştığını sormuşsun. Bunu anlatmam için buraya 2 sayfa yazı yazmam lazım.
Yalnızca ses kısmını iptal edecek isen programda
CIK:    GOSUB SES_BAK
şeklinde bir satır var. O kısmı kaldırırsan ses iptal olur sen kendi ses devrenle kontrolü yaparın.
Kartın zerine anfi yi monte etmeyeceksin. Orada sağ kanal ve sol kanal anfi girişleri mevcut. Bu girişleri kullanarak kendi anfine giriş yaparsın.
Anfinin ses kontrolünüde kendin ayarlayacaksın artık.

Sıkıştığın yerde her şeyi değil yalnızca spesifik bir şeyi sorman gerekki cevaplayabileyim değilse masal anlatır gibi anlatmak lazım. Zaten program sana anlatmıyorsa benim anlatmamlada anlamazzsın diye düşünüyorum. Biraz daha incele progamı bence.

Ete




sensiz96

hocam baskı devrenin boyu kaç cm , olduğu gibi yazdırıp plakete çıkarsak sorun olmaz herhalde

ete

PCB plaka boyutu 90x70 mm dir.
Olduğu gibi yazdırlacak boyut DOC uzantılı dosyada mevcut zaten.
Yazılanları iyi okuyun lütfen.

Ete


ete

Bana kalırsa ikiside olmaz. En başta fiyatları nedeni ile olmaz.
Lazımsa ben vereyim modül. Elimde var bir kaç tane.

Ete

MS_59

hocam iyi akşamlar bu modülden bende istiyorum eğer elinizde fazladan varsa
mehmet

ete

Elimde verebilecğim 4 adet modül mevcut. Kim ne istiyor ise özel mesaj atsın.

Ete

MS_59

hocam modülün beslemesine lm317 (elimde şuan yok onun) yerine diyot koyup voltajı  düşürürsem modüle zarar verirmiyim 1N4148 koyup denedim 4.36volt'kadar düştü radyo çalıştı ama fazla çalıştırmadım ne olur ne olma diye
mehmet

ete

Modül nomalde 5v ta kadar çalışıyor ama maksimum limit olduğu için ben ortadan bir değer alıp yapmıştım.
2 diyotla 4V civarına düşür daha emniyetli olur.

Ete

MS_59

mehmet

MS_59

hocam bu devreyi stereo çıkışlı yapmak istiyorum TDA7056A yerine TDA7057AQ takıcam yalnız DC volume control'leri farklı TDA7056'nın 5nolu pinine bağlanan ucu TDA7057nin 1 ve 7 nolu pinine bağlasam sorun olurmu?
mehmet

ete

İki anfininde karekterleri bir birine çok yakınç Bir sorun olacağını sanmam.

Denemekte yarar var. SOnucu yazarsın buraya.
Ben PCB üzerinde her iki kanalı birer kondansatörle anfi girişinde birleştirmiştim.
Sen onları ayırman gerekecek. Her bir kanal çıkışını direk anfiye yine bir kondansatörle girmen gerekiyor.

Ete


Powered by EzPortal