avatar_ete

Çok amaçlı bir Proje

Başlatan ete, 12 Haziran 2012, 11:33:39

ete

Yeni bir proje çalışması ile karşınızdayım. Bu çalışma da fikir bir arkadaşınızdan geldi. Yapmaya çalıştığı ancak zorlandığı bir proje için ona epeyce fikir verdim ve yol gösterdim. Yapıp yapmadığını bilemiyorum. Aslında yaptığına dair onayı aldıktan sonra yayınlayacaktım ama bir bilgi gelmediği gibi aradanda epeyce zaman geçti. Bende projeyi yayınlamaya karar verdim.

Proje Konusu: 4 adet Fonksiyon tuşu ile röleye bağlı olarak bazı motorların aç kapat kontrollerinin yapılması, ayrıca iki ayrı motorun sistemde yer alan hız kontrol üntesi yardımı ile hızlarını 0-10v arası çıkış vererek kontrol edilmesi, ayrıca rölelerden birisinin menüden girilecek AÇIK ve KAPALI sürelerine bağlı olarak rölenin çalışmasının sağlanması.
Bu çalışmanın sağlanması için devrede ,
- 4 adet fonksiyon tuşu
- 1 adet menü ye girme tuşu  (MENU)
- 1 adet secim onaylama veya çıkış tuşu (SEC)
- 1 adet değer girişlerinde değer artırma tuşu (YUKARI)
- 1 adet değer girişlerinde azaltma tuşu (ASAGI) gerekecektir.
Sistemde işlemin takibi amacı ile 1 adet 4x20 karekterilik bir LCD ekran kullanılacaktır.
Yine sistemde 4 er bitlik 2 adet DAC (dijitalden Analog'a çevirici) kullanılacak olup sistem R+2R mantığı ile çalıştırılacaktır. Bunun için birer adet LM358 opamp kullanılacaktır.
Yine sistemde zaman takibi amacı ile 1 adet RTC (DS1307) kullanılması düşünülmüştür.
Projeye Giriş:
Her şeyden önce kendimize projenin amacına uygun bir devre şeması hazırlamamız gerekiyor.
Yaklaşık 8 adet giriş tuşumuz bulunmaktadır.

6 adet pin LCD için gereklidir. 8 adet pin DAC çevirici için gerekli. 2 adet RTC için pin gerekiyor ve 4 adet de röle çıkışı olmak üzere toplam,
8 + 6 + 8 + 2 + 4= 28 adet pin gerekmektedir. Bu durumda mecburen 40 pinli bir işlemci kullanılması zorunlu olacaktır. Be tercih muhtemel hafıza yetersizliğinide ortadan kaldıracak bir tercih olacaktır. Bu nedenle düşünülen işlmeci 16F877A olmuştur.

Bilindiği üzere PORTB de dahili pullup dirençleri mevcuttur ve bunlar programla aktif edilebilirler. Bu sayede buton girişlerini bu porta verirsek ayrıca pullup direnci kullanılması ihtiyacı ortadan kalkacaktır. Bu bakımdan PORTB nin tamamı giriş olarak kullanılacaktır.
PortD ye LCD yi bağlayacağız ve geri kalan pinleri diğer ihtiyaçlar için ayırmış olacağız.
Bu düşünceleri esas alarak oluşturduğumuz devre şeması aşağıda verilmektedir.



Program Senaryo Çalışması:
Her program için bir ön senaryo hazırlanması programın yazılmasında inanılmaz kolaylıklar sağlar. Bu projede de benzer yöntemi kullanarak senaryomuzu oluşturalım.
1. Her şeyden önce sistemimizde eproma kayıtlı olması gereken bilgiler olacaktır. Nedir bunlar derseniz?
  a) Röle nin Açık kalma Süresi
  b) Rölenin Kapalı kalma süresi
  c) Birinci motor Hız değeri
  d) İkinci motor Hız değeri.
  Program ana çalışma kısmına geçmeden ilk açılışta bU değerleri önce epromdan okuması gerekir. Önceden hiç kayıt yapılmamış ise okunan değerler 255 olarak okunacağı için okunan değerlerin 255 olarak okunması durumunda bunlara default değerlerinin bu esnada verilmeside gerekir.

2. Program normal çalışma kısmında yalnızca 4 adet fonksiyon tuşuna basılıp basılmadığını , basılmış ise basılan tuşa bağlı olan Rölenin Toggle şeklinde açılıp kapatılmasını sağlayacaktır.

3. Program yine normal çalışma kısmında Menü tuşuna basılıp basılmadığını kontrol edecek ve basılmış ise programı menü bölümüne aktaracaktır. Menu de neler olacak onu Menü kısmında ayrıca inceleyeceğiz.

4. Yine programın normal çalışma kısmında ;
  - Zamana bağlı olarak çalışacak olan rölenin aktif edilip edilmediğine bakacak. Aktif edilmiş ise zamanlama kısmını faaliyete geçirecek.
  - Zamanlama kısmıRTC ye bağlı olarak çalışacağından ilgili röle aktif edildiği zaman mutlaka bir bit değişkenide aktif edilmesi gerekiyor. Bu sayede o rölenin aktif olup olmadığı test edilebilecektir. Aslında yalnızca röle çıkışına bağlı olarak bu kontrol yapılabilir ama zaman zaman röle kapalı konuma geleceği için ayrı bir AKTIVASYON değişkeni kullanılması avantaj sağlayacaktır. Dolayısıyla röle aktif edildiği zaman AKTIF değişkenide aktif edilecek ve zaman değerleri sıfırlanacaktır.
Zaman kontrolünde ise yalnızca iki konum mevcut olacaktır.
Röle=1 ve Röle=0 konumu. Röle=1 iken Açık kalma süresi sayılacak (dakika bazında) Röle=0 ikende Kapalı kalma süresi sayılacaktır.
Tabiiki bütün bunlar yalnızca AKTIF=1 ise yapılacak işlemler arasındadır.  RTC nin okunması bile yalnızca AKTIF=1 iken yapılacaktır. Diğer zamanlarda RTC nin okunması gerekmeyecektir.

5. Programın ikinci bölümü Menu seçenkerinin ekrana verilmesi ve bunlardan birisinin seçilme işlemi, ve seçim yapıldıktan sonra o seçime ait işlemlerin yerine getirilmesi çalışmaları olacaktır.

6. Menü seçeneklerimize bakacak olursak;
  1. Birinci Motor Hız ayarı
  2. İkinci motor Hız ayarı
  3. Aç Kapa Sürelerinin girilmesi
  4. Menü den çıkılması  şeklinde 4 seçenekten oluşacaktır. Elimizde rakam tuşları olmayacağı için menü seçenekleri arasında dolaşma işinde Aşağı ve Yukarı tuşları kullanılacak ve hangi menü seçeneğinin aktif olduğunu görebilmek amacı ilede ilgili menü seçeneğine bir işaret verilecktir. Bu konumda SEC tuşuna basılarak o satır seçilmiş olacak ve program doğrudan o seçeneğin işlendiği bölüme atlayacaktır.

7. Birinci menü seçeneği seçilmesi durumunda Ekran 1. satırda buna ait açıklama verilecek ve hangi tuşların aktif olduğu ikinci satırda belirtildikten sonra ekrana hız değeri üçüncü satırda verilecektir. Bu aşamada aşağı ve yukarı tuşları ile hız değeri değiştirilecek aynı anda elde edilen değerde Porta verilerek hız kontrolü başlatılmış olacaktır. Hız Ayarı işleminden SEC tuşu ile çıkılacaktır. Çıkış esnasında olulturulan hız değeri kayıt edilecektir.

8. İkinci menü seçeneğinde de diğer motorun hız ayarı söz konusu olduğundan burada da benzer çalışma yapılacak ancak verilen hız değeri diğer motora ait olacaktır.

9. Üçüncü menü seçeneğimiz olan Açık - Kapalı zamanlarının girilmesi işi mümkün olduğunca tek ekranda yapılması uygun olacaktır. Bu nedenle ekranın bir satırına  ACIK_______KAPALI  yazılarını yazıp altlarına uygun hizada o andaki geçerli süreleri yazmak gerekiyor. Daha sonra bu değerleri Yukarı ve Aşağı tuşları yardımı ile değiştirmek ve sonunda SEC tuşu ile ayar ekranından ilgili değeri eproma kayıt ederek çıkılması gerekecektir.

10. Son seçenekde hiç bir işlem yapılmadan menüden ana çalışma ekranına geçiş sağlanacaktır. Bu seçeneğin seçilmesi halinde ekran temizlenerek program BASLA satırına yönlendirilecektir.

Senaryomuz bu kadar. Şimdi Program çalışmasına geçebiliriz. Algoritma bu çalışma sırasında ortaya çıkacaktır.

Program Çalışması ve Algotirma:

Senaryo çalışmasını maddeler halinde ele alırsak yaklaşık program çalışmasının taslağını oluşturabiliriz. Bu nedenle 1. maddeden itibaren başlıyoruz.

1. Eproma kayıt ve Epromdan bilgi okunması,
  Eproma bir bilgi şu komut ile kayıt edilmektedir. WRITE adres,Veri :pause 10
  Burada adres bilgisi kayıdı yapacağımız kayıt adresidir. Veri ise 8 bitlik kayıt edilecek bilgi anlamına gelmektedir. Her kayıt işleminden sonra 10 ms lik bir kayıt süresi vermemiz gerekiyor. AKsi halde sorun yaşarsınız.
Eproma kayıt edilmiş veya epromdaki bir bilginin okunması için READ Adres,Veri şeklinde komut dizisi kullanıyoruz.
OKuma esnasında ayrıca bir okuma gecikmesi vermeye gerek yoktur. Önceden bir kayıt yapılmamış ise Epromdan okunacak bilgi 255 değeridir.
Bu nedenle okuma işlemlerinde IF VERI=255 ise VERI=1 gibi bir default değer verme işlemi yapmalıyız. Aksi halde siz o değişkene gerekli değeri verinceye kadar çalışmalarınızda hatalar mmeydana gelebilir. Burada da benzer şekilde önce okuma yapacağız.
READ 10,ACIK: IF ACIK=255 then ACIK=1
READ 11,KAPALI: IF KAPALI=255 Then KAPALI=1
READ 12,HIZA : IF HIZA=255 THEN HIZA=5
READ 13, HIZB: IF HIZB=255 THEN HIZB=5
şeklinde ilk komutlarımızı vereceğiz.

2. Fonksiyon tuşlarına basılıp basılmadığını kontrol edeceğiz. 1 adedini hemen yazalım.
  IF F1=0 THEN
    ROLE1=1-ROLE1  Bu komut TOGGLE ROLE1 komutunun aynısıdır ve aynı işlemi yapar. Her nedense Toggle komutunu pek sevmiyorum.
    WHILE F1=0:WEND  tusa basılı tutuyor isek bırakıncaya kadar burada bekliyoruz.
    PAUSE 20    Ufak bir gecikme verip işi bitiriyoruz.
  ENDIF
  Bu satırların aynısını F2 - F3 ve F4 tuşları içinde yazmamız gerekiyor. Sistemimizde F3 tuşu ila çalışan röle zamana bağlı olarak AÇ ve KAPA yapacak olduğu için onda ilave komutlar olması gerekiyor . Onuda yazalım.

  IF F3=0 THEN
    ROLE3=1-ROLE3
    AKTIF=1
    SN=0:DAK=0:SAAT=0:GOSUB ZAMANYAZ
      WHILE F3=0:WEND
      PAUSE 20
  WEND

3. Menü tuşunu kontrol edeceğiz.
  IF MENU=0 then AYAR  menu tuşuna basılmış ise AYAR isimli etikete gidilecek.

4. Zamana bağlı rölenin çalışmasını kontrol edelim.
  IF AKTIF=1 THEN          'şayet ilgili röle aktif edilmiş ise
    GOSUB ZAMANOKU        'önce zamanı bir oku
    IF ROLE3=1 AND ACIK=DAK THEN  'yani röle aktif halde ise ve Açık süresi sona ermiş ise
      ROLE3=0
      SN=0:DAK=0:SAAT=0:GOSUB ZAMANYAZ  ' zamanı sıfırla
    ENDIF

    IF ROLE3=0 and KAPALI=DAK THEN
          ROLE3=1
          SN=0:DAK=0:SAAT=0:GOSUB ZAMANYAZ
    ENDIF
  ENDIF
  Ana çalışma kısmında başka kontrol edilecek bir şey kalmadığı için son olarak GOTO BASLA deyip programı başa yönlendiririz.
  Burada bir konuya değineceğim. Normalde bukadar kontrolü program çok kısa bir sürede bitirir. Zaman rölesinin aktif olması durumunda sürekli olarak zamanın okunacağı malumunuzdur. İdeal okuma her 950 ms de bir okumanın yapılmasıdır. Aksi halde okunacak değerlerde bir değişiklik olmayacaktır. Bu nedenle yapılması gereken bir iş daha var diyorum. BASLA satırı ile GOTO BASLA satırı arasında yapıalcak işlerin aldğı süreyi yaklaşık olarak hesaplamak sizi faydalı bir sonuca ulaştırır. Bu süreyi bilirseniz RTC den boşuna anlamsız sıklıkta okuma yapmak zorunda kalmazsınız. Zira RTC de register değerleride arada bir değişmesi gerekir. Değişme anında sizde okuma yaparsanız programınız sekteye uğrayabilir.
Bu nedenle ben şöyle bir taktik uygularım. Bütün tuş kontrellirini bir sıraya sokarım ve o kısımda bir döngü kurarak programın daha fazla tuşlara konsantre olmasını sağlarım. Sonunda döngüden çıkarak gidip RTC yi okurum. Anlayacağınız BAŞLA satırından itibaren RTC okumaya kadar yaklaşık 950 ms zaman harcarım. Bunu orada döngü yardımı ile birden fazla aynı tuşlara basılıyormu diye kontrol ederim. SOnunda döngüden çıkıp gidip zamanı okurum. Böylece registerlerde o anda değişmiş olur ve hiç bir şey sekteye uğramadan sistem çalışır. Sekteye uğrama işini simulasyonda bile görebilirsiniz. RTC yi 10 ms sıklıkla okuyun ve birde 900 ms gecikmeli okuyun. 10 ms aralıkla okuduğunuzda saçmalıklar göreceksiniz.
Her neyse bu döngü işini programın yazılı halinde göreceksiniz. Neden burada döngü kurulmuş demeyesiniz diye açıklamak zorunda kaldım.

5. Menü tuşuna basılarak ayar ekranına geldiğimzde Ekranda;
    - MOTOR_1 HIZ AYARI
    - MOTOR_2 HIZ AYARI
    - ROLE3 ZAMAN AYARI
    - MENU DEN CIKIS
şeklinde menü seçeneklerini göreceğiz. İlk açılışta İlk sıradaki seçeneğin seçili olarak gelmesi nedeni ile ilk sıra şu görünümde olacak
 
  [-] MOTOR_1 HIZ AYARI 
Bu konumda aşağı ve yukarı tuşları ile menü seçenekleri arasında gezinebileceğiz. Örneğin aşağı tuşuna bastığımızda 2. satıra geçeceğiz ve 2. satır görünütüsü şöyle olacaktır.
  [-] MOTOR_2 HIZ AYARI
Köşeli parantez hangi satırda ise o satırın aktif olduğunu anlayacak ve bu konumda SEC tuşuna bastığımız taktirde o satırla ilgili konuma gidileceğini biliyor olacağız.

6. Şimdi sırası ile menü seçeneğinde SEC tuşuna basıldığını farz ederek menu seçeneklerini nasıl işleyeceğimize bakalım.
  AKtif seçili satır birinci satır iken SEC tuşuna basıldığı anda ekrana şu bilgiler gelecektir.

        MOTOR-1 HIZ AYARI
      YUKARI= +  ASAGI= -
              HIZ= 5
      CIKIS SEC TUSU ILE

  HIZ bilgisi o anda kayıtlı hız bilgisi olup bu aşamada bu bilgi ilgili porta verilerek motora hız verilmiş olacaktır.
  Aşağı ve Yukarı tuşlarını kullanarak bu değer artırılıp azaltılabilecektir. Kullandığımız yöntem 4 bit olduğu için maksimum hız değeri 15 minimum ise 0 olabilecektir. Dolayısıyla bu sınırları artırma ve eksiltme işlemlerinde kontrol etmemiz gerekecktir.
  Örneğin,
  IF YUKARI=0 THEN
    HIZA=HIZA+1
    IF HIZA>15 then HIZA=15
    while YUKARI=0:WEND
  ENDIF

  IF ASAGI=0 THEN
    HIZA=HIZA-1
    IF HIZA=255 THEN HIZA=0  'sıfırdan sonra 255 gelediği için
    WHILE ASAGI=0:WEND
  ENDIF
 
  Bu satırları gerekirse bir alt program olarak yazıp ekrana hız bilgisini verdikten sonra programı bu alt programlara yönlendirerek Hız değerini ayarlamalı ve arada SEC tuşunada basılıyor mu diye bakmalıyız. SEC tuşuna basılmış ise o andaki hız değerini eproma kayıt edip ana çalışma ekranına dönmeliyiz.

7. Benzer işlemleri bu seferde MOTOR-2 için yapmalıyız.Hemen hemen aynı satırlar kullanılacağı için artık buna ait açıklamaları yazmıyorum. 6. maddei le aynı olacak yalnızca HIZB değeri işlenmiş olacaktır.

8. Üçüncü satırda iken SEC tuşuna basılmış ise ekrana aşağıdaki bilgiler gelecektir.
 
  ROLE-3 ZAMAN AYARLARI
  YUKARI= +    ASAGI= -   
  ROLE=  ACIK  KAPALI
  DAK.    01
     
  Bu aşamada ilk olarak AÇIK süresi ayarı ekrana gelecek ve aşağı - yukarı tuşları default değer olan 01 değerini artırıp azaltma işini yapacaktır. Ayar işlemi bitince SEC tuşuna basılıp bir sonraki ayar olan KAPALI ayarına geçilecektir. Orada da aynı işlemler yapıldıktan sonra SEC tuşuna basılarak ayarlar eproma kayıt edilip ayar menüsünden çıkılacaktır.

9. SOn seçenek olarak gözüken menüden çıkış seçildiğinde ise program bir işlem yapmadan ana çalışma ekranına dönecektir.

Buraya kadar anlattıklarımız tamamen örnek bir senaryo çalışmasının kısmi program çözümleri ile açıklanmasından ibarettir. Elbette programlama esnasında ufak tefek farklılıklar olacaktır. Önceden aklınıza gelmeyen hususlar programlama esnasında yada programın ilk testleri esnasında görülecek ve bunlara ait ilave kodlar programa ilave edilecektir. Mesela, gerek menü ekranında aktif satır gösteriminde ve gerekse veri girişlerinde seçili alanın flash yaparak gözükmesi kullanıcıya kolaylık sağlar. Bu hususları programlama esnasında yerine getireceğiz.

Burada bahsi geçmeyen ve ön planda görsel bir unsuru olmayan RTC kontrolünü programlamaya bırakıyorum. Zira I2C yöntemi ile haberleşen DS1307 için söylenecek fazla bir şey yok standart komutları kullanarak kodlarımızı yazacağız. Ancak çok yetenekli olan DS1307 nin yalnızca Saniye ve Dakika ve ileride belki kullanılır ihtimali nedeni ile saat özelliğini aktif edeceğiz. Ayrıca BCD (binary kodlanmış Desimal) sistemi ile register kaydı tutan bu RTC de çevrim işlemlerine yalnızca okuma sırasında ihtiyaç olduğu için yalnızca okuma kısmında desmal çevrim işlemini yapacağız.
Bu dediklerimi anlamayanlar için bir açıklama vereyim. DS1307 de örneğin Saat bilgisi birler hanesi ilk 4 bit'de , onlar hanesi ise sonraki 3 bitde bilgi olarak tutulur. Örnek verecek olursak SN=47 ise Bu RTC nin hafızasında şöyle okunur (7=%0111  ve 4=%0100)
SN=%0100 0111  şeklindeki sayının aslıl desimal karşılığı 71 sayısıdır. Ama bu sayıyı hex olarak yazdırırsanız Hex 71=47 olarak çıkar ekrana.
SOnuç olarak saniye değeri RTC den 71 olarak okunur ve bunun kullanılabilmesi için 47 ye çevrilmesi gerekir. Nasılmı?
Şöyle,  Önce TEMP=(SN & %01110000)>>4 ile (%01000111 & %01110000)=%01000000>>4=%00000100 = 4 olarak onlar hanesini elde ederiz.
        sonra SN=temp*10+(SN & %00001111) = 4*10 + (%01000111 & %00001111) = 40 + %00000111)= 40 + 7 = 47 olarak sn değerini buluruz.
8 bitlik bir sayıdan bit ayırma metodu onu, ayırmak istediğiniz hanelerin "1" karşılığı ile AND işlemine tabi tutmak şeklinde uygulanır.
%01000111 şeklindeki saniye değerinin yalnızca ilk 4 bitini almak istiyor isek ilk dört biti 4 adet 1 ile adn işlemine tabi tutarız.
%01000111 & %00001111 işleminin sonucunda &00000111 sayısını elde ederiz. İki sayıdaki aynı sıradaki bitleri AND işlemine tabi tutarsanız (soldan soldan sağa doğru yapalım)
0 & 0 =0
1 & 0 =0
0 & 0 =0
0 & 0 =0
0 & 1 =0
1 & 1 =1
1 & 1 =1
1 & 1 =1
şeklinde sayı elde edilmiş olur. Yeri gelmiş iken AND ifadesi ile & ifadesi arasındaki farkı da izah edeyim.
Şayet bit bazında and işlemi yapacak iseniz & işaretini kullanmanız gerekiyor. Ama Byte bazında And işlemi yapacaksanız AND kullanmanız gerekir.
IF SAYI=1 AND POZ=1 THEN TOPLAM=10 satırında byte bazında bir and karılaştırması yapılmaktadır. Gerek SAYI değişkeni ve gerekse POZ değişkeninin bitlerinin neler olduğu umrumuzda değil çünki sayının bütününü karşılaştırıyoruz.
Ama saniye registerinde bitler önem kazanıyor. yalnızca 4 biti karşılaştırdığımız için o bit bazında bir karşılaştırma oluyor.

Buraya kadar algoritma ve senaryo çalışmamızı tamamlamış olduk artık bundan sonra programın yazılmasına geçebiliriz.
Algoritma kısmında epeyce detaylı inceleme yaptığımız için programı direk veriyorum artık. Anlaşılmayan hususlar için soru sorabilirsiniz. Ayrıca proje dosylarını aşağıdaki linkten yükleyebilirsiniz.
Ete


'**********************************************
'*  Name    : UNTITLED.BAS                    *
'*  Author  : [E T E]                         *
'*  Notice  : Copyright (c) 2012 [E.T.E]      *
'*          : All Rights Reserved             *
'*  Date    : 17.04.2007                      *
'*  Version : 1.0                             *
'*  Notes   :                                 *
'*          :                                 *
'**********************************************
'------------------------------------------------------------------------
@ DEVICE PIC16f877A
@ DEVICE PIC16f877A, WDT_OFF
@ DEVICE PIC16f877A, BOD_ON
@ DEVICE PIC16f877A, PWRT_ON
@ DEVICE PIC16f877A, PROTECT_OFF
@ DEVICE PIC16f877A, HS_OSC
'------------------------------------------------------------------------
define OSC 10
PORTA=0:TRISA=0
PORTB=0:TRISB=%11111111
PORTC=0:TRISC=0
PORTD=0:TRISD=0
PORTE=0:TRISE=%000000100
CMCON=7
ADCON1=7
OPTION_REG.7=0

DEFINE I2C_SLOW 1      ' 8Mhz den yüksek karistal frekanslarında bu komutu kullanmak zorundayız.
DEFINE I2C_SDA PORTE,1 'I2C data pini tanımlaması  
DEFINE I2C_SCL PORTE,0 'I2C CLK pini tanımlaması

DEFINE LCD_DREG  PORTD       '
DEFINE LCD_DBIT  4
DEFINE LCD_EREG  PORTD
DEFINE LCD_EBIT  3
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS  4
DEFINE LCD_LINES 4
'------------------------------------------------------------------------
SN      VAR BYTE 56
DAK     VAR BYTE 57
ACIK    VAR BYTE 58
KAPALI  VAR BYTE 59
SAAT    VAR BYTE 60
ESKISN  VAR BYTE 61
AYGUN   VAR BYTE 62
AY      VAR BYTE 63
YIL     VAR BYTE 64 
HAFGUN  VAR BYTE 65
SECOND  VAR BYTE 66
HOUR    VAR BYTE 67
MINUTE  VAR BYTE 68
WEEK    VAR BYTE 69
DAY     VAR BYTE 70
MONTH   VAR BYTE 71
YEAR    VAR BYTE 72
TEMP    VAR BYTE 73                   
HIZA    var BYTE 74
HIZB    VAR BYTE 75
I       VAR BYTE 76
SAYAC   VAR WORD 77
ARA     VAR BYTE 79


SYMBOL AKTIF=ARA.0 '   VAR Byte 79'   BIT  'FAN MOTORU ÇALIŞTIRILMIŞ İSE AKTIF=1 OLACAK DEĞİLSE AKTİF=0 OLACAK ZAMAN KONTROLÜ İÇİN GEREKLİ

SYMBOL MENU=PORTB.0
SYMBOL SEC =PORTB.1
SYMBOL YUKARI=PORTB.2
SYMBOL ASAGI =PORTB.3
SYMBOL F1 =PORTB.4      'FONKSIYON TUSLARI
SYMBOL F2 =PORTB.5 
SYMBOL F3 =PORTB.6
SYMBOL F4 =PORTB.7 
SYMBOL ELVTR=PORTA.0  'ROLE1
SYMBOL MKINA=PORTA.1  'ROLE2
SYMBOL FAN = PORTA.2  'ROLE3 
SYMBOL LAMP= PORTA.3  'ROLE4
SYMBOL SCL  =PORTE.0
SYMBOL SDA  =PORTE.1
SYMBOL KENAR=PORTE.2
'------------------------------------------------------------------------
PORTB=0
PORTD=0
PORTE=0
PORTA=0

'LCDOUT $FE, $40, $00, $00, $11, $0A, $04, $0A, $11, $00 ' 
'LCDOUT $FE, $48, $00, $00, $00, $01, $02, $14, $08, $00 ' 

LCDOUT $FE, $40,$00, $0E, $11, $11, $11, $11, $0E, $00 '
LCDOUT $FE, $48, $04, $11, $0E, $1F, $0E, $11, $04, $00 ' 

pause 200
LCDOUT $FE,1
PAUSE 300
LCDOUT $FE,$80," BIR ETE PROJESIDIR "
LCDOUT $FE,$C0," BU PROJE ALGORITMA "
LCDOUT $FE,$94," GELISTIRMEK AMACI  "
LCDOUT $FE,$D4,"    URETILMISTIR    "
PAUSE 1000
clear
READ 10,ACIK
IF ACIK=255 THEN ACIK=1
READ 11,KAPALI
IF KAPALI=255 THEN KAPALI=1

READ 12,HIZA:IF HIZA=255 THEN HIZA=5
READ 13,HIZB:IF HIZB=255 THEN HIZB=5

LCDOUT $FE,1
SDA=1:SCL=1
'------------------------------------------------------------------------
BASLA: 
     
    FOR I=0 TO 10
'    T1CON=%00110001:TMR1L=0:TMR1H=0     
      GOSUB EKRAN_BASLA
      IF F1=0 then
        ELVTR=1-ELVTR
        WHILE F1=0:WEND
        pause 10
      ENDIF
      
      PAUSE 5
      
      IF F2=0 then
        MKINA=1-MKINA
        WHILE F2=0:WEND
        pause 10        
      ENDIF
      
      PAUSE 5
      
      IF F3=0 THEN
         IF AKTIF=1 THEN 
            FAN=0
            AKTIF=0
            SN=0:DAK=0
            WHILE F3=0:WEND
            GOTO BASLA
         ENDIF   
         FAN=1-FAN
         IF FAN=1 THEN 
           AKTIF=1
           GOSUB ZAMANAC
         else
           AKTIF=0  
         ENDIF  
         WHILE F3=0:WEND
         PAUSE 10         
      ENDIF   
      
      PAUSE 5
      
      IF F4=0 THEN     
         LAMP=1-LAMP          
         WHILE F4=0:WEND
         PAUSE 10
      ENDIF   
      
      IF MENU=0 THEN AYAR  
' T1CON=0:SAYAC.byte0=TMR1L:SAYAC.Byte1=TMR1H:PIR1.0=0            
     NEXT 

 'BURDAN GERİSİ YAKLAŞIK 30 MS SÜRÜYOR   
      IF AKTIF=1 THEN   'FAN MOTORU AKTİF İSE YANİ ÇALIŞTIRILMIŞ İSE
         GOSUB ZAMANOKU
         IF FAN=1 AND DAK=ACIK THEN
            FAN=0
            GOSUB ZAMANAC
         ENDIF
            
         IF FAN=0 AND DAK=KAPALI THEN
            FAN=1
            GOSUB ZAMANAC
         ENDIF
       ENDIF                       
       PAUSE 5
       
       goto basla

ZAMANAC:
        SECOND=0:MINUTE=0:ESKISN=255:SN=0:DAK=0
        GOSUB ZAMANYAZ
        RETURN
EKRAN_BASLA:   '12345678901234567890"
LCDOUT $FE,$02," F1   F2   F3   F4  "
lcdout $fe,$C0,"ELVT MKIN FFAN LAMP "
LCDOUT $FE,$95,ELVTR,ELVTR,"   ",MKINA,MKINA,"   ",AKTIF,AKTIF,"   ",LAMP,LAMP 

LCDOUT $FE,$D4,"   MENU= AYARLAR    "
RETURN

EKRAN_AYAR:
           lcdout $fe,$02," - ELEVATOR HIZ KONT"
           LCDOUT $fe,$C0," - MAKINA HIZ KONTR."
           lcdout $fe,$94," - ROLE-1 ZAMAN AYAR"
           lcdout $fe,$d4," - AYAR MENUSU CIKIS"
           RETURN
           

HIZ_BIR:   'ELEVATOR HIZ AYARI
        IF YUKARI=0 THEN
           HIZA=HIZA+1
           IF HIZA=16 then HIZA=15
           PAUSE 50
           WHILE YUKARI=0:WEND
        ENDIF   
        
        IF ASAGI=0 THEN
            HIZA=HIZA-1
            IF HIZA=255 THEN HIZA=0
            PAUSE 50
            WHILE ASAGI=0:WEND
        ENDIF    
        PORTC=(PORTC & %11110000)+HIZA
        RETURN
        
HIZ_IKI:   'MAKINA HIZ AYARI
        IF YUKARI=0 THEN
           HIZB=HIZB+1
           IF HIZB=16 then HIZB=15
           PAUSE 50
           WHILE YUKARI=0:WEND
        ENDIF   
        
        IF ASAGI=0 THEN
            HIZB=HIZB-1
            IF HIZB=255 THEN HIZB=0
            PAUSE 50
            WHILE ASAGI=0:WEND
        ENDIF    
        PORTC=(PORTC & %00001111)+HIZB<<4
        RETURN

 AYAR:  TEMP=PORTA & %00001111:PORTA=0
      gosub ekran_AYAR
      WHILE MENU=0:WEND

AYARBIR:
        lcdout $fe,$02,"<->":pause 150:lcdout $fe,$80," - ":PAUSE 150
        IF ASAGI=0 THEN AYARIKI
        IF YUKARI=0 THEN AYARDORT
        IF SEC=0 THEN BIREBIR          
        goto AYARBIR

AYARIKI:
        lcdout $fe,$C0,"<->":pause 150:lcdout $fe,$C0," - ":PAUSE 150
        IF ASAGI=0 THEN AYARUC
        IF YUKARI=0 THEN AYARBIR
        IF SEC=0 THEN IKIBIR    
        goto AYARIKI    
        
AYARUC:
        lcdout $fe,$94,"<->":pause 150:lcdout $fe,$94," - ":PAUSE 150
        IF ASAGI=0 THEN AYARDORT
        IF YUKARI=0 THEN AYARIKI
        IF SEC=0 THEN UCBIR    
        goto AYARUC

AYARDORT:
        lcdout $fe,$D4,"<->":pause 150:lcdout $fe,$D4," - ":PAUSE 150
        IF ASAGI=0 THEN AYARBIR
        IF YUKARI=0 THEN AYARUC
        IF SEC=0 THEN CIKIS   
        goto AYARDORT
                     
BIREBIR: gosub TEMIZLE
       LCDOUT $FE,$80,"ELEVATOR HIZ KONTROL"
       LCDOUT $FE,$C0,"YUKARI= +   ASAGI= -"       
       WHILE SEC=0:WEND
BIREIKI:
       LCDOUT $FE,$9B,"HIZ= ",DEC HIZa,"  "
       LCDOUT $FE,$D4," CIKIS SEC TUSU ILE "
       GOSUB HIZ_BIR
       IF SEC=0 THEN
          WRITE 12,HIZA:PAUSE 10
          GOTO CIKIS
       ENDIF   
       GOTO BIREIKI
       
IKIBIR:
       gosub TEMIZLE
       LCDOUT $FE,$80," MAKINA HIZ KONTROL "
       LCDOUT $FE,$C0,"YUKARI= +   ASAGI= -"       
       WHILE SEC=0:WEND
IKIYEIKI:
       LCDOUT $FE,$9B,"HIZ= ",DEC HIZB,"  "
       LCDOUT $FE,$D4," CIKIS SEC TUSU ILE "
       GOSUB HIZ_IKI
       IF SEC=0 THEN
         WRITE 13,HIZB:PAUSE 10
         GOTO CIKIS
       ENDIF  
       GOTO IKIYEIKI


UCBIR:
      GOSUB TEMIZLE
      LCDOUT $FE,$80,"ROLE-1 ZAMAN AYARLAR"
      LCDOUT $FE,$C0,"YUKARI= +   ASAGI= -" 
      LCDOUT $FE,$94,"ROLE=  ACIK   KAPALI" 
      LCDOUT $FE,$D4,"DAK.="
      WHILE SEC=0:WEND
UCEIKI:             
       LCDOUT $FE,$DD,$FE,$0E:PAUSE 100:LCDOUT $FE,$0C:PAUSE 100
       LCDOUT $FE,$DC,DEC2 ACIK
       IF YUKARI=0 THEN
         ACIK=ACIK+1:IF ACIK>99 THEN ACIK=99
         WHILE YUKARI=0:WEND
       ENDIF
         
       IF ASAGI=0 THEN
          ACIK=ACIK-1:IF ACIK=255 THEN ACIK=0
          WHILE ASAGI=0:WEND
       ENDIF
       IF SEC=0 THEN 
          WHILE SEC=0:WEND
          GOTO UCEUC
       ENDIF   
       GOTO UCEIKI
       
UCEUC:
       LCDOUT $FE,$E5,$FE,$0E:PAUSE 100:LCDOUT $FE,$0C:PAUSE 100
       LCDOUT $FE,$E4,DEC2 KAPALI
       IF YUKARI=0 THEN
         KAPALI=KAPALI+1:IF KAPALI>99 THEN KAPALI=99
         WHILE YUKARI=0:WEND
       ENDIF
         
       IF ASAGI=0 THEN
          KAPALI=KAPALI-1:IF KAPALI=255 THEN KAPALI=0
          WHILE ASAGI=0:WEND
       ENDIF
       IF SEC=0 THEN 
         WRITE 10,ACIK:PAUSE 10
         WRITE 11,KAPALI:PAUSE 10
         GOTO CIKIS
       ENDIF  
       GOTO UCEUC              
      

TEMIZLE:
       LCDOUT $FE,1:RETURN
       
CIKIS:
      GOSUB TEMIZLE       
      WHILE SEC=0:WEND
      PAUSE 100
      PORTA=TEMP
      GOTO BASLA
      

ZAMANOKU:
         I2CRead SDA,SCL,$D0,$00,[SECOND,MINUTE]
         SN =((SECOND>>4) & %00001111)*10+(SECOND & %00001111)
         dak=((MINUTE>>4) & %00001111)*10+(MINUTE & %00001111)
        
        RETURN 
                      
ZAMANYAZ: 
     
        I2CWrite SDA,SCL,$D0,$00,[SECOND]
        I2CWrite SDA,SCL,$D0,$01,[MINUTE]
        I2CWrite SDA,SCL,$D0,$07,[16]
        PAUSE 10
        RETURN 


Mucit23

Hocam Ellerinize sağlık Güzel bir yazı olmuş.
Yazılımda olması gereken yazılımsal senaryoları ve çeşitli alooritma örneklerini anlatmışsınız.
Affınıza sığınarak soruyorum. Bunun gibi bir kontrol cihazı ile neler yapılabilir? Kullanım alanları nelerdir?. Kimlere Hitap ediyor? Hangi amaçla kullanılabilir? Baya kapsamlı bir projeye benziyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#2
Mucit,
Gerek devre olarak ve gerekse algoritma olarak enteresan ögeler içeriyor bu proje.. Pek çok fazla ortalıkta göremeyeceğiniz program yöntemlerinde kullanıyor.. Sistemin gercek anlamda nerede kullanılacağını bilemem. Ama program ve devrenin özelliklerine bakarak şunları söyleyebilirim. İki adet inverter aracılığı ile ac motor hız kontrolü sağlayabilirsiniz. İnverterlerin  pek cogunda kontrol 0-10 v ile yapılır bu devrede buna imkan tanımaktadir. Ayrıca direk buton kontrolü ile 4 ayrı motorun çalıştırılması ve birisinin timler bazında on-off calışması sağlanabilir..
Ete

mierdogan

Bu projeden bir tane yapayım daha önce deneme fırsatınız oldumu hocam? Bendeki cnc cihazına takılabilirmi bir deneyeceğim fakat cnc de monofaze bir kalıp içi taşlama takılı bendeki inverter trifaze neyse bakalım nasıl birşey olacak...
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

mierdogan

Merhaba Ete Hocam

Tek motor için DAC kontrol kontrol değilde dijital potansiyometre kullanmak istesek hangisi daha verimli olur sizce?

Saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

Bu tür işlerde DAC daha uygun olur bence. Digital pot bir sürü çözünürlük getirecektir. Onları ayarlamak zorunda kalacaksın birde.

Ete

mierdogan

Merhaba Hocam,

Programı anlamadım DAC' ı 15 değilde 100 adım yapmak istersek ne yapmalıyız?

Saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

ete

Bu soruyu senin sormamanı beklerdim. R+2R sistemi Opamp'a kaç adet girmiş bir bak bakalım. Toplam 4 adet. Bu ise binary olarak %XXXX  demektir. Yani 0-15 arası toplam 16 kademeli bir çözünürlik demektir.
Bunu %11111 yaparsan çöözünürlüğün 0-31 yani 32 kademe çözünürlük elde edersin.
Bunu %111111 yaparsan 0-63 yani 64 kademe çözünürlük elde edersin.
Bunu %1111111 yaparsan 0-127 yani 128 kademe çözünürlük elde edersin.
Prensip hep aynı 1K dan başlarsın bir sonraki 2K bir sonraki onun 2 katı şeklinde gidiyor.

Ete

mierdogan

#8
Hocam cevap için teşekkür ederim aslını sorarsanız işin toplayıcı opam bölümündeki tarafını sormak istemedim sormak istediğim port çıkışını nasıl yönledirme yaptığınız programda kaydırma yaptığınız 2 etiket var hız_bir ve hız_iki. Programın bu kısmını değiştirmekten bahsetmek istemiştim.

Saygılar
"Doğal bir esin arzulu bir isteğe dönüştüğünde, insan hedefine dev adımlarla ulaşır..."

Mali-88

#9
bu projeden faydalanarak abalog cıkıslı bir program yazmaya çalışıyorum 16 kademe olarak gayet güzel analog çıkış var ancak 1 adet daha direnc eklediğimde 8k dan sonra 16k, analog çıkışta sıkıntı oluyor örneğin 1-0.33v, 2=1.34v, 3=0.98v, 4=2.67v
32 kademe yapmak istiyorum ama yapamadım

proteus dosyası ektedir

@ __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
define OSC 4

DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 ''LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RSREG PORTB ''LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 2 ''LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 ''LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 ''LCD 2 sıra olarak çalışıyor..
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
ADCON1=7
CMCON=1


TRISB=%00000000
TRISA=%00000000
TRISC=%11001111
SYMBOL START_B=PORTC.0
SYMBOL STOP_B=PORTC.6
SYMBOL HIZ_ARTIR=PORTC.2
SYMBOL HIZ_EKSI=PORTC.3
SAYAC VAR BYTE
DAKIKA VAR BYTE
HIZ VAR BYTE
SANIYE VAR BYTE
M0 VAR BYTE
LCDOUT $FE,1
LCDOUT $FE,$82,"CASATI CARLO"
PAUSE 1000
LCDOUT $FE,1
SANIYE=59
DAKIKA=3
PORTC=0
PORTB=0


BASLA:
IF HIZ_ARTIR=0 THEN
HIZ=HIZ+1
IF HIZ=64 THEN HIZ=63
PAUSE 50
WHILE HIZ_ARTIR=0:WEND
ENDIF
IF HIZ_EKSI=0 THEN
HIZ=HIZ-1
WHILE HIZ_EKSI=0:WEND
ENDIF


PORTA=(PORTA & %00011111)+HIZ
LCDOUT $FE,2,#DAKIKA,#HIZ
LCDOUT $FE,$C0,#SANIYE
SAYAC=SAYAC+1

IF PORTB.1=1 THEN
IF SAYAC=140 THEN 
SANIYE=SANIYE-1:SAYAC=0
ENDIF
ENDIF
IF DAKIKA=0 AND SANIYE=1 THEN PORTB.1=0

IF SANIYE=0 THEN SANIYE=59 
IF PORTB.1=0 THEN SANIYE=59     
IF START_B=0 THEN PORTB.1=1
IF SANIYE=58 AND M0=0 THEN M0=1
IF M0=1 THEN
DAKIKA=DAKIKA-1
M0=2
ENDIF
IF SANIYE=57 THEN M0=0 

IF STOP_B=0 THEN PORTB.1=0

GOTO BASLA


Mali-88

#10
ra4 pinini pullup yapmadığım için ve cmcon=1 olduğu için olmadığını keşfettim aşağıdaki gibi programda düzenleme yaptım düzeldi
CMCON=7
PORTA=ANALOG
ANALOG=(ANALOG & %11000000)+HIZ
ANALOG=(ANALOG & %00111111)+HIZ<<6

aRci

güzel bir proje olmuş ve sade yapısı ile kullanışlı geliştirmeye açık bir program elinize sağlık

Naci Osman-torun

Çok güzel bir proje hocam.Bende tam MIAC(akıllı role) hakkında araştırmalar yapıyordum ki senin projeye denk geldim.Kaynak kodlarınıda vermişsin ,ufak-tefek değişikliklerle çok güzel işler yapılır
Paylaşım için teşekkürler

Fatih3755

Alıntı yapılan: ete - 12 Haziran 2012, 11:33:39Yeni bir proje çalışması ile karşınızdayım. Bu çalışma da fikir bir arkadaşınızdan geldi. Yapmaya çalıştığı ancak zorlandığı bir proje için ona epeyce fikir verdim ve yol gösterdim. Yapıp yapmadığını bilemiyorum. Aslında yaptığına dair onayı aldıktan sonra yayınlayacaktım ama bir bilgi gelmediği gibi aradanda epeyce zaman geçti. Bende projeyi yayınlamaya karar verdim.

Proje Konusu: 4 adet Fonksiyon tuşu ile röleye bağlı olarak bazı motorların aç kapat kontrollerinin yapılması, ayrıca iki ayrı motorun sistemde yer alan hız kontrol üntesi yardımı ile hızlarını 0-10v arası çıkış vererek kontrol edilmesi, ayrıca rölelerden birisinin menüden girilecek AÇIK ve KAPALI sürelerine bağlı olarak rölenin çalışmasının sağlanması.
Bu çalışmanın sağlanması için devrede ,
- 4 adet fonksiyon tuşu
- 1 adet menü ye girme tuşu  (MENU)
- 1 adet secim onaylama veya çıkış tuşu (SEC)
- 1 adet değer girişlerinde değer artırma tuşu (YUKARI)
- 1 adet değer girişlerinde azaltma tuşu (ASAGI) gerekecektir.
Sistemde işlemin takibi amacı ile 1 adet 4x20 karekterilik bir LCD ekran kullanılacaktır.
Yine sistemde 4 er bitlik 2 adet DAC (dijitalden Analog'a çevirici) kullanılacak olup sistem R+2R mantığı ile çalıştırılacaktır. Bunun için birer adet LM358 opamp kullanılacaktır.
Yine sistemde zaman takibi amacı ile 1 adet RTC (DS1307) kullanılması düşünülmüştür.
Projeye Giriş:
Her şeyden önce kendimize projenin amacına uygun bir devre şeması hazırlamamız gerekiyor.
Yaklaşık 8 adet giriş tuşumuz bulunmaktadır.

6 adet pin LCD için gereklidir. 8 adet pin DAC çevirici için gerekli. 2 adet RTC için pin gerekiyor ve 4 adet de röle çıkışı olmak üzere toplam,
8 + 6 + 8 + 2 + 4= 28 adet pin gerekmektedir. Bu durumda mecburen 40 pinli bir işlemci kullanılması zorunlu olacaktır. Be tercih muhtemel hafıza yetersizliğinide ortadan kaldıracak bir tercih olacaktır. Bu nedenle düşünülen işlmeci 16F877A olmuştur.

Bilindiği üzere PORTB de dahili pullup dirençleri mevcuttur ve bunlar programla aktif edilebilirler. Bu sayede buton girişlerini bu porta verirsek ayrıca pullup direnci kullanılması ihtiyacı ortadan kalkacaktır. Bu bakımdan PORTB nin tamamı giriş olarak kullanılacaktır.
PortD ye LCD yi bağlayacağız ve geri kalan pinleri diğer ihtiyaçlar için ayırmış olacağız.
Bu düşünceleri esas alarak oluşturduğumuz devre şeması aşağıda verilmektedir.



Program Senaryo Çalışması:
Her program için bir ön senaryo hazırlanması programın yazılmasında inanılmaz kolaylıklar sağlar. Bu projede de benzer yöntemi kullanarak senaryomuzu oluşturalım.
1. Her şeyden önce sistemimizde eproma kayıtlı olması gereken bilgiler olacaktır. Nedir bunlar derseniz?
   a) Röle nin Açık kalma Süresi
   b) Rölenin Kapalı kalma süresi
   c) Birinci motor Hız değeri
   d) İkinci motor Hız değeri.
   Program ana çalışma kısmına geçmeden ilk açılışta bU değerleri önce epromdan okuması gerekir. Önceden hiç kayıt yapılmamış ise okunan değerler 255 olarak okunacağı için okunan değerlerin 255 olarak okunması durumunda bunlara default değerlerinin bu esnada verilmeside gerekir.

2. Program normal çalışma kısmında yalnızca 4 adet fonksiyon tuşuna basılıp basılmadığını , basılmış ise basılan tuşa bağlı olan Rölenin Toggle şeklinde açılıp kapatılmasını sağlayacaktır.

3. Program yine normal çalışma kısmında Menü tuşuna basılıp basılmadığını kontrol edecek ve basılmış ise programı menü bölümüne aktaracaktır. Menu de neler olacak onu Menü kısmında ayrıca inceleyeceğiz.

4. Yine programın normal çalışma kısmında ;
   - Zamana bağlı olarak çalışacak olan rölenin aktif edilip edilmediğine bakacak. Aktif edilmiş ise zamanlama kısmını faaliyete geçirecek.
   - Zamanlama kısmıRTC ye bağlı olarak çalışacağından ilgili röle aktif edildiği zaman mutlaka bir bit değişkenide aktif edilmesi gerekiyor. Bu sayede o rölenin aktif olup olmadığı test edilebilecektir. Aslında yalnızca röle çıkışına bağlı olarak bu kontrol yapılabilir ama zaman zaman röle kapalı konuma geleceği için ayrı bir AKTIVASYON değişkeni kullanılması avantaj sağlayacaktır. Dolayısıyla röle aktif edildiği zaman AKTIF değişkenide aktif edilecek ve zaman değerleri sıfırlanacaktır.
Zaman kontrolünde ise yalnızca iki konum mevcut olacaktır.
Röle=1 ve Röle=0 konumu. Röle=1 iken Açık kalma süresi sayılacak (dakika bazında) Röle=0 ikende Kapalı kalma süresi sayılacaktır.
Tabiiki bütün bunlar yalnızca AKTIF=1 ise yapılacak işlemler arasındadır.  RTC nin okunması bile yalnızca AKTIF=1 iken yapılacaktır. Diğer zamanlarda RTC nin okunması gerekmeyecektir.

5. Programın ikinci bölümü Menu seçenkerinin ekrana verilmesi ve bunlardan birisinin seçilme işlemi, ve seçim yapıldıktan sonra o seçime ait işlemlerin yerine getirilmesi çalışmaları olacaktır.

6. Menü seçeneklerimize bakacak olursak;
   1. Birinci Motor Hız ayarı
   2. İkinci motor Hız ayarı
   3. Aç Kapa Sürelerinin girilmesi
   4. Menü den çıkılması  şeklinde 4 seçenekten oluşacaktır. Elimizde rakam tuşları olmayacağı için menü seçenekleri arasında dolaşma işinde Aşağı ve Yukarı tuşları kullanılacak ve hangi menü seçeneğinin aktif olduğunu görebilmek amacı ilede ilgili menü seçeneğine bir işaret verilecktir. Bu konumda SEC tuşuna basılarak o satır seçilmiş olacak ve program doğrudan o seçeneğin işlendiği bölüme atlayacaktır.

7. Birinci menü seçeneği seçilmesi durumunda Ekran 1. satırda buna ait açıklama verilecek ve hangi tuşların aktif olduğu ikinci satırda belirtildikten sonra ekrana hız değeri üçüncü satırda verilecektir. Bu aşamada aşağı ve yukarı tuşları ile hız değeri değiştirilecek aynı anda elde edilen değerde Porta verilerek hız kontrolü başlatılmış olacaktır. Hız Ayarı işleminden SEC tuşu ile çıkılacaktır. Çıkış esnasında olulturulan hız değeri kayıt edilecektir.

8. İkinci menü seçeneğinde de diğer motorun hız ayarı söz konusu olduğundan burada da benzer çalışma yapılacak ancak verilen hız değeri diğer motora ait olacaktır.

9. Üçüncü menü seçeneğimiz olan Açık - Kapalı zamanlarının girilmesi işi mümkün olduğunca tek ekranda yapılması uygun olacaktır. Bu nedenle ekranın bir satırına  ACIK_______KAPALI   yazılarını yazıp altlarına uygun hizada o andaki geçerli süreleri yazmak gerekiyor. Daha sonra bu değerleri Yukarı ve Aşağı tuşları yardımı ile değiştirmek ve sonunda SEC tuşu ile ayar ekranından ilgili değeri eproma kayıt ederek çıkılması gerekecektir.

10. Son seçenekde hiç bir işlem yapılmadan menüden ana çalışma ekranına geçiş sağlanacaktır. Bu seçeneğin seçilmesi halinde ekran temizlenerek program BASLA satırına yönlendirilecektir.

Senaryomuz bu kadar. Şimdi Program çalışmasına geçebiliriz. Algoritma bu çalışma sırasında ortaya çıkacaktır.

Program Çalışması ve Algotirma:

Senaryo çalışmasını maddeler halinde ele alırsak yaklaşık program çalışmasının taslağını oluşturabiliriz. Bu nedenle 1. maddeden itibaren başlıyoruz.

1. Eproma kayıt ve Epromdan bilgi okunması,
   Eproma bir bilgi şu komut ile kayıt edilmektedir. WRITE adres,Veri :pause 10
   Burada adres bilgisi kayıdı yapacağımız kayıt adresidir. Veri ise 8 bitlik kayıt edilecek bilgi anlamına gelmektedir. Her kayıt işleminden sonra 10 ms lik bir kayıt süresi vermemiz gerekiyor. AKsi halde sorun yaşarsınız.
Eproma kayıt edilmiş veya epromdaki bir bilginin okunması için READ Adres,Veri şeklinde komut dizisi kullanıyoruz.
OKuma esnasında ayrıca bir okuma gecikmesi vermeye gerek yoktur. Önceden bir kayıt yapılmamış ise Epromdan okunacak bilgi 255 değeridir.
Bu nedenle okuma işlemlerinde IF VERI=255 ise VERI=1 gibi bir default değer verme işlemi yapmalıyız. Aksi halde siz o değişkene gerekli değeri verinceye kadar çalışmalarınızda hatalar mmeydana gelebilir. Burada da benzer şekilde önce okuma yapacağız.
READ 10,ACIK: IF ACIK=255 then ACIK=1
READ 11,KAPALI: IF KAPALI=255 Then KAPALI=1
READ 12,HIZA : IF HIZA=255 THEN HIZA=5
READ 13, HIZB: IF HIZB=255 THEN HIZB=5
şeklinde ilk komutlarımızı vereceğiz.

2. Fonksiyon tuşlarına basılıp basılmadığını kontrol edeceğiz. 1 adedini hemen yazalım.
   IF F1=0 THEN
     ROLE1=1-ROLE1   Bu komut TOGGLE ROLE1 komutunun aynısıdır ve aynı işlemi yapar. Her nedense Toggle komutunu pek sevmiyorum.
     WHILE F1=0:WEND  tusa basılı tutuyor isek bırakıncaya kadar burada bekliyoruz.
     PAUSE 20    Ufak bir gecikme verip işi bitiriyoruz.
   ENDIF
   Bu satırların aynısını F2 - F3 ve F4 tuşları içinde yazmamız gerekiyor. Sistemimizde F3 tuşu ila çalışan röle zamana bağlı olarak AÇ ve KAPA yapacak olduğu için onda ilave komutlar olması gerekiyor . Onuda yazalım.

   IF F3=0 THEN
     ROLE3=1-ROLE3
     AKTIF=1
     SN=0:DAK=0:SAAT=0:GOSUB ZAMANYAZ
      WHILE F3=0:WEND
      PAUSE 20
   WEND

3. Menü tuşunu kontrol edeceğiz.
   IF MENU=0 then AYAR   menu tuşuna basılmış ise AYAR isimli etikete gidilecek.

4. Zamana bağlı rölenin çalışmasını kontrol edelim.
   IF AKTIF=1 THEN          'şayet ilgili röle aktif edilmiş ise
     GOSUB ZAMANOKU         'önce zamanı bir oku
     IF ROLE3=1 AND ACIK=DAK THEN  'yani röle aktif halde ise ve Açık süresi sona ermiş ise
       ROLE3=0
       SN=0:DAK=0:SAAT=0:GOSUB ZAMANYAZ  ' zamanı sıfırla
     ENDIF

     IF ROLE3=0 and KAPALI=DAK THEN
           ROLE3=1
           SN=0:DAK=0:SAAT=0:GOSUB ZAMANYAZ
     ENDIF
   ENDIF
   Ana çalışma kısmında başka kontrol edilecek bir şey kalmadığı için son olarak GOTO BASLA deyip programı başa yönlendiririz.
   Burada bir konuya değineceğim. Normalde bukadar kontrolü program çok kısa bir sürede bitirir. Zaman rölesinin aktif olması durumunda sürekli olarak zamanın okunacağı malumunuzdur. İdeal okuma her 950 ms de bir okumanın yapılmasıdır. Aksi halde okunacak değerlerde bir değişiklik olmayacaktır. Bu nedenle yapılması gereken bir iş daha var diyorum. BASLA satırı ile GOTO BASLA satırı arasında yapıalcak işlerin aldğı süreyi yaklaşık olarak hesaplamak sizi faydalı bir sonuca ulaştırır. Bu süreyi bilirseniz RTC den boşuna anlamsız sıklıkta okuma yapmak zorunda kalmazsınız. Zira RTC de register değerleride arada bir değişmesi gerekir. Değişme anında sizde okuma yaparsanız programınız sekteye uğrayabilir.
Bu nedenle ben şöyle bir taktik uygularım. Bütün tuş kontrellirini bir sıraya sokarım ve o kısımda bir döngü kurarak programın daha fazla tuşlara konsantre olmasını sağlarım. Sonunda döngüden çıkarak gidip RTC yi okurum. Anlayacağınız BAŞLA satırından itibaren RTC okumaya kadar yaklaşık 950 ms zaman harcarım. Bunu orada döngü yardımı ile birden fazla aynı tuşlara basılıyormu diye kontrol ederim. SOnunda döngüden çıkıp gidip zamanı okurum. Böylece registerlerde o anda değişmiş olur ve hiç bir şey sekteye uğramadan sistem çalışır. Sekteye uğrama işini simulasyonda bile görebilirsiniz. RTC yi 10 ms sıklıkla okuyun ve birde 900 ms gecikmeli okuyun. 10 ms aralıkla okuduğunuzda saçmalıklar göreceksiniz.
Her neyse bu döngü işini programın yazılı halinde göreceksiniz. Neden burada döngü kurulmuş demeyesiniz diye açıklamak zorunda kaldım.

5. Menü tuşuna basılarak ayar ekranına geldiğimzde Ekranda;
     - MOTOR_1 HIZ AYARI
     - MOTOR_2 HIZ AYARI
     - ROLE3 ZAMAN AYARI
     - MENU DEN CIKIS
şeklinde menü seçeneklerini göreceğiz. İlk açılışta İlk sıradaki seçeneğin seçili olarak gelmesi nedeni ile ilk sıra şu görünümde olacak
 
   [-] MOTOR_1 HIZ AYARI   
Bu konumda aşağı ve yukarı tuşları ile menü seçenekleri arasında gezinebileceğiz. Örneğin aşağı tuşuna bastığımızda 2. satıra geçeceğiz ve 2. satır görünütüsü şöyle olacaktır.
   [-] MOTOR_2 HIZ AYARI
Köşeli parantez hangi satırda ise o satırın aktif olduğunu anlayacak ve bu konumda SEC tuşuna bastığımız taktirde o satırla ilgili konuma gidileceğini biliyor olacağız.

6. Şimdi sırası ile menü seçeneğinde SEC tuşuna basıldığını farz ederek menu seçeneklerini nasıl işleyeceğimize bakalım.
   AKtif seçili satır birinci satır iken SEC tuşuna basıldığı anda ekrana şu bilgiler gelecektir.

       MOTOR-1 HIZ AYARI
      YUKARI= +   ASAGI= -
              HIZ= 5
      CIKIS SEC TUSU ILE

   HIZ bilgisi o anda kayıtlı hız bilgisi olup bu aşamada bu bilgi ilgili porta verilerek motora hız verilmiş olacaktır.
   Aşağı ve Yukarı tuşlarını kullanarak bu değer artırılıp azaltılabilecektir. Kullandığımız yöntem 4 bit olduğu için maksimum hız değeri 15 minimum ise 0 olabilecektir. Dolayısıyla bu sınırları artırma ve eksiltme işlemlerinde kontrol etmemiz gerekecktir.
   Örneğin,
   IF YUKARI=0 THEN
     HIZA=HIZA+1
     IF HIZA>15 then HIZA=15
     while YUKARI=0:WEND
   ENDIF
 
   IF ASAGI=0 THEN
     HIZA=HIZA-1
     IF HIZA=255 THEN HIZA=0   'sıfırdan sonra 255 gelediği için
     WHILE ASAGI=0:WEND
   ENDIF
 
   Bu satırları gerekirse bir alt program olarak yazıp ekrana hız bilgisini verdikten sonra programı bu alt programlara yönlendirerek Hız değerini ayarlamalı ve arada SEC tuşunada basılıyor mu diye bakmalıyız. SEC tuşuna basılmış ise o andaki hız değerini eproma kayıt edip ana çalışma ekranına dönmeliyiz.

7. Benzer işlemleri bu seferde MOTOR-2 için yapmalıyız.Hemen hemen aynı satırlar kullanılacağı için artık buna ait açıklamaları yazmıyorum. 6. maddei le aynı olacak yalnızca HIZB değeri işlenmiş olacaktır.

8. Üçüncü satırda iken SEC tuşuna basılmış ise ekrana aşağıdaki bilgiler gelecektir.
   
   ROLE-3 ZAMAN AYARLARI
   YUKARI= +    ASAGI= -     
   ROLE=   ACIK   KAPALI
   DAK.     01
     
   Bu aşamada ilk olarak AÇIK süresi ayarı ekrana gelecek ve aşağı - yukarı tuşları default değer olan 01 değerini artırıp azaltma işini yapacaktır. Ayar işlemi bitince SEC tuşuna basılıp bir sonraki ayar olan KAPALI ayarına geçilecektir. Orada da aynı işlemler yapıldıktan sonra SEC tuşuna basılarak ayarlar eproma kayıt edilip ayar menüsünden çıkılacaktır.

9. SOn seçenek olarak gözüken menüden çıkış seçildiğinde ise program bir işlem yapmadan ana çalışma ekranına dönecektir.

Buraya kadar anlattıklarımız tamamen örnek bir senaryo çalışmasının kısmi program çözümleri ile açıklanmasından ibarettir. Elbette programlama esnasında ufak tefek farklılıklar olacaktır. Önceden aklınıza gelmeyen hususlar programlama esnasında yada programın ilk testleri esnasında görülecek ve bunlara ait ilave kodlar programa ilave edilecektir. Mesela, gerek menü ekranında aktif satır gösteriminde ve gerekse veri girişlerinde seçili alanın flash yaparak gözükmesi kullanıcıya kolaylık sağlar. Bu hususları programlama esnasında yerine getireceğiz.

Burada bahsi geçmeyen ve ön planda görsel bir unsuru olmayan RTC kontrolünü programlamaya bırakıyorum. Zira I2C yöntemi ile haberleşen DS1307 için söylenecek fazla bir şey yok standart komutları kullanarak kodlarımızı yazacağız. Ancak çok yetenekli olan DS1307 nin yalnızca Saniye ve Dakika ve ileride belki kullanılır ihtimali nedeni ile saat özelliğini aktif edeceğiz. Ayrıca BCD (binary kodlanmış Desimal) sistemi ile register kaydı tutan bu RTC de çevrim işlemlerine yalnızca okuma sırasında ihtiyaç olduğu için yalnızca okuma kısmında desmal çevrim işlemini yapacağız.
Bu dediklerimi anlamayanlar için bir açıklama vereyim. DS1307 de örneğin Saat bilgisi birler hanesi ilk 4 bit'de , onlar hanesi ise sonraki 3 bitde bilgi olarak tutulur. Örnek verecek olursak SN=47 ise Bu RTC nin hafızasında şöyle okunur (7=%0111  ve 4=%0100)
SN=%0100 0111  şeklindeki sayının aslıl desimal karşılığı 71 sayısıdır. Ama bu sayıyı hex olarak yazdırırsanız Hex 71=47 olarak çıkar ekrana.
SOnuç olarak saniye değeri RTC den 71 olarak okunur ve bunun kullanılabilmesi için 47 ye çevrilmesi gerekir. Nasılmı?
Şöyle,  Önce TEMP=(SN & %01110000)>>4 ile (%01000111 & %01110000)=%01000000>>4=%00000100 = 4 olarak onlar hanesini elde ederiz.
        sonra SN=temp*10+(SN & %00001111) = 4*10 + (%01000111 & %00001111) = 40 + %00000111)= 40 + 7 = 47 olarak sn değerini buluruz.
 8 bitlik bir sayıdan bit ayırma metodu onu, ayırmak istediğiniz hanelerin "1" karşılığı ile AND işlemine tabi tutmak şeklinde uygulanır.
%01000111 şeklindeki saniye değerinin yalnızca ilk 4 bitini almak istiyor isek ilk dört biti 4 adet 1 ile adn işlemine tabi tutarız.
%01000111 & %00001111 işleminin sonucunda &00000111 sayısını elde ederiz. İki sayıdaki aynı sıradaki bitleri AND işlemine tabi tutarsanız (soldan soldan sağa doğru yapalım)
0 & 0 =0
1 & 0 =0
0 & 0 =0
0 & 0 =0
0 & 1 =0
1 & 1 =1
1 & 1 =1
1 & 1 =1
şeklinde sayı elde edilmiş olur. Yeri gelmiş iken AND ifadesi ile & ifadesi arasındaki farkı da izah edeyim.
Şayet bit bazında and işlemi yapacak iseniz & işaretini kullanmanız gerekiyor. Ama Byte bazında And işlemi yapacaksanız AND kullanmanız gerekir.
IF SAYI=1 AND POZ=1 THEN TOPLAM=10 satırında byte bazında bir and karılaştırması yapılmaktadır. Gerek SAYI değişkeni ve gerekse POZ değişkeninin bitlerinin neler olduğu umrumuzda değil çünki sayının bütününü karşılaştırıyoruz.
Ama saniye registerinde bitler önem kazanıyor. yalnızca 4 biti karşılaştırdığımız için o bit bazında bir karşılaştırma oluyor.

Buraya kadar algoritma ve senaryo çalışmamızı tamamlamış olduk artık bundan sonra programın yazılmasına geçebiliriz.
Algoritma kısmında epeyce detaylı inceleme yaptığımız için programı direk veriyorum artık. Anlaşılmayan hususlar için soru sorabilirsiniz. Ayrıca proje dosylarını aşağıdaki linkten yükleyebilirsiniz.
Ete


'**********************************************
'*  Name    : UNTITLED.BAS                    *
'*  Author  : [E T E]                         *
'*  Notice  : Copyright (c) 2012 [E.T.E]      *
'*          : All Rights Reserved             *
'*  Date    : 17.04.2007                      *
'*  Version : 1.0                             *
'*  Notes   :                                 *
'*          :                                 *
'**********************************************
'------------------------------------------------------------------------
@ DEVICE PIC16f877A
@ DEVICE PIC16f877A, WDT_OFF
@ DEVICE PIC16f877A, BOD_ON
@ DEVICE PIC16f877A, PWRT_ON
@ DEVICE PIC16f877A, PROTECT_OFF
@ DEVICE PIC16f877A, HS_OSC
'------------------------------------------------------------------------
define OSC 10
PORTA=0:TRISA=0
PORTB=0:TRISB=%11111111
PORTC=0:TRISC=0
PORTD=0:TRISD=0
PORTE=0:TRISE=%000000100
CMCON=7
ADCON1=7
OPTION_REG.7=0

DEFINE I2C_SLOW 1      ' 8Mhz den yüksek karistal frekanslarında bu komutu kullanmak zorundayız.
DEFINE I2C_SDA PORTE,1 'I2C data pini tanımlaması  
DEFINE I2C_SCL PORTE,0 'I2C CLK pini tanımlaması

DEFINE LCD_DREG  PORTD       '
DEFINE LCD_DBIT  4
DEFINE LCD_EREG  PORTD
DEFINE LCD_EBIT  3
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS  4
DEFINE LCD_LINES 4
'------------------------------------------------------------------------
SN      VAR BYTE 56
DAK     VAR BYTE 57
ACIK    VAR BYTE 58
KAPALI  VAR BYTE 59
SAAT    VAR BYTE 60
ESKISN  VAR BYTE 61
AYGUN   VAR BYTE 62
AY      VAR BYTE 63
YIL     VAR BYTE 64 
HAFGUN  VAR BYTE 65
SECOND  VAR BYTE 66
HOUR    VAR BYTE 67
MINUTE  VAR BYTE 68
WEEK    VAR BYTE 69
DAY     VAR BYTE 70
MONTH   VAR BYTE 71
YEAR    VAR BYTE 72
TEMP    VAR BYTE 73                   
HIZA    var BYTE 74
HIZB    VAR BYTE 75
I       VAR BYTE 76
SAYAC   VAR WORD 77
ARA     VAR BYTE 79


SYMBOL AKTIF=ARA.0 '   VAR Byte 79'   BIT  'FAN MOTORU ÇALIŞTIRILMIŞ İSE AKTIF=1 OLACAK DEĞİLSE AKTİF=0 OLACAK ZAMAN KONTROLÜ İÇİN GEREKLİ

SYMBOL MENU=PORTB.0
SYMBOL SEC =PORTB.1
SYMBOL YUKARI=PORTB.2
SYMBOL ASAGI =PORTB.3
SYMBOL F1 =PORTB.4      'FONKSIYON TUSLARI
SYMBOL F2 =PORTB.5 
SYMBOL F3 =PORTB.6
SYMBOL F4 =PORTB.7 
SYMBOL ELVTR=PORTA.0  'ROLE1
SYMBOL MKINA=PORTA.1  'ROLE2
SYMBOL FAN = PORTA.2  'ROLE3 
SYMBOL LAMP= PORTA.3  'ROLE4
SYMBOL SCL  =PORTE.0
SYMBOL SDA  =PORTE.1
SYMBOL KENAR=PORTE.2
'------------------------------------------------------------------------
PORTB=0
PORTD=0
PORTE=0
PORTA=0

'LCDOUT $FE, $40, $00, $00, $11, $0A, $04, $0A, $11, $00 ' 
'LCDOUT $FE, $48, $00, $00, $00, $01, $02, $14, $08, $00 ' 

LCDOUT $FE, $40,$00, $0E, $11, $11, $11, $11, $0E, $00 '
LCDOUT $FE, $48, $04, $11, $0E, $1F, $0E, $11, $04, $00 ' 

pause 200
LCDOUT $FE,1
PAUSE 300
LCDOUT $FE,$80," BIR ETE PROJESIDIR "
LCDOUT $FE,$C0," BU PROJE ALGORITMA "
LCDOUT $FE,$94," GELISTIRMEK AMACI  "
LCDOUT $FE,$D4,"    URETILMISTIR    "
PAUSE 1000
clear
READ 10,ACIK
IF ACIK=255 THEN ACIK=1
READ 11,KAPALI
IF KAPALI=255 THEN KAPALI=1

READ 12,HIZA:IF HIZA=255 THEN HIZA=5
READ 13,HIZB:IF HIZB=255 THEN HIZB=5

LCDOUT $FE,1
SDA=1:SCL=1
'------------------------------------------------------------------------
BASLA: 
     
    FOR I=0 TO 10
'    T1CON=%00110001:TMR1L=0:TMR1H=0     
      GOSUB EKRAN_BASLA
      IF F1=0 then
        ELVTR=1-ELVTR
        WHILE F1=0:WEND
        pause 10
      ENDIF
      
      PAUSE 5
      
      IF F2=0 then
        MKINA=1-MKINA
        WHILE F2=0:WEND
        pause 10        
      ENDIF
      
      PAUSE 5
      
      IF F3=0 THEN
         IF AKTIF=1 THEN 
            FAN=0
            AKTIF=0
            SN=0:DAK=0
            WHILE F3=0:WEND
            GOTO BASLA
         ENDIF   
         FAN=1-FAN
         IF FAN=1 THEN 
           AKTIF=1
           GOSUB ZAMANAC
         else
           AKTIF=0  
         ENDIF  
         WHILE F3=0:WEND
         PAUSE 10         
      ENDIF   
      
      PAUSE 5
      
      IF F4=0 THEN     
         LAMP=1-LAMP          
         WHILE F4=0:WEND
         PAUSE 10
      ENDIF   
      
      IF MENU=0 THEN AYAR  
' T1CON=0:SAYAC.byte0=TMR1L:SAYAC.Byte1=TMR1H:PIR1.0=0            
     NEXT 

 'BURDAN GERİSİ YAKLAŞIK 30 MS SÜRÜYOR   
      IF AKTIF=1 THEN   'FAN MOTORU AKTİF İSE YANİ ÇALIŞTIRILMIŞ İSE
         GOSUB ZAMANOKU
         IF FAN=1 AND DAK=ACIK THEN
            FAN=0
            GOSUB ZAMANAC
         ENDIF
            
         IF FAN=0 AND DAK=KAPALI THEN
            FAN=1
            GOSUB ZAMANAC
         ENDIF
       ENDIF                       
       PAUSE 5
       
       goto basla

ZAMANAC:
        SECOND=0:MINUTE=0:ESKISN=255:SN=0:DAK=0
        GOSUB ZAMANYAZ
        RETURN
EKRAN_BASLA:   '12345678901234567890"
LCDOUT $FE,$02," F1   F2   F3   F4  "
lcdout $fe,$C0,"ELVT MKIN FFAN LAMP "
LCDOUT $FE,$95,ELVTR,ELVTR,"   ",MKINA,MKINA,"   ",AKTIF,AKTIF,"   ",LAMP,LAMP 

LCDOUT $FE,$D4,"   MENU= AYARLAR    "
RETURN

EKRAN_AYAR:
           lcdout $fe,$02," - ELEVATOR HIZ KONT"
           LCDOUT $fe,$C0," - MAKINA HIZ KONTR."
           lcdout $fe,$94," - ROLE-1 ZAMAN AYAR"
           lcdout $fe,$d4," - AYAR MENUSU CIKIS"
           RETURN
           

HIZ_BIR:   'ELEVATOR HIZ AYARI
        IF YUKARI=0 THEN
           HIZA=HIZA+1
           IF HIZA=16 then HIZA=15
           PAUSE 50
           WHILE YUKARI=0:WEND
        ENDIF   
        
        IF ASAGI=0 THEN
            HIZA=HIZA-1
            IF HIZA=255 THEN HIZA=0
            PAUSE 50
            WHILE ASAGI=0:WEND
        ENDIF    
        PORTC=(PORTC & %11110000)+HIZA
        RETURN
        
HIZ_IKI:   'MAKINA HIZ AYARI
        IF YUKARI=0 THEN
           HIZB=HIZB+1
           IF HIZB=16 then HIZB=15
           PAUSE 50
           WHILE YUKARI=0:WEND
        ENDIF   
        
        IF ASAGI=0 THEN
            HIZB=HIZB-1
            IF HIZB=255 THEN HIZB=0
            PAUSE 50
            WHILE ASAGI=0:WEND
        ENDIF    
        PORTC=(PORTC & %00001111)+HIZB<<4
        RETURN

 AYAR:  TEMP=PORTA & %00001111:PORTA=0
      gosub ekran_AYAR
      WHILE MENU=0:WEND

AYARBIR:
        lcdout $fe,$02,"<->":pause 150:lcdout $fe,$80," - ":PAUSE 150
        IF ASAGI=0 THEN AYARIKI
        IF YUKARI=0 THEN AYARDORT
        IF SEC=0 THEN BIREBIR          
        goto AYARBIR

AYARIKI:
        lcdout $fe,$C0,"<->":pause 150:lcdout $fe,$C0," - ":PAUSE 150
        IF ASAGI=0 THEN AYARUC
        IF YUKARI=0 THEN AYARBIR
        IF SEC=0 THEN IKIBIR    
        goto AYARIKI    
        
AYARUC:
        lcdout $fe,$94,"<->":pause 150:lcdout $fe,$94," - ":PAUSE 150
        IF ASAGI=0 THEN AYARDORT
        IF YUKARI=0 THEN AYARIKI
        IF SEC=0 THEN UCBIR    
        goto AYARUC

AYARDORT:
        lcdout $fe,$D4,"<->":pause 150:lcdout $fe,$D4," - ":PAUSE 150
        IF ASAGI=0 THEN AYARBIR
        IF YUKARI=0 THEN AYARUC
        IF SEC=0 THEN CIKIS   
        goto AYARDORT
                     
BIREBIR: gosub TEMIZLE
       LCDOUT $FE,$80,"ELEVATOR HIZ KONTROL"
       LCDOUT $FE,$C0,"YUKARI= +   ASAGI= -"       
       WHILE SEC=0:WEND
BIREIKI:
       LCDOUT $FE,$9B,"HIZ= ",DEC HIZa,"  "
       LCDOUT $FE,$D4," CIKIS SEC TUSU ILE "
       GOSUB HIZ_BIR
       IF SEC=0 THEN
          WRITE 12,HIZA:PAUSE 10
          GOTO CIKIS
       ENDIF   
       GOTO BIREIKI
       
IKIBIR:
       gosub TEMIZLE
       LCDOUT $FE,$80," MAKINA HIZ KONTROL "
       LCDOUT $FE,$C0,"YUKARI= +   ASAGI= -"       
       WHILE SEC=0:WEND
IKIYEIKI:
       LCDOUT $FE,$9B,"HIZ= ",DEC HIZB,"  "
       LCDOUT $FE,$D4," CIKIS SEC TUSU ILE "
       GOSUB HIZ_IKI
       IF SEC=0 THEN
         WRITE 13,HIZB:PAUSE 10
         GOTO CIKIS
       ENDIF  
       GOTO IKIYEIKI


UCBIR:
      GOSUB TEMIZLE
      LCDOUT $FE,$80,"ROLE-1 ZAMAN AYARLAR"
      LCDOUT $FE,$C0,"YUKARI= +   ASAGI= -" 
      LCDOUT $FE,$94,"ROLE=  ACIK   KAPALI" 
      LCDOUT $FE,$D4,"DAK.="
      WHILE SEC=0:WEND
UCEIKI:             
       LCDOUT $FE,$DD,$FE,$0E:PAUSE 100:LCDOUT $FE,$0C:PAUSE 100
       LCDOUT $FE,$DC,DEC2 ACIK
       IF YUKARI=0 THEN
         ACIK=ACIK+1:IF ACIK>99 THEN ACIK=99
         WHILE YUKARI=0:WEND
       ENDIF
         
       IF ASAGI=0 THEN
          ACIK=ACIK-1:IF ACIK=255 THEN ACIK=0
          WHILE ASAGI=0:WEND
       ENDIF
       IF SEC=0 THEN 
          WHILE SEC=0:WEND
          GOTO UCEUC
       ENDIF   
       GOTO UCEIKI
       
UCEUC:
       LCDOUT $FE,$E5,$FE,$0E:PAUSE 100:LCDOUT $FE,$0C:PAUSE 100
       LCDOUT $FE,$E4,DEC2 KAPALI
       IF YUKARI=0 THEN
         KAPALI=KAPALI+1:IF KAPALI>99 THEN KAPALI=99
         WHILE YUKARI=0:WEND
       ENDIF
         
       IF ASAGI=0 THEN
          KAPALI=KAPALI-1:IF KAPALI=255 THEN KAPALI=0
          WHILE ASAGI=0:WEND
       ENDIF
       IF SEC=0 THEN 
         WRITE 10,ACIK:PAUSE 10
         WRITE 11,KAPALI:PAUSE 10
         GOTO CIKIS
       ENDIF  
       GOTO UCEUC              
      

TEMIZLE:
       LCDOUT $FE,1:RETURN
       
CIKIS:
      GOSUB TEMIZLE       
      WHILE SEC=0:WEND
      PAUSE 100
      PORTA=TEMP
      GOTO BASLA
      

ZAMANOKU:
         I2CRead SDA,SCL,$D0,$00,[SECOND,MINUTE]
         SN =((SECOND>>4) & %00001111)*10+(SECOND & %00001111)
         dak=((MINUTE>>4) & %00001111)*10+(MINUTE & %00001111)
        
        RETURN 
                      
ZAMANYAZ: 
     
        I2CWrite SDA,SCL,$D0,$00,[SECOND]
        I2CWrite SDA,SCL,$D0,$01,[MINUTE]
        I2CWrite SDA,SCL,$D0,$07,[16]
        PAUSE 10
        RETURN 





CCS C Bilen ben ve gelen pişmanlık hissi :)


Serk@n

Elinize, emeğinize sağlık ete hocam.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Powered by EzPortal