You are on page 1of 25

GEBZE TECHNICAL UNIVERSITY

ELM 333 MICROPROCESSORS

ELM 333 TERM PROJECT


Physical Pendulum Setup, Measure The Oscillation Frequency
And/Or Period Of The Pendulum By Means Of A Microcontroller.

MAİDE UYGUR
141024022
İçindekiler

Sarkaç Devresi............................................ ......3


1 Giriş......................................................... ......3
1.2 Devre Şeması........................................ ......4
1.3 Devrenin Çalışması................................ ......5
2.1 Sarkaç................................................... ......7
2.2 LCD ekran bağlantısı ve çalışması.......... ......9
2.2.1 Kontrol Pinleri.................................... ......14
2.2.2 İlk Kullanıma Hazırlama (Initalization)......15
2.2.3 LCD’ nin Komutları............................. ......16
2.2.4 LCD’ de Karakter Gösterme................. ......18
2.2.5 Örnek LCD komutları....................... .........20
3. +5V güç kaynağı...................................... ......21
4. Baskı devre şeması ve yerleştirme planı.........22
5.YAZILIM.................................................... ......23

2
Sarkaç Devresi

1. GİRİŞ
Devrede kullanılan fonksiyon grupları aşağıdaki gibidir.
Sarkaç

LCD ekran

Ayar Butonları

+5Volt güç kaynağı


Şimdi devre şemasından başlayarak bu grupları tek tek inceleyelim.

3
1.2 DEVRE ŞEMASI

4
1.3 DEVRENİN ÇALIŞMASI
Ana mantık olarak devremiz TCRT5000 sensörün önündeki cismi algılamasına dayanmaktadır.
TCRT sensörün verici diyodunun yaydığı kızılötesi ışık bir cisme çarpıp geri geldiğinde alıcı
foto transistörün dirençi azalır ve buna göre Şekil de gösterilen R4 üzerinden gerilim bölme ile
picin ilgili bacağına düşük voltaj gider. Önünde bir cisim yoksa fototransitörün direnci yüksek
olur ve pice 5volt gider. Yani cisim varsa sensörün önünde logic 0, cisim yoksa logic 1 gider.
Programdada buna göre algılamalar yapılır ve süreler hesaplanır.
Devrede 3 adet buton vardır. S1 test modu için, S2 Reset için S3 ise sarkaç periyot bulmak
içindir. S1 e basıldığında test moduna girer ve aşağıdaki kod parçasını çalıştırır. Burdanda
görüldüğü gibi ekranda sarkaç oynat led kontrol et yazar.
if(input(TCRT)==0) output_high(LED); else output_low(LED); satırında ise sensörün önüne bir
cisim gelmiş ise sensör çıkışı 0 olacağından ledi yakmakta, cisim yoksa logic 1 geleceğinden
ledi söndürmektedir.

5
test:
lcd_gotoxy(1,1); printf(lcd_putc,"Sarkac oynat ");
lcd_gotoxy(1,2); printf(lcd_putc,"Led Kontrol et ");
test1:
if(input(SW_2)==0) goto start_init;
if(input(TCRT)==0) output_high(LED); else output_low(LED);
goto test1;
bu şekilde sensör kontrolü ve led aktif edilmesi olayı S2 basılana kadar devam eder. Basılınca
ana menüye döner.

6
2.1 SARKAÇ
Sarkacın periyodunu bulmak için TCRT5000 ile
algılama yapılmaktadır. Bu sensor kızılötesi ışık
gönderip kızılötesi alıcı ile almaktadır. Önünde bir
engel varsa kızılötesi ışık geri yansımakta ve bu
şekilde önünde bir engel olduğu anlaşılmaktadır.
Sarkaç bu sensörün önünden geçerken bu şekilde
algılama yapmaktadır.

TCRT5000 bağlantısı

7
Sarkacın ölçümü aşağıdaki kod
parçası ile yapılır
//üçüncü gecişte sayacı oku yakala
olc: while(input(TCRT)==1); output_high(LED);sonuc2=sonuc +
get_timer1();
lcd_gotoxy(1,1); printf(lcd_putc," SARKACI KALDIR ");
set_timer1(0); sonuc=0;
lcd_gotoxy(1,2); printf(lcd_putc," BIRAK "); delay_ms(10); while(input(TCRT)==0)
delay_ms(3);output_low(LED);
//sarkac bırakılınca sayacı sıfırla
//ikinci gecişi yakala
while(input(TCRT)==1);
while(input(TCRT)==1); output_high(LED); delay_ms(10);
set_timer1(0); enable_interrupts(GLOBAL); sonuc=0; output_high(LED); while(input(TCRT)==0) delay_ms(3);output_low(LED);
delay_ms(10); while(input(TCRT)==0) delay_ms(3);output_low(LED); //üçüncü gecişte sayacı oku yakala
while(input(TCRT)==1); output_high(LED); sonuc3=sonuc +
//ikinci gecişi yakala get_timer1();
while(input(TCRT)==1); output_high(LED); delay_ms(10); set_timer1(0); sonuc=0;
while(input(TCRT)==0) delay_ms(3);output_low(LED); delay_ms(10); while(input(TCRT)==0) delay_ms(3);
output_low(LED);
//üçüncü gecişte sayacı oku yakala
disable_interrupts(GLOBAL);
while(input(TCRT)==1);output_high(LED); sonuc1=sonuc + get_timer1();

set_timer1(0); sonuc=0; lcd_gotoxy(1,1); printf(lcd_putc,"%Lu %Lu


",sonuc1,sonuc2);
delay_ms(10); while(input(TCRT)==0) delay_ms(3);output_low(LED); lcd_gotoxy(1,2); printf(lcd_putc,"%Lu t1-t2-t3 ",sonuc3);
olcum_bitti:
//ikinci gecişi yakala
while(input(TCRT)==1); output_high(LED); delay_ms(10);
if(input(SW_2)==0) goto start_init;
while(input(TCRT)==0) delay_ms(3);output_low(LED); goto olcum_bitti;

8
2.2 LCD EKRAN BAĞLANTISI VE ÇALIŞMASI

LCD devreye D4-D7 pinlerinden


ve RS ,E pinlerinden
bağlanmıştır. LCD çalışmasını
anlamak için lcd’yi biraz
tanıyalım.

LCD BAĞLANTISI
9
LCD ekranlar bize birçok harfi, sayıları, sembolleri hatta Güney Asya ülkelerin
kullandıkları Kana alfabesindeki karakterleri bile görüntüleme imkanını verirler.
LCD’lerde hane sayıları değişik olabilir. Bir hane 35 nokta içerdiğinden, 7 bölmeli
göstergede olduğu gibi bir tarama işlemi yaparak 20 haneli bir Dot Matris LCD’yi
çalıştırmak için kullanılan mikroişlemcinin görevi sadece LCD’ye veri yazmak olur.
Araya diğer işlemler girerse ekrana yazılan veriler hatalı olur. Bu yüzden LCD’ler
için ekranı kontrol edecek ayrı işlemcilere ihtiyaç duyulur. LCD’ler, bilgisayarda
kullanılan ekran kartları gibi ekrana yazılan bilgilerin sürekli görünebilmeleri için
tarama işlemini yapan entegrelerle birlikte üretilip satılırlar. Bu entegrenin
özelliklerini tam olarak bilmek ekranı her yönüyle kontrol etmek manasına gelir.
Genelde kullanılan bir LCD sürücü entegresi Hitachi firmasının üretmiş olduğu
HD44780 entegresi veya bu entegreye uyumlu bir eşdeğer entegredir. Bu
entegrenin kullanıldığı tüm göstergeleri aynı mantıkla kontrol etmek mümkündür.
Tek değişiklik LCD’nin kaç satır ve haneden oluştuğunu bilmektir.

10
2 Satır x 16 Hane LCD Ekran
4-bit yada 8-bit mikroişlemci bağlantısı
80 x 8 bit RAM
5 x 7 nokta 160 karakter veya 5 x 10 nokta 32 karakter yada karakter üretici ROM
Hem gösterge verileri hem de karakter üreteci RAM verileri mikroişlemci tarafından
okunabilir.
İç komutlar
o Display karakter karartmasý (blink)
o Kursor basa alma (return home)
o Kursor kaydırma (shif)
o Display ON / OFF
o Hane (gösterge) kaydýrma
o Kursor ON / OFF

11
80 veya daha az karaktere ait LCD ekranlar
için pin isimleri aşağıda tablo olarak
verilmiştir. LCD ekranlar yanlış
bağlantılardan dolayı çabuk bozulur, LCD
üzerindeki rakamlar ve bağlantı yönlerinden
emin olunmalıdır.
LCD’ nin 8 data pini, 3 kontrol pini, 2 besleme
pini, bir tanede displayin kontrast ayar pini
vardır. Data pinlerinden LCD’ ye gönderilmek
istenilen bilgi yollanır. Kontrol pinlerinden ise
LCD GÖRÜNÜŞÜ kontrol sinyalleri yollanır.

12
LCD PIN BAĞLANTISI

13
2.2.1 KONTROL PINLERİ
Bu kontrol pinlerinden
birincisi RS pinidir. RS pini 0
iken komut moduna, 1 iken
data moduna girer. İkinci
kontrol pini RW dir. RW pini 0
iken LCD’ ye data veya komut
gönderilir, 1 iken LCD’ den
data okunur. Üçüncü kontrol
pini ise E pinidir. E pini 1 iken
RW ve RS pinlerinden verilen
bilgilere göre data
pinlerindeki bilgiyi yakalar ve
E pini 0 olunca verilen bilgiyi
işler. Bu durumu aşağıdaki
LCD’ye VERİ GÖNDERME şekilde görmek mümkündür.

14
2.2.2 İLK KULLANIMA HAZIRLAMA (Initalization)
Unutulmamalıdır ki, gösterge tarama işlemi nasıl program ile belli bir
sırada yapılıyorsa, LCD kullanırken de belli bir işlem sırası takip
edilmelidir. LCD’ nin çalışması aşağıdaki işlem sırasına göre olmaktadır.
1. Resetlenir.
2. Veri uzunlugu, satır adedi ve karakter fontu belirtilir.
3. Display ON / OFF yapılır.
4. Kursor ayarlanır.
5. Verilerin sağa doğru mu, yoksa sola doğru mu kayacağı belirtilir.
6. Display Data RAM’e istenilen karakterler yazılır.

15
2.2.3 LCD’ nin KOMUTLARI
LCD’ de ekranı silmek için, ekranı sağa veya sola kaydırmak için,
kursörü göstermek için, kursörü gizlemek için, kursörü yanıp
söndürmek için, LCD’ ye data göndermek için, komut göndermek
için, data biti sayısını belirlemek için, ekranı tek yada çift satır
yapmak için, karakter boyunu 5x7 yada 5x10 yapmak için komutları
vardır. Biz bu komutları LCD’ ye gönderdiğimiz zaman LCD bu
komutu anlayıp ne yapması gerekiyorsa onu yapar.

16
17
2.2.4 LCD’ de KARAKTER GÖSTERME
LCD hazırlandıktan sonra LCD’ ye data veya komut
gönderebiliriz.
LCD ekranın herhangi bir yerine data yazabiliriz.
Bunun için LCD ekranın üzerinde kaçıncı karakterin
hangi adreste olduğunu bilmek gerekir. Bunu aşağıdaki
şekilde görebiliriz.
Şekil 3 te görülen adresleri şekil 2 deki gibi hangi
satırda gösterileceğini ayarladıktan sonra elde ettiğimiz
bilgiyi data pinlerine yazıp komut gönderirsek, bundan
sonra LCD’ ye gönderdiğimiz karakter o belirttiğimiz KARAKTER ADRESLEMESİ
adreste gösterilir. Mesela ilk satırın birinci karakterine
cursörü getirmek için 0x80 komutunu göndermemiz
gerekmektedir. İlk satırın 3. Karakterine yazman için
0x82 komutunu göndermemiz gerekmektedir.

18
LCD’de KAÇINCI KARAKTERİN HANGİ ADRESTE OLDUĞU

LCD displayimizin boyutu 2 satır 16 karakter olduğu halde,


LCD’ nin hafıza 2 satır 40 karakter saklayabilir fakat sadece ilk
16 karakteri gösterir. Diğer gösterilmeyen karakterleri
göstermek için displayi sola veya sağa kaydırırsak o
göremediğimiz karakterlerde görüntülenir.

19
2.2.5 ÖRNEK LCD KOMUTLARI
lcd_gotoxy(1,1); bu komut mesaj yazmadan önce gönderilir ve
bundan sonra gönderilecek mesajın lcd ekranın 1.satır 1.
karakterine mesaj yazılacağını belirtir.
printf(lcd_putc,"Merhaba”); ekrana merhaba yazar.

20
3. +5V GÜÇ KAYNAĞI

7805 güç
kaynağından
gelen 12 voltluk
gerilimi pikin
çalışabileceği
+5volta
düşürmektedir.

21
4. BASKI DEVRE ŞEMASI ve YERLEŞTİRME PLANI

22
5.YAZILIM

#include "sarkac.h"
void main()
unsigned int durum; {
unsigned long int i,zaman;
int32 sonuc1,sonuc2,sonuc3,sonuc; setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
#define TCRT PIN_D1
setup_psp(PSP_DISABLED);
#define LED PIN_D2 setup_spi(SPI_SS_DISABLED);
#define LCD_RS PIN_B5 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
#define LCD_EN PIN_B4
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //1us, 65536us
setup_timer_2(T2_DISABLED,0,1);
#define LCD_D0 PIN_B1 setup_comparator(NC_NC_NC_NC);
#define LCD_D1 PIN_B0 setup_vref(FALSE);
#define LCD_D2 PIN_D7 set_adc_channel(0);
durum=0;
#define LCD_D3 PIN_D6
lcd_init();
#include "lcd_mini.h"
#define SW_1 PIN_E0 enable_interrupts(INT_TIMER1);
#define SW_2 PIN_E1 disable_interrupts(GLOBAL);
#define SW_3 PIN_E2 lcd_gotoxy(1,1); printf(lcd_putc," SARKAC PERIYOT ");
#int_TIMER1 lcd_gotoxy(1,2); printf(lcd_putc," BULMA ");
void TIMER1_isr(void) delay_ms(2000);
start_init:
{
lcd_gotoxy(1,1); printf(lcd_putc,"S1 TEST S2 RST ");
sonuc+=65536; lcd_gotoxy(1,2); printf(lcd_putc,"S3 OLC ");
}

23
start:
if(input(SW_1)==0) goto test;
//ikinci gecişi yakala
if(input(SW_3)==0) goto olc;
while(input(TCRT)==1); output_high(LED); delay_ms(10);
goto start; while(input(TCRT)==0) delay_ms(3);output_low(LED);
olc: //üçüncü gecişte sayacı oku yakala
lcd_gotoxy(1,1); printf(lcd_putc," SARKACI KALDIR "); while(input(TCRT)==1); output_high(LED); sonuc3=sonuc +
lcd_gotoxy(1,2); printf(lcd_putc," BIRAK "); get_timer1();
//sarkac bırakılınca sayacı sıfırla set_timer1(0); sonuc=0;
delay_ms(10); while(input(TCRT)==0) delay_ms(3);
while(input(TCRT)==1); output_low(LED);
set_timer1(0); enable_interrupts(GLOBAL); sonuc=0; output_high(LED);
delay_ms(10); while(input(TCRT)==0) delay_ms(3);output_low(LED); disable_interrupts(GLOBAL);
//ikinci gecişi yakala
while(input(TCRT)==1); output_high(LED); delay_ms(10); lcd_gotoxy(1,1); printf(lcd_putc,"%Lu %Lu ",sonuc1,sonuc2);
while(input(TCRT)==0) delay_ms(3);output_low(LED); lcd_gotoxy(1,2); printf(lcd_putc,"%Lu t1-t2-t3 ",sonuc3);
//üçüncü gecişte sayacı oku yakala olcum_bitti:
while(input(TCRT)==1);output_high(LED); sonuc1=sonuc + get_timer1(); if(input(SW_2)==0) goto start_init;
goto olcum_bitti;
set_timer1(0); sonuc=0;
delay_ms(10); while(input(TCRT)==0) delay_ms(3);output_low(LED); test:
lcd_gotoxy(1,1); printf(lcd_putc,"Sarkac oynat ");
//ikinci gecişi yakala lcd_gotoxy(1,2); printf(lcd_putc,"Led Kontrol et ");
while(input(TCRT)==1); output_high(LED); delay_ms(10); test1:
while(input(TCRT)==0) delay_ms(3);output_low(LED); if(input(SW_2)==0) goto start_init;
//üçüncü gecişte sayacı oku yakala if(input(TCRT)==0) output_high(LED); else output_low(LED);
goto test1;
while(input(TCRT)==1); output_high(LED);sonuc2=sonuc + get_timer1();
set_timer1(0); sonuc=0;
delay_ms(10); while(input(TCRT)==0) delay_ms(3);output_low(LED); }

24
Maide UYGUR
141024022
e-mail: maide.uygur@hotmail.com

25

You might also like