ITUcilesiz/professional/Serkan... · Web viewSPI (serial peripheral interface) ve I2C...

31
İSTANBUL TEKNİK ÜNİVERSİTESİ ELEKTRİK – ELEKTRONİK FAKÜLTESİ GELGİT ÖLÇER BİTİRME ÖDEVİ SERKAN ŞAHAN 040060321 Bölümü: Elektronik ve Haberleşme Mühendisliği Programı: Elektronik Mühendisliği

Transcript of ITUcilesiz/professional/Serkan... · Web viewSPI (serial peripheral interface) ve I2C...

İSTANBUL TEKNİK ÜNİVERSİTESİ

ELEKTRİK – ELEKTRONİK FAKÜLTESİ

GELGİT ÖLÇER

BİTİRME ÖDEVİ

SERKAN ŞAHAN

040060321

Bölümü: Elektronik ve Haberleşme Mühendisliği

Programı: Elektronik Mühendisliği

Danışman: Prof. Dr. İnci Çilesiz

Ağustos 2010

ÖNSÖZ

Geniş bilgi birikimi, yol göstericiliği ve tecrübesiyle çalışmam süresince benden desteğini ve yardımını esirgemeyen Sayın Prof. Dr. İnci Çilesiz’e sonsuz saygılarımı ve teşekkürlerimi sunarım.

Ağustos 2010 Serkan ŞAHAN

İÇİNDEKİLER

ÖZET

SUMMARY

1. GİRİŞ

2. DONANIM

2.1. Projede Kullanılan Tümdevre ve Malzemelerin Listesi

2.2. Mikrodenetleyici: PIC16F877

2.2.1. PIC16F877 Hakkında Genel Bilgi

2.2.2. PIC16F877’ Besleme Bacakları ve Beslenmesi

2.2.3. PIC16F877’ Saat Bacakları ve Osilatörler Hakkında Bilgi

2.2.4. PIC16F877' nın Analog/Sayısal Çevirici (ADC) Birimi

2.3. LM7805AC 5 Volt Gerilim Düzenleyici

2.4. TXC1 RF Verici Devre

2.5. RXA1-B-434M RF Alıcı Devre

2.6. ATM1602B Sıvı Kristal Görüntü Birimi (Liquid Crystal Display, LCD)

2.7. DS1302 Saat ve Takvim Tümleşik Devresi

3. DEVRE TASARIMI

3.1. Verici Devre Tasarımı

3.2. Alıcı Devre Tasarımı

3.3. Elektromekanik Kısım İçin Devre Tasarımı ve Düşünülenler

4. YAZILIM

4.1. C Programlama Dili ve C ile PIC Programlamaya Giriş

4.2. Yazılım Ortamı:Micro Code Studio Derleyicisi

4.3. Çalışma

4.4. Verici Devre İçin Kullanılan Kod ve Algoritma Tasarımı

4.5. Alıcı Devre İçin Kullanılan Kod ve Algoritma Tasarımı

4.6. PIC’e Programın Yüklenmesi

5. SONUÇLAR VE TARTIŞMA

ÖZET

Bu bitirme projesi, gelgit dolayısıyla deniz suyu düzeyinin 30 cm'ye kadar olan (±15cm) değişimini ölçen; şamandıra tabanlı ve karada kazılacak bir kuyu içine yerleştirilecek; deniz suyu yüksekliğini gösteren elektriksel işaretin kablosuz olarak iskele veya kuyudan yaklaşık 30-50 m uzaktaki panele gönderileceği; panelde gösterilen su düzeyi yanılma payının 2 mm veya daha az olduğu bir cihaz tasarımı gerçekleştirilmesini içermektedir. Proje, donanım ve yazılım alarak iki ana bölümden oluşmaktadır.

Donanım içeriği PIC16F877 mikrodenetleyicisi, LM7805AC 5 volt gerilim düzenleyici, TXC1 rf verici devre, RXA1-B-434M rf alıcı devre, ATM1602B 2x16 sıvı kristal görüntü birimi (liquid crystal display), DS1302 saat ve takvim tümleşik devresi oluşturmaktadır. Gelgit bilgisinin elektriksel işarete dönüşümünü sağlayan elektromekanik kısım ise Volkswagen Golf modeli bir aracın akaryakıt ölçüm sisteminin kullanılması ile gerçeklenmiştir.

Yazılım kısmında ise verici tarafta gelgit seviyesini mekanik olarak ölçerek 0-5 volt arası değerlerde analog elektriksel işarete dönüştüren cihazdan gelen bilginin mikrodenetleyicideki analog/sayısal çevirici birimi işlenip verici devre ile alıcı kısma gönderilmesi, alıcı kısımda algılanan bilginin saat ve tarih tümdevresinin içerdiği bilgi de eklenerek gerekli dönüşümlerin yapılması ile sıvı kristal göstergede görüntülenmesi gerçeklenmektedir..

TIDE GAUGE realizatıon

SUMMARY

The main aim of this project is to design and implement a tide-gauge which basicly operate between 30 centimeters below and above of sea level. This project also supposed to provide the following features such as being buoy based and settled in a well which is digged on the land, a wireless transfer of the electrical signal which carries the information of sea water level from the dock or well about 30-50 meters distance and having a data error of 2 millimeters or less.

This project includes hardware and software parts. The main parts of the hardware are PIC16F877 microcontroller, LM7805AC 5 Volts voltage regulator, TXC1 rf transmitter circuit, RXA1-B-434M rf receiver circuit, ATM1602B 2x16 liquid crystal display, DS1302 real time clock and date circuit. The electromechanical part which provides the convertion of tide level information to electrical signal, is realised using a fuel measurement system of a Volkswagen Golf model vehicle.

In the software part, by using transmitter circuit it is realized sending the information, which comes from the device that measures the tide level mechanically and converts it into an analog electrical signal between 0-5 volts, by processing it in the ADC the of microcontroller and it is realized that displaying the information which is sensed in the receiver part doing necessary convertions and the additional real time and date information on the liquid crystal display.

1. GİRİŞ

Gelgit ölçerler, 1800’ lü yıllardan bu yana dünyada kullanılan cihazlardır. Ana kullanım amaçları deniz seviyesini ölçmek, tsunamileri ve taşkınları belirlemektir. Yüzyıllardan yana kullanılan bu sistemlerin ana prensibi deniz suyunun içine girdiği ince bir boru ve kaydedici düzenlerdir.

Özellikle okyanus kıyılarındaki yaşam merkezleri için gel-git değerinin bilinmesi hayati önem taşımaktadır. İlkel gel-git ölçerler zamanla gelişen teknoloji ile geliştirilmiş ve farklı ara yüzler, farklı ve kullanışlı haberleşme yöntemleri kullanılmış ve sonuçlar istatiksel amaçlı veri bankalarında depolanmıştır. Bugün dünyada profesyonel anlamda gelgit ölçümleri yapılmakta, bu gelgit ölçümlerinde küresel konumlama sistemleri, uydu haberleşmesi gibi ileri teknoloji uygulamalardan yaralanılmaktadır. Bizim amacımız bu projelerin küçük ve amatör bir şekilde bir benzerini yapabilmektir. Marmara Denizi’ nde meydana gelen deniz seviyesinden on beş santimetre meydana gelen değişimini gözlemleyebilmek diğer bir amacımızdır. Milli Savunma Bakanlığı’ nın gel-git ölçer alımı hakkındaki açtığı ihale bu konunun her anlamda önemini bir kez daha ortaya koymaktadır.

Proje, bir çok disiplinin birleşmesi ile meydana gelmektedir. Kullanılan mikrodenetleyicinin (PIC 16F877) mimari yapısı, programlama boyutu, analog sayısal çevirme işleminin mantığının anlaşılması ve özellikle radyo frekansları ile iletişimin nasıl gerçeklendiği ve sayısal haberleşme; tümdevrelerin analog sistem tasarımlarına ilavesi ve son olarak sıvı kristal göstergelerin özellikleri ve programlanmaları bu projenin displinler arası yönünü ortaya koymaktadır.

Proje basitçe açıklamak gerekirse tasarım olarak üç ana bölümden oluşmaktadır. İlk bölüm bir araba yedek parçası olan Volswagen Golf modelinin yakıt algılayıcısının bu sistemde deniz suyu yüksekliğini dahili şamandırası ile algılaması ve dahili devresi ile bu yüksekliği elektriksel işarete dönüştürmesidir. Bu tipik bir analog dönüşümdür ve parçada bulunan grafit ucun bir direnç serisinin üzerinde yüksekliğe bağlı olarak gezmesi ile gerilimi değiştirmesi esasına dayanır. Bunu bir potansiyometre olarak düşünebiliriz.

Projenin ikinci bölümü, yedek parçanın dönüştürdüğü işaretin mikrodenetleyiciye bir bacak sayesinde alınması analog giriş işlemidir. Mikrodenetleyiciye giren işaret ASÇ ile sayısal işarete çevrilir ve bu sayısal işaret RF verici ile alıcı tarafa iletilir.

Projenin son bölümü alıcı taraftır. Bu kısım, RF ile gönderilen sayısal işaretin alınmasını ve bu sayısal işaretin ayrı bir mikrodenetleyici kulanılarak ve gerekli dönüşümlerin yapılması ile saat ve takvim bilgilerinin de eklenmesi ile sıvı kristal göstergede gösterilmesi işlemlerini yerine getirir.

2. DONANIM

Bu bölümde, projede kullanılan tümdevre ve malzemeler hakkında detaylı bilgi verilmektedir.

2.1. Projede Kullanılan Tümdevre ve Malzemelerin Listesi

Tablo 2.1: Malzeme listesi

MALZEME

ÇEŞİT

ADET

PIC16F877

Mikrodenetleyici

1

TXC1

RF Verici

1

RXA1-B-434M

RF Alıcı

1

2x16 LCD

Sıvı Kristal Görüntü Birimi

1

DS1302

Saat ve Takvim Devresi

1

1

1

L7805AC

Pozitif gerilim düzenleyici

1

4 Mhz kristal

Osilatör

1

32.768 KHz kristal

Osilatör

1

10 µF kondansatör

Kondansatör

1

330 nF kondansatör

Kondansatör

1

22 pF kondansatör

Kondansatör

2

10 kΩ direnç

Direnç

3

4,7 kΩ direnç

Direnç

2

330 Ω direnç

Direnç

1

9 V pil

Pil

1

1

2.2. Mikroişlemci: PIC16F877A

2.2.1. PIC16F877A Hakkında Genel Bilgi

PIC (Peripheral Interface Controller) Microchip firmasının ürettiği ve ilk olarak 1994’ te lanse ettiği mikrodenetleyicilerdir. PIC16F877 mikrodenetleyicisi Harward mimarisi kullanılarak geliştirilmiştir. Yani bellek ve veri için ayrı yerleşik yollar kullanılmıştır. Bu tasarım belleğe ve veriye erişim hızını arttırarak pic ailesini diğerlerinden ayırır.Şekilde PIC16F877 PDIP (Plastic Dual In-line Package) kılıf PIC görülmektedir.

Şekil 2.1. PIC16F877 Bacak Şeması ve Resmi[1]

PIC16F877 mikrodenetleyicisinin özellikleri şunlardır:

· 8K FLASH Program bellek, programın yazılıp silinebilmesine olanak sağlar.

· DC-20 MHz Çalışma Frekansı

· 368*8 RAM bellek, kullanıcının yaralandığı

· 256 byte EEPROM Veri belleği

· 14 bit genişliğinde komutlar

· 33 Adet Giriş-Çıkış Portu, bu çalışmadaki seçim kriterlerinden biridir.

· 8 Kanallı 10 Bit Analog-Sayısal Çevirici, dahili olduğu için diğer bir seçim kriteridir.

· Kesme kaynağı, 14 adet kesmeye izin verebilir.

· SPI (serial peripheral interface) ve I2C (inter-integrated circuit) seri iletişim özelliği

· Paralel iletişim portu (paralel slave port, PSP)

· USART (Universal Synchronous Asynchronous Receiver Transmitter) seri iletişim, USART I2C(efendi-köle haberleşmesi), RS232 gibi güçlü bir seri iletişim bacağıdır ve sadece bu modelde bulunur.

· SPI iletişimi içerir.

· 25 mA port çıkış akımı

· Bekçi köpek (watchdog timer) devresi

· Dahili salıngaçı bulunur.

· Uyku modu

· 0,6 mA’ den düşük bir akım, 3V-MHz çalışma koşullarında

· 1 µA’ den daha düşük bekleme modu akımı

PIC16F877 mikrodenetleyicisinin dâhili A/S çevirici devreye sahip olması, seri ve paralel iletişim konularında gelişmiş bir altyapısının bulunması, girişler ve çıkışlar için yeterli sayıda bacak içermesi en önemli tercih nedenidir.

2.2.2. PIC16F877' nin Analog/Sayısal Çevirici (Analog/Digital Converter, ADC)

Birimi

PIC 16F877’ nin bir özelliği de mikrodenetleyici uyku modunda iken bile analog sayısal çeviricinin arka planda çalışma özelliğidir.Bu kısımda mikrodenetleyicimizin yazmaç özelliklerini inceleyeceğiz.

Şekil 2.3: ADCON1 kaydedicisi [1]

Bit-7: A/S çeviricinin Sonuç Format Seçme biti dir. Sonuç 1 olur ise sonuç sağa hizalanmış, ADRESH’ nin 6. uç bitleri 0 olarak okunur. 0 olur ise sonuç sola hizalanmış, ADRESL’ nin alt bitleri 0 olarak okunur. Bit 6-4 arası kullanılmaz ve 0 olarak okunur. Bit -3-0 arası PCFG3 – PCFG0 A/D portu ayarlama kontrol bitleridir. İşte bu bitleri ayarlayarak portların seçimleri yapılır. Aşağıdaki tabloya bakınız.

Örnek olarak PCFG3:PCFG0 bitlerini 0000 olarak verir isek bu durumda RA0-RA3 , RA5,

RE0-RE2 bacaklarının tamamı ANALOG olarak ayarlanmış olacak ve artı referans Voltajı

VDD den eksi referans voltajı ise VSS yani GND den alınacaktır.Eğer projemize yönelik

bakacak olursak şunu kolaylıkla söyleyebiliriz ki bize 1 adet Analog giriş yeterlidir, diğerleri

sayısal olabilir. +5V ve GND de referans voltajları olarak kullanılacak. Bu durumda tabloya

bakar isek 1110 değeri tam istediğimiz ayarlamayı yapabiliyor. Tablonun en son hanesinde

ilk değer kaç analog giriş olduğunu / işaretinden sonraki değer ise harici referans voltaj girişi

adedini gösteriyor. Seçtiğimiz değerde burası 3/0 olarak görülmektedir. Anlamı 3 adet

Analog giriş ve sıfır referans voltajı var demek. Zaten biz mikrodenetleyicinin kendi voltaj

girişlerini kullanmak istediğimizden gerçektende bize sıfır referans girişi lazımdır.

Mikrodenetleyicinin voltaj girişleri referans voltajı olarak seçildiğinde mikrodenetleyiciye

giren Analog voltaj değerinin 5 Volt’u aşmamasına dikkat edilmelidir. Tasarımda oto yedek

parçasının uçlarına 5 Volt gerilimin verilme nedeni de budur. Bu şekilde tablonun

kullanılmasını anlattıktan sonra bu aşamada tüm girişlerin sayısal seçilmesini inceleyelim.

Analog girişlerin sayısal olarak kullanılması istenir ise tablodan sağ tarafta 0/0 değerinin

bulunduğu satırda PCFG3:PCFG0 değeri 0111 (onluk sistemde 7) olarak görülür. Demek ki

ADCON1=7 veya ADCON1=%0111dediğimiz zaman mikrodenetleyici 16F877 nin Analog

girişleri iptal edilerek normal sayısal giriş çıkışa dönüştürülmektedir. A/S çeviricisi bulunan

mikrodenetleyicilerde aksine bir komut bulunmaz ise ilk açılışta A/S bacaklar analog olarak

açılırlar. Dolayısıyla bu pinleri sayısal kullanmak istersek mutlaka ADCON1=7 komutuyla

işle yaparız.

n bitlik bir ADC en fazla 2n adet değer ile bir analog işareti örnekleyebilir. Örneğin 10 bitlik bir ADC en fazla 210 = 1024 adet değer ile bir analog işareti örnekleyebilir. ADC biriminin elde ettiği sayısal bilginin bit sayısı ADC biriminin çözünürlüğünü ifade eder. Çözünürlük ne kadar yüksek ise o kadar iyi bir dönüşüm yapılır. ADC tüm devreleri analog giriş için, analog sinyalin pozitif giriş ucu olan VIN(+) ve analog sinyalin negatif giriş ucu olan VIN(-) giriş uçlarına sahiptir. Bu girişlerden analog sinyal uygulanır. Ayrıca ADC tümdevrelerinde analog sinyali sayısala çevirirken kullanılan VREF(+) ve VREF(-) uçları vardır. VREF(+) sayısala çevrilecek sinyalin en yüksek değerini, VREF(-) de en düşük değerini belirtir. Böylece giriş sinyalinin istenen aralığı için sayısala çevirme işlemi uygulanarak daha hassas ölçüm sonuçları elde edilebilir (projede daha hassas sonuca gerek duyulmadığından bu uygulanmamıştır).

ADC'nin sayısal bilgiye dönüştürebildiği en küçük gerilim değerine adım büyüklüğü denir. Adım büyüklüğü 1 LSb değeri olarak da ifade edilir ve şu şekilde hesaplanır:

Adım büyüklüğü (1 LSb) = (VREF(+) - VREF(-)) / 2n (n, ADC'nin bit sayısını belirtir.) (2.1)

Örneğin en yüksek değeri VIN(+) = VREF(+) = 5V ve en düşük değeri VIN(-) = VREF(-) = 0V olan bir sinyalin 10 bitlik ADC için adım büyüklüğü 5V/210 = 4,8828125mV'tur.

ADC biriminin analog uçlarına gelen sinyalin gerilim değerini hesaplamak içinse aşağıdaki formül kullanılır:

Sinyal gerilimi = Sayısal çıkışın onluk tabandaki değeri x Adım büyüklüğü + VREF(-) (2.2)

2.3. LM7805AC 5 Volt Gerilim Düzenleyici

LM7805AC 5 Volt gerilim düzenleyici ABD’ li fairchild yarıiletken firması tarafından üretilmektedir. Bu gerilim düzenleyicilerinin en büyük özellikleri ısıl kapama, iç akım sınırlaması ve güvenli çalışma alanı gibi bu düzenleyicileri zarar verilemez kılan özelliklerdir. 7805 tümdevresi 0-125 oC arasında çalışır, 500 mA çıkış akımı ve 0.1 µF kadar bir giriş kapasitesi mevcuttur. Devrenin en üstteki bacağı, düzenlenmiş çıkış bacağıdır. En alttaki bacak pozitif doğru gerilim girişi, ortadaki bacak ise toprağa veya 0 Volt gerilime bağlanması gereken giriştir.

Şekil LM7805AC tümdevresi

2.6. Sıvı Kristal Görüntü Birimi (Liquid Crystal Display, LCD)

Sıvı kristal ekran, elektrikle kutuplanan sıvının ışığı tek fazlı geçirmesi ve önüne eklenen bir kutuplanma filtresi ile gözle görülebilmesi ilkesine dayanan bir görüntü teknolojisidir. Projede 2x16 karakter tabanlı paralel LCD kullanılmıştır. Bu başlık altında bu tip LCD’ler hakkında bilgi verilecektir.

İmleçleri ile birlikte 5x8 noktalı olan göstergelerde karekterler 5x7 matrisler şeklinde oluşur. Bizim uygulamamızda Türkçe’ ye özel karakterler de kullanılmıştır. Yazılım kısmında bunun ayrıntılı anlatımı mevcuttur. ATM1602B sıvı kristal göstergesi -20 ila 70 oC arasında çalışır. Piyasadaki hemen hemen tüm sıvı kristal göstergeler aynı bacak diyagramına sahiptir.

Şekil 2.12: 2x16 karakter LCD

Şekil 2.13: ATM1602B bacak diyagramı

Projede kullandığım sıvı kristal göstergenin 3 no’ lu bacağı kontrast bacağı olup bu bacak 10 K lık bir trimpotun orta ucuna bağlanmalıdır. Trimpotun diğer uçlarından birisi +5V’ a diğeri de GND ye bağlanıp ekranda bir şeyler yada en azından karartılar görününceye kadar trimpot ayarlanmalıdır. Trimpotun alternatifi 3 no’ lu gösterge bacağını 470-680 ohm arası bir dirençle GND ye bağlamak ve aynı bacağı 8K2 ile de +5V ta bağlamaktır. Gösterge Çin üretimi olduğu için sorun çıkmış ve çeşitli kullanıcıların deneyimlerinden yararlanılarak bu yola başvurulmuştur.

- Göstergenin 1 nolu bacağı ile 5 no’ lu bacağı GND’ ye bağlanmalı , 2 no’ lu bacağı ise +5V’ a bağlanmalıdır.

- R/W=0 yani düşük seviyede tutularak veri gönderme işlemi yapılmıştır.

- R/S=1 yani yüksek seviye veri, R/S=0 yani alçak seviye komut için yazmaçın seçimidir

- Göstergenin veri bacakları mutlaka her hangi bir portun ya 0 no’ lu bacağından itibaren yada 4 bitlik iletişim kullanılacak ise 4 nolu bacağından itibaren sıra ile bağlanmalıdır. Alıcı devredeki mikrodenetleyiciye yüklenen programda gösterge 4 bitlik kullanıldığı için bağlantı

şöyle olmalıdır.

Gösterge-D4==>portB.4

Gösterge -D5==>portB.5

Gösterge -D6==>portB.6

Gösterge -D7==>portB.7

D0-D7 arasındaki tüm bacaklar göstergenin veri bacaklarıdır. E yetkilendirme bacağıdır. VEE kontrast bacağıdır.

2.7. DS1302 Saat ve Takvim Devresi

DS1302, Dallas yariiletken firmasi tarafindan üretilmis olan bir gerçek zamanli saat ve takvim devresidir. 8 bacakli bir devre olan DS1302, 2100 yilina kadar çalisma garantisine sahiptir ve bacak sayisini ekonomik olarak kullanabilmek için seri iletisim yetenegine sahiptir. 2 Volt ile 5.5 Volt arasi besleme gerilimine ihtiyaç duyan devre; -40 °C ile +85 °C arasi çalisabilme özelligine sahiptir. Devre besleme gerilimi kesildiginde saat ve takvim bilgilerini saklayabilmek için yapisinda rasgele erisimli bellek ( RAM ) bulundurmaktadir. Bu bellek sürekli çalis mak için tasarlanmistir ve Vcc1 besleme gerilimine ihtiyaç duymaktadir. Ana besleme gerilimi yani Vcc2 kesintiye ugradiginda, Vcc1 bacagina baglanmis olan pil, saati ve takvim bilgilerini içinde barındıran belleği sürekli aktif tutacaktir

ve dolayisiyla bilgi kaybi olmadan saat ve takvim çalis maya devam edecektir. Vcc2 bacagina baglanacak olan en az 1.5 Volt’luk pilin, yeniden s arj edilebilir pil olmasi tavsiye edilmektedir. Çünkü DS1302 devresi pil sarj etme düzenegine sahiptir. Devrenin katalog bilgileri incelendiginde, sarj etme düzeneginin nasil çalis tigi kolayca anlasilabilecektir. Gerekli yazilimsal ayarlamalar yapilmadan, sarj edilebilir pil kullanmanin bir anlami yoktur. Bu ayarlamalar devrenin katalog bilgilerinde bulunmaktadir. X1 ve X2 bacaklari osilatör bacaklaridir. 32.768 KHz frekansinda çalisan bir osilatör, saat ve takvim tümdevresinin çalismasi için gereklidir.

Sekil 1.3 DS1302 Tümdevresi

4.4. Verici Devre için Kullanılan Kod ve Algoritma Tasarımı

@ DEVICE pic16F877

@ DEVICE pic16F877, WDT_on

@ DEVICE pic16F877, PWRT_ON

@ DEVICE pic16F877, PROTECT_OFF

@ DEVICE pic16F877, XT_OSC

define adc_bits 10 ' 10 bitlik A/S çevirici seçildi

define adc_clock 3 ' 3. modda çalışılacak

define adc_sampleus 100 ' 100 mikro saniye örnekleme süresi

include "modedefs.bas" ' modedefs.bas dosyası kodun içine alındı

c var word ' i değişkeni tanımlandı

toplam1 var word ' toplam1 değişkeni tanımlandı

meas var word

trisa = %00000001 ' A portu analog giriş seçildi

adcon1 = %10001110 ' A/S çevirici konfigürasyonu

basla: ' basla etiketi

c=1

meas=0

toplam1=0

FOR C=1 TO c=100 ' ölçüm 100 kere tekrarlanacak

adcin 0 , meas ' port A.0'dan veri alındı

toplam1=toplam1+meas ' sonuclar birikiyor

NEXT c

toplam1=toplam1/100

serout2 portc.6,396,[REP$AA\5,REP$00\5,REP$FF\5] 'uyandırma işareti yolla

serout2 portc.6,396,[("S"),("E"),toplam1] ' 2400 baud ile "SE" yolla

serout2 portc.6,396,[("S"),("E"),toplam1] ' 2400 baud ile "SE" yolla

serout2 portc.6,396,[("S"),("E"),toplam1] ' 2400 baud ile "SE" yolla

PAUSE 100

GOTO basla

4.5. Alıcı Devre İçin Kullanılan Kod ve Algoritma Tasarımı

@ DEVICE pic16F877

@ DEVICE pic16F877, WDT_on

@ DEVICE pic16F877, PWRT_ON

@ DEVICE pic16F877, PROTECT_OFF

@ DEVICE pic16F877, XT_OSC

define lcd_dreg portb ' b portu data portu

define lcd_dbit 4 ' 4 bitlik veri iletimi yapılacak  

define lcd_ereg portb ' enable portu seçildi

define lcd_ebit 3 ' enable pini seçildi

DEFINE lcd_rwreg portb 

DEFINE lcd_rwbit 2

define lcd_rsreg portb ' register select portu seçildi

define lcd_rsbit 1 ' register select pini seçildi

DEFINE lcd_bits 4

DEFINE lcd_lines 2

lcdout $FE,$40,4,0,4,4,4,4,4,0

LCDOUT $FE,$48,17,0,17,17,17,17,31,0

LCDOUT $FE,$50,14,17,12,6,17,14,8,0

define adc_bits 10 ' 10 bitlik A/S çevirici seçildi

define adc_clock 3 ' 3. modda çalışılacak

define adc_sampleus 50 ' 50 mikro saniye örnekleme süresi

include "modedefs.bas" ' modedefs.bas dosyası kodun içine alındı

' modedefs.bas dosyası seri haberleşme protokollerinin var olduğu dosyadır.         

TRISA=1

TRISB=0

TRISC=0

rk VAR WORD

sa VAR WORD

RST     var     PORTA.2

IO      var     PORTC.1

SCLK    var     PORTC.3

rtcyil var     byte

rtcgun  var     byte

rtcay var    byte

rtctarih var     byte

rtcsaat   var     byte

rtcdakika  var     byte

rtcsaniye  var     byte

rtckontrol var  byte

Low RST         ' Reset RTC

Low SCLK

Low PORTD.2  

pause 200

        ' Set initial time to 15:00:00AM 06/08/2010

        rtcyil = $10

        rtcgun = $05

        rtcay = $07

        rtctarih = $06

        rtcsaat = $15

        rtcdakika = 0

        rtcsaniye = 0

        ana:

        Gosub zamanikur   ' Set the time

        Gosub zamaniyurut ' Skip subroutines

        gosub basla

        

        gosub ARAYUZ

        

        goto ana 

' Subroutine to write time to RTC

zamanikur:

        RST = 1         ' Ready for transfer 

        ' Enable write

        Shiftout IO, SCLK, LSBFIRST, [$8e, 0]

RST = 0         ' Reset RTC

        RST = 1         ' Ready for transfer

        ' Write all 8 RTC registers in burst mode

        Shiftout IO, SCLK, LSBFIRST, [$be, rtcsaniye, rtcdakika, rtcsaat, rtctarih, rtcay, rtcgun, rtcyil, 0]

        RST = 0         ' Reset RTC

        Return

' Subroutine to read time from RTC

zamaniyurut:

        RST = 1         ' Ready for transfer

        Shiftout IO, SCLK, LSBFIRST, [$bf]      ' Read all 8 RTC registers in burst mode

        Shiftin IO, SCLK, LSBPRE, [rtcsaniye, rtcdakika, rtcsaat, rtctarih, rtcay, rtcgun, rtcyil, rtckontrol]

        RST = 0         ' Reset RTC

' Main program loop - in this case, it only updates the LCD with the time

         ' Read the time from the RTC

        ' Display time on LCD

        Lcdout $fe, 1, hex2 rtctarih, "/", hex2 rtcay, "/" ,"20", hex2 rtcyil

        pause 1000

        

       Lcdout $fe,$c0, hex2 rtcsaat, ":", hex2 rtcdakika, ":", hex2 rtcsaniye

        Pause 1000       ' 

        Return

basla :

lcdout $fe,1 ' ekran temizlendi

serin2 portc.7,396,500,hava,[wait("SE"),rk] ' AB ön uyarma sinyalli veri = rk

rk=(rk*4.8828125)*6/1000

sa=(rk*4.8828125)*6/100

sa=sa//10

LCDOUT " GELG",0,"T SEV",0,"YES",0," : "

LCDOUT "   ",DEC2 rk

lcdout "   ",dec1 sa

lcdout "  cm" 

PAUSE 3000 

return

ARAYUZ :

lcdout $fe,1 ' ekran temizlendi

if saat < $12 && saat > $6 then ' saat 6 ile 12 arası ise

lcdout " G",1,"NAYDIN " ' ekranda günaydın yaz

pause 3000 ' 3 saniye bekle

endif ' döngüden çık

54

if saat < $19 && saat > $11 then ' saat 12 ile 19 arası ise

lcdout " ",0,"Y",0," G",1,"NLER " ' ekranda iyi günler yaz

pause 3000 ' 3 saniye bekle

endif ' döngüden çık

if saat < $22 && saat > $18 then ' saat 22 ile 19 arası ise

lcdout " ",0,"Y",0," AK",2,"AMLAR " ' ekranda iyi akşamlar yaz

pause 3000 ' 3 saniye bekle

endif ' döngüden çık

if saat < $24 && saat > $21 then ' saat 24 ile 22 arası ise

lcdout " ",0,"Y",0, GECELER " ' ekranda iyi geceler yaz

pause 3000 ' 3 saniye bekle

endif ' döngüden çık

return