ITUcilesiz/professional/Serkan... · Web viewSPI (serial peripheral interface) ve I2C...
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