
KULLANIM KİTAPÇIĞI
==================
LDMicro desteklenen MicroChip PIC16 ve Atmel AVR mikrokontrolcüler için 
gerekli kodu üretir. Bu iş için kullanılabilecek değişik programlar vardır.
Örneğin BASIC, C, assembler gibi. Bu programlar kendi dillerinde yazılmış
programları işlemcilerde çalışabilecek dosyalar haline getirirler.

PLC'de kullanılan dillerden biri  ladder diyagramıdır. Aşağıda LDMicro ile
yazılmış basit bir program görülmektedir.

   ||                                                                    ||
   ||    Xbutton1           Tdon           Rchatter           Yred       ||
 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||
   ||                                 |                                  ||
   ||    Xbutton2           Tdof      |                                  ||
   ||-------]/[---------[TOF 2.000 s]-+                                  ||
   ||                                                                    ||
   ||                                                                    ||
   ||                                                                    ||
   ||    Rchatter            Ton             Tnew           Rchatter     ||
 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||
   ||                                                                    ||
   ||                                                                    ||
   ||                                                                    ||
   ||------[END]---------------------------------------------------------||
   ||                                                                    ||
   ||                                                                    ||

(TON=turn-on gecikme; TOF-turn-off gecikme. --] [-- girişler, diğer bir 
deyişle kontaklardır. --( )-- ise çıkışlardır. Bunlar bir rölenin bobini 
gibi davranırlar. Ladder diyagramı ile ilgili bol miktarda kaynak internet
üzerinde bulunmaktadır. Burada LDMicro'ya has özelliklerden bahsedeceğiz.

LDmicro ladder diyagramını PIC16 veya AVR koduna çevirir. Aşağıda desteklenen
işlemcilerin listesi bulunmaktadır:
    * PIC16F877
    * PIC16F628
    * PIC16F876 (denenmedi)
    * PIC16F88 (denenmedi)
    * PIC16F819 (denenmedi)
    * PIC16F887 (denenmedi)
    * PIC16F886 (denenmedi)
    * ATmega128
    * ATmega64
    * ATmega162 (denenmedi)
    * ATmega32 (denenmedi)
    * ATmega16 (denenmedi)
    * ATmega8 (denenmedi)

Aslında daha fazla PIC16 ve AVR işlemci desteklenebilir. Ancak test ettiklerim
ve desteklediğini düşündüklerimi yazdım. Örneğin PIC16F648 ile PIC16F628 
arasında fazla bir fark bulunmamaktadır. Eğer bir işlemcinin desteklenmesini
istiyorsanız ve bana bildirirseniz ilgilenirim.

LDMicro ile ladder diyagramını çizebilir, devrenizi denemek için gerçek zamanlı 
simülasyon yapabilirsiniz. Programınızın çalıştığından eminseniz programdaki 
giriş ve çıkışlara mikrokontrolörün bacaklarını atarsınız. İşlemci bacakları 
belli olduktan sonra programınızı derleyebilirsiniz. Derleme sonucunda oluşan
dosya .hex dosyasıdır. Bu dosyayı PIC/AVR programlayıcı ile işlemcinize kaydedersiniz.
PIC/AVR ile uğraşanlar konuya yabancı değildir.


LDMicro ticari PLC programları gibi tasarlanmıştır. Bazı eksiklikler vardır. 
Kitapçığı dikkatlice okumanızı tavsiye ederim. Kullanım esnasında PLC ve 
PIC/AVR hakkında temel bilgilere sahip olduğunuz düşünülmüştür.

DİĞER AMAÇLAR
==================

ANSI C kodunu oluşturmak mümkündür. C derleyicisi olan herhangi bir
işlemci için bu özellikten faydalanabilirsiniz. Ancak çalıştırmak için 
gerekli dosyaları siz sağlamalısınız. Yani, LDMicro sadece PlcCycle()
isimli fonksiyonu üretir. Her döngüde PlcCycle fonksiyonunu çağırmak, ve
PlcCycle() fonksiyonunun çağırdığı dijital girişi yazma/okuma vs gibi
G/Ç fonksiyonları sizin yapmanız gereken işlemlerdir.
Oluşturulan kodu incelerseniz faydalı olur.

KOMUT SATIRI SEÇENEKLERİ
========================

Normal şartlarda ldmicro.exe komut satırından seçenek almadan çalışır.
LDMicro'ya komut satırından dosya ismi verebilirsiniz. Örneğin;komut
satırından 'ldmicro.exe asd.ld' yazarsanız bu dosya açılmaya çalışırlır.
Dosya varsa açılır. Yoksa hata mesajı alırsınız. İsterseniz .ld uzantısını
ldmicro.exe ile ilişkilendirirseniz .ld uzantılı bir dosyayı çift tıklattığınızda
bu dosya otomatik olarak açılır. Bkz. Klasör Seçenekleri (Windows).

`ldmicro.exe /c src.ld dest.hex', şeklinde kullanılırsa  src.ld derlenir
ve hazırlanan derleme dest.hex dosyasına kaydedilir. İşlem bitince LDMicro kapanır.
Oluşabilecek tüm mesajlar konsoldan görünür.

TEMEL BİLGİLER
==============

LDMicro açıldığında boş bir program ile başlar. Varolan bir dosya ile başlatırsanız
bu program açılır. LDMicro kendi dosya biçimini kullandığından diğer dosya
biçimlerinden dosyaları açamazsınız.

Boş bir dosya ile başlarsanız ekranda bir tane boş satır görürsünüz. Bu satıra
komutları ekleyebilir, satır sayısını artırabilirsiniz. Satırlara Rung denilir.
Örneğin; Komutlar->Kontak Ekle diyerek bir kontak ekleyebilirsiniz. Bu kontağa
'Xnew' ismi verilir. 'X' bu kontağın işlemcinin bacağına denk geldiğini gösterir.
Bu kontağa derlemeden önce isim vermeli ve mikrokontrolörün bir bacağı ile
eşleştirmelisiniz. Eşleştirme işlemi içinde önce işlemciyi seçmelisiniz.
Elemanların ilk harfi o elemanın ne olduğu ile ilgilidir. Örnekler:

    * Xname -- mikrokontrolördeki bir giriş bacağı
    * Yname -- mikrokontrolördeki bir çıkış bacağı
    * Rname -- `dahili röle': hafızada bir bit.
    * Tname -- zamanlayıcı; turn-on, turn-off yada retentive 
    * Cname -- sayıcı, yukarı yada aşağı sayıcı
    * Aname -- A/D çeviriciden okunan bir tamsayı değer
    * name  -- genel değişken (tamsayı)

İstediğiniz ismi seçebilirsiniz. Seçilen bir isim nerede kullanılırsa
kullanılsın aynı yere denk gelir. Örnekler; bir satırda Xasd kullandığınızda
bir başka satırda Xasd kullanırsanız aynı değere sahiptirler. 
Bazen bu mecburi olarak kullanılmaktadır. Ancak bazı durumlarda hatalı olabilir.
Mesela bir (TON) Turn-On Gecikmeye Tgec ismini verdikten sonra bir (TOF)
Turn_Off gecikme devresine de Tgec ismini verirseniz hata yapmış olursunuz.
Dikkat ederseniz yaptığınız bir mantık hatasıdır. Her gecikme devresi kendi
hafızasına sahip olmalıdır. Ama Tgec (TON) turn-on gecikme  devresini sıfırlamak
için kullanılan RES komutunda Tgec ismini kullanmak gerekmektedir.

Değişken isimleri harfleri, sayıları, alt çizgileri ihtiva edebilir.
(_). Değişken isimleri sayı ile başlamamalıdır. Değişken isimleri büyük-küçük harf duyarlıdır.
Örneğin; TGec ve Tgec aynı zamanlayıcılar değildir.


Genel değişkenlerle ilgili komutlar (MOV, ADD, EQU vs) herhangi bir
isimdeki değişkenlerle çalışır. Bunun anlamı bu komutlar zamanlayıcılar
ve sayıcılarla çalışır. Zaman zaman bu faydalı olabilir. Örneğin; bir 
zamanlayıcının değeri ile ilgili bir karşılaştırma yapabilirsiniz.

Değişkenler hr zaman için 16 bit tamsayıdır. -32768 ile 32767 arasında
bir değere sahip olabilirler. Her zaman için işaretlidir. (+ ve - değere
sahip olabilirler) Onluk sayı sisteminde sayı kullanabilirsiniz. Tırnak
arasına koyarak ('A', 'z' gibi) ASCII karakterler kullanabilirsiniz.

Ekranın alt tarafındaki kısımda kullanılan tüm elemanların bir listesi görünür.
Bu liste program  tarafından otomatik olarak oluşturulur ve kendiliğinden
güncelleştirilir. Sadece 'Xname', 'Yname', 'Aname' elemanları için
mikrokontrolörün bacak numaraları belirtilmelidir. Önce Ayarlar->İşlemci Seçimi
menüsünden işlemciyi seçiniz. Daha sonra G/Ç uçlarını çift tıklatarak açılan
pencereden seçiminizi yapınız.

Komut ekleyerek veya çıkararak programınızı değiştirebilirsiniz. Programdaki
kursör eleman eklenecek yeri veya hakkında işlem yapılacak elemanı göstermek
amacıyla yanıp söner. Elemanlar arasında <Tab> tuşu ile gezinebilirsiniz. Yada
elemanı fare ile tıklatarak işlem yapılacak elemanı seçebilirsiniz. Kursör elemanın
solunda, sağında, altında ve üstünde olabilir. Solunda ve sağında olduğunda
ekleme yaptığınızda eklenen eleman o tarafa eklenir. Üstünde ve altında iken
eleman eklerseniz eklenen eleman seçili elemana paralel olarak eklenir.
Bazı işlemleri yapamazsınız. Örneğin bir bobinin sağına eleman ekleyemezsiniz.
LDMicro buna izin vermeyecektir.

Program boş bir satırla başlar. Kendiniz alta ve üste satır ekleyerek dilediğiniz
gibi diyagramınızı oluşturabilirsiniz. Yukarıda bahsedildiği gibi alt devreler
oluşturabilirsiniz.

Programınız yazdığınızda simülasyon yapabilir, .hex dosyasını oluşturabilirsiniz.

SİMÜLASYON
==========

Simülasyon moduna geçmek için Simülasyon->Simülasyon modu menüsünü tıklatabilir,
yada <Ctrl+M> tuş kombinasyonuna basabilirsiniz. Simülasyon modunda program
farklı bir görüntü alır. Kursör görünmez olur. Enerji alan yerler ve elemanlar
parlak kırmızı, enerji almayan yerler ve elemanlar gri görünür. Boşluk tuşuna
basarak bir çevrim ilerleyebilir yada menüden Simülasyon->Gerçek Zamanlı Simülasyonu Başlat
diyerek (veya <Ctrl+R>) devamlı bir çevrim başlatabilirsiniz. Ladder diyagramının
çalışmasına göre gerçek zamanlı olarak elemanlar ve yollar program tarafından değiştirilir.

Giriş elemanlarının durumunu çift tıklatarak değiştirebilirsiniz. Mesela, 'Xname'
kontağını çift tıklatıranız açıktan kapalıya veya kapalıdan açığa geçiş yapar.

DERLEME
=======

Ladder diyagramının yapılmasındaki amaç işlemciye yüklenecek .hex dosyasının
oluşturulmasıdır. Buna 'derleme' denir. Derlemeden önce şu aşamalar tamamlanmalıdır:
 1- İşlemci seçilmelidir. Ayarlar->İşlemci Seçimi menüsünden yapılır.
 2- G/Ç uçlarının mikrokontrolördeki hangi bacaklara bağlanacağı seçilmelidir.
    Elemanın üzerine çift tıklanır ve çıkan listeden seçim yapılır.
 3- Çevrim süresi tanımlanmalıdır. Ayarlar->İşlemci Ayarları menüsünden yapılır.
	Bu süre işlemcinin çalıştığı frekansa bağlıdır. Çoğu uygulamalar için 10ms
	uygun bir seçimdir. Aynı yerden kristal frekansını ayarlamayı unutmayınız.

Artık kodu üretebilirsiniz. Derle->Derle yada Derle->Farklı Derle seçeneklerinden
birini kullanacaksınız. Aradaki fark Kaydet ve Farklı Kaydet ile aynıdır. Sonuçta
Intel IHEX dosyanız programınızda hata yoksa üretilecektir. Programınızda hata varsa
uyarı alırsınız.

Progamlayıcınız ile bu dosyayı işlemcinize yüklemelisiniz. Buradaki en önemli nokta
işlemcinin konfigürasyon bitlerinin ayarlanmasıdır. PIC16 işlemciler için gerekli 
ayar bilgileri hex dosyasına kaydedildiğinden programlayıcınız bu ayarları algılayacaktır.
Ancak AVR işlemciler için gerekli ayarları siz yapmalısınız.

KOMUTLAR ve ELEMANLAR
=====================

> KONTAK, NORMALDE AÇIK         Xname           Rname          Yname
                             ----] [----     ----] [----    ----] [----

    Normalde açık bir anahtar gibi davranır. Komutu kontrol eden sinyal 0 ise 
	çıkışındaki sinyalde 0 olur. Eğer kontrol eden sinyal 1 olursa çıkışı da 1
	olur ve çıkışa bağlı bobin aktif olur. Bu kontak işlemci bacağından alınan
	bir giriş, çıkış bacağı yada dahili bir röle olabilir.


> KONTAK, NORMALDE KAPALI       Xname           Rname          Yname
                             ----]/[----     ----]/[----    ----]/[----

    Normalde kapalı bir anahtar gibi davranır. Komutun kontrol eden sinyal 0 ise
	çıkışı 1 olur. Eğer kontrol eden sinyal 1 olursa çıkışı 0 olur ve çıkışa
	bağlı elemanlar pasif olur. Normalde çıkışa gerilim verilir, ancak bu kontağı 
	kontrol eden sinyal 1 olursa kontağın çıkışında gerilim olmaz. Bu kontak 
	işlemci bacağından alınan bir giriş, çıkış bacağı yada dahili bir röle olabilir


> BOBİN, NORMAL                 Rname           Yname
                             ----( )----     ----( )----

    Elemana giren sinyal 0 ise dahili röle yada çıkış bacağı 0 yapılır.
	Elemana giren sinyal 1 ise dahili röle yada çıkış bacağı 1 yapılır.
	Bobine	giriş değişkeni atamak mantıksızdır. Bu eleman bir satırda
	sağdaki en son eleman olmalıdır.


> BOBİN, TERSLENMİŞ             Rname           Yname
                             ----(/)----     ----(/)----

    Elemana giren sinyal 0 ise dahili röle yada çıkış bacağı 1 yapılır.
	Elemana giren sinyal 1 ise dahili röle yada çıkış bacağı 0 yapılır.
	Bobine	giriş değişkeni atamak mantıksızdır. Bu eleman bir satırda
	sağdaki en son eleman olmalıdır. Normal bobinin tersi çalışır.
	

> BOBİN, SET                   Rname           Yname
                             ----(S)----     ----(S)----

   	Elemana giren sinyal 1 ise dahili röle yada çıkış bacağı 1 yapılır.
	Diğer durumlarda bu bobinin durumunda bir değişiklik olmaz. Bu komut
	bobinin durumunu sadece 0'dan 1'e çevirir. Bu nedenle çoğunlukla
	BOBİN-RESET ile beraber çalışır. Bu eleman bir satırda sağdaki en
	son eleman olmalıdır.


> BOBİN, RESET                 Rname           Yname
                             ----(R)----     ----(R)----

   	Elemana giren sinyal 1 ise dahili röle yada çıkış bacağı 0 yapılır.
	Diğer durumlarda bu bobinin durumunda bir değişiklik olmaz. Bu komut
	bobinin durumunu sadece 1'dEn 0'a çevirir. Bu nedenle çoğunlukla
	BOBİN-SET ile beraber çalışır. Bu eleman bir satırda sağdaki en
	son eleman olmalıdır.


> TURN-ON GECİKME               Tdon 
                           -[TON 1.000 s]-

    Bir zamanlayıcıdır. Girişindeki sinyal 0'dan 1'e geçerse ayarlanan
	süre kadar sürede çıkış 0 olarak kalır, süre bitince çıkışı 1 olur. 
    Girişindeki sinyal 1'den 0'a geçerse çıkış hemen 0 olur.
	Girişi 0 olduğu zaman zamanlayıcı sıfırlanır. Ayrıca; ayarlanan süre
	boyunca giriş 1 olarak kalmalıdır.

    Zamanlayıcı 0'dan başlayarak her çevrim süresinde 1 artarak sayar.
	Sayı ayarlanan süreye eşit yada büyükse çıkış 1 olur. Zamanlayıcı
	değişkeni üzerinde işlem yapmak mümkündür. (Örneğin MOV komutu ile)


> TURN-OFF GECİKME               Tdoff 
                           -[TOF 1.000 s]-

    Bir zamanlayıcıdır. Girişindeki sinyal 1'den 0'a geçerse ayarlanan
	süre kadar sürede çıkış 1 olarak kalır, süre bitince çıkışı 0 olur. 
    Girişindeki sinyal 0'dan 1'e geçerse çıkış hemen 1 olur.
	Girişi 0'dan 1'e geçtiğinde zamanlayıcı sıfırlanır. Ayrıca; ayarlanan
	süre boyunca giriş 0 olarak kalmalıdır.

    Zamanlayıcı 0'dan başlayarak her çevrim süresinde 1 artarak sayar.
	Sayı ayarlanan süreye eşit yada büyükse çıkış 1 olur. Zamanlayıcı
	değişkeni üzerinde işlem yapmak mümkündür. (Örneğin MOV komutu ile)


> SÜRE SAYAN TURN-ON GECİKME        Trto  
                               -[RTO 1.000 s]-

	Bu zamanlayıcı girişindeki sinyalin ne kadar süre ile 1 olduğunu
	ölçer. Ayaralanan süre boyunca giriş 1 ise çıkışı 1 olur. Aksi halde
	çıkışı 0 olur. Ayarlanan süre devamlı olması gerekmez. Örneğin; süre 
	1 saniyeye ayarlanmışsa ve giriş önce 0.6 sn 1 olmuşsa, sonra 2.0 sn
	boyunca 0 olmuşsa daha sonra 0.4 sn boyunca giriş tekrar 1 olursa
	0.6 + 0.4 = 1sn olduğundan çıkış 1 olur. Çıkış 1 olduktan sonra
	giriş 0 olsa dahi çıkış 0'a dönmez. Bu nedenle zamanlayıcı RES reset
	komutu ile resetlenmelidir.

    Zamanlayıcı 0'dan başlayarak her çevrim süresinde 1 artarak sayar.
	Sayı ayarlanan süreye eşit yada büyükse çıkış 1 olur. Zamanlayıcı
	değişkeni üzerinde işlem yapmak mümkündür. (Örneğin MOV komutu ile)


> RESET (SAYICI SIFIRLAMASI)     Trto             Citems
                             ----{RES}----     ----{RES}----

    Bu komut bir zamanlayıcı veya sayıcıyı sıfırlar. TON ve TOF zamanlayıcı
	komutları kendiliğinden sıfırlandığından bu komuta ihtiyaç duymazlar.
	RTO zamanlayıcısı ve CTU/CTD sayıcıları kendiliğinden sıfırlanmadığından
	sıfırlanmaları için kullanıcı tarafından bu komutile sıfırlanması
	gerekir. Bu komutun girişi 1 olduğunda sayıcı/zamanlayıcı sıfırlanır.
	Bu komut bir satırın sağındaki son komut olmalıdır.


> YÜKSELEN KENAR                 _
                           --[OSR_/ ]--

    Bu komutun çıkışı normalde 0'dır. Bu komutun çıkışının 1 olabilmesi
	için bir önceki çevrimde girişinin 0 şimdiki çevrimde girişinin 1 
	olması gerekir. Komutun çıkışı bir çevrimlik bir pals üretir.
	Bu komut bir sinyalin yükselen kenarında bir tetikleme gereken
	uygulamalarda faydalıdır.
	

> DÜŞEN KENAR                    _
                           --[OSF \_]--

    Bu komutun çıkışı normalde 0'dır. Bu komutun çıkışının 1 olabilmesi
	için bir önceki çevrimde girişinin 1 şimdiki çevrimde girişinin 0 
	olması gerekir. Komutun çıkışı bir çevrimlik bir pals üretir.
	Bu komut bir sinyalin düşen kenarında bir tetikleme gereken
	uygulamalarda faydalıdır.


> KISA DEVRE, AÇIK DEVRE
                           ----+----+----      ----+     +----

    Kısa devrenin çıkışı her zaman girişinin aynısıdır.
	Açık devrenin çıkışı her zaman 0'dır. Bildiğimiz açık/kısa devrenin
	aynısıdır. Genellikle hata aramada kullanılırlar.

> ANA KONTROL RÖLESİ
                           -{MASTER RLY}-

    Normalde her satırın ilk girişi 1'dir. Birden fazla satırın tek bir şart ile 
	kontrol edilmesi gerektiğinde paralel bağlantı yapmak gerekir. Bu ise zordur.
	Bu işlemi kolayca yapabilmek için ana kontrol rölesini kullanabiliriz.
	Ana kontrol rölesi eklendiğinde kendisinden sonraki satırlar bu röleye bağlı
	hale gelir. Böylece; birden fazla satır tek bir şart ile kontrolü sağlanır.
	Bir ana kontrol rölesi kendisinden sonra gelen ikinci bir ana kontrol
	rölesine kadar devam eder. Diğer bir deyişle birinci ana kontrol rölesi
	başlangıcı ikincisi ise bitişi temsil eder. Ana kontrol rölesi kullandıktan
	sonra işlevini bitirmek için ikinci bir ana kontrol rölesi eklemelisiniz.

> MOVE                      {destvar :=  }      {Tret :=     }
                           -{ 123     MOV}-    -{ srcvar  MOV}-

    Girişi 1 olduğunda verilen sabit sayıyı (123 gibi) yada verilen değişkenin
	içeriğini (srcvar) belirtilen değişkene (destvar) atar. Giriş 0 ise herhangi
	bir işlem olmaz. Bu komut ile zamanlayıcı ve sayıcılar da dahil olmak üzere
	tüm değişkenlere değer atayabilirsiniz. Örneğin Tsay zamanlayıcısına MOVE ile
	0 atamak ile RES ile sıfırlamak aynı sonucu doğurur. Bu komut bir satırın
	sağındaki en son komut olmalıdır.

> MATEMATİK İŞLEMLER         {ADD  kay  :=}       {SUB  Ccnt :=}
                            -{ 'a' + 10   }-     -{ Ccnt - 10  }-

>                            {MUL  dest :=}       {DIV  dv :=  }
                            -{ var * -990 }-     -{ dv / -10000}-

    Bu komutun girişi doğru ise belirtilen hedef değişkenine verilen matematik
	işlemin sonucunu kaydeder. İşlenen bilgi zamanlayıcı ve sayıcılar dahil
	olmak üzere değişkenler yada sabit sayılar olabilir. İşlenen bilgi 16 bit
	işaretli sayıdır. Her çevrimde işlemin yeniden yapıldığı unutulmamalıdır.
	Örneğin artırma yada eksiltme yapıyorsanız yükselen yada düşen kenar
	kullanmanız gerekebilir. Bölme (DIV) virgülden sonrasını keser. Örneğin;
	8 / 3 = 2 olur. Bu komut bir satırın sağındaki en son komut olmalıdır.


> KARŞILAŞTIRMA         [var ==]        [var >]        [1 >=]
                       -[ var2 ]-      -[ 1   ]-      -[ Ton]-

>                       [var /=]       [-4 <   ]       [1 <=]
                       -[ var2 ]-     -[ vartwo]-     -[ Cup]-

    Değişik karşılaştırma komutları vardır. Bu komutların girişi doğru (1)
	ve verilen şart da doğru ise çıkışları 1 olur.


> SAYICI                       Cname          Cname
                           --[CTU >=5]--  --[CTD >=5]--

    Sayıcılar girişlerinin 0'dan 1'e her geçişinde yani yükselen kenarında
	değerlerini 1 artırır (CTU) yada eksiltirler (CTD). Verilen şart doğru ise
	çıkışları aktif (1) olur. CTU ve CTD sayıcılarına aynı ismi erebilirsiniz.
	Böylece aynı sayıcıyı artırmış yada eksiltmiş olursunuz. RES komutu sayıcıları
	sıfırlar. Sayıcılar ile genel değişkenlerle kullandığınız komutları kullanabilirsiniz.


> DAİRESEL SAYICI              Cname
                           --{CTC 0:7}--

    Normal yukarı sayıcıdan farkı belirtilen limite ulaşınca sayıcı tekrar 0'dan başlar
    Örneğin sayıcı 0, 1, 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 2,.... şeklinde
	sayabilir. Yani bir dizi sayıcı olarak düşünülebilir. CTC sayıcılar girişlerinin
	yükselen kenarında değer değiştirirler. Bu komut bir satırın sağındaki
	en son komut olmalıdır.
    

> SHIFT REGISTER            {SHIFT REG   }
                           -{ reg0..3    }-

    Bir dizi değişken ile beraber çalışır. İsim olarak reg verdiğinizi ve aşama 
	sayısını 3 olarak tanımladıysanız reg0, reg1, reg2 değikenleri ile çalışırsınız.
	Kaydedicinin girişi reg0 olur. Girişin her yükselen kenarında değerler kaydedicide
	bir sağa kayar. Mesela; `reg2 := reg1'. and `reg1 := reg0'. `reg0' değişmez.
	Geniş bir kaydedici hafızada çok yer kaplar.
	Bu komut bir satırın sağındaki en son komut olmalıdır.


> DEĞER TABLOSU             {dest :=     }
                           -{ LUT[i]     }-

    Değer tablosu sıralanmış n adet değer içeren bir tablodur. Girişi doğru olduğunda
	`dest' tamsayı değişkeni `i' tamsayı değişkenine karşılık gelen değeri alır. Sıra
	0'dan başlar. bu nedenle `i' 0 ile (n-1) arasında olabilir. `i' bu değerler 
	arasında değilse komutun ne yapacağı tanımlı değildir.
	Bu komut bir satırın sağındaki en son komut olmalıdır.


> PIECEWISE LINEAR TABLE    {yvar :=     }
                           -{ PWL[xvar]  }-

    Bir matris tablo olarak düşünülebilir. Bir değere bağlı olarak değerin önceden
	belirlenen bir başka değer ile değiştirilmesi içi oluşturulan bir tablodur.
	Bu bir eğri oluşturmak, sensörden alınan değere göre çıkışta başka bir eğri
	oluşturmak gibi amaçlar için kullanılabilir.

    Farzedelimki x tamsayı giriş değerini y tamsayı çıkış değerine yaklaştırmak 
	istiyoruz. Değerlerin belirli noktalarda olduğunu biliyoruz. Örneğin;

        f(0)   = 2
        f(5)   = 10
        f(10)  = 50
        f(100) = 100

    Bu şu noktaların eğride olduğunu gösterir:

        (x0, y0)   = (  0,   2)
        (x1, y1)   = (  5,  10)
        (x2, y2)   = ( 10,  50)
        (x3, y3)   = (100, 100)

    Dört değeri parçalı lineer tabloya gireriz. Komut, xvar'ın değerine bakarak
	yvar'a değer verir. Örneğin, yukarıdaki örneğe bakarak, xvar = 10 ise
	yvar = 50 olur.
    
	Tabloya kayıtlı iki değerin arasında bir değer verirseniz verilen değer de
	alınması gereken iki değerin arasında uygun gelen yerde bir değer olur.
	Mesela; xvar=55 yazarsanız yvar=75 olur. (Tablodaki değerler (10,50) ve
	(100,100) olduğuna göre). 55, 10 ve 100 değerlerinin ortasındadır. Bu
	nedenle 55 ve 75 değerlerinin ortası olan 75 değeri alınır.
	
	Değerler x koordinatında artan değerler olarak yazılmalıdır. 16 bit tamsayı
	kullanan bazı değerler için arama tablosu üzerinde matematik işlemler
	gerçekleşmeyebilir. Bu durumda LDMicro sizi uyaracaktır. Örneğin aşağıdaki
	tablo bir hata oluşturacaktır:

        (x0, y0)    = (  0,   0)
        (x1, y1)    = (300, 300)

    Bu tip hataları noktalar arsında ara değerler oluşturarak giderebilirsiniz.
	Örneğin aşağıdaki tablo yukarıdakinin aynısı olmasına rağmen hata 
	oluşturmayacaktır.
    
        (x0, y0)    = (  0,   0)
        (x1, y1)    = (150, 150)
        (x2, y2)    = (300, 300)

    Genelde 5 yada 6 noktadan daha fazla değer kullanmak gerekmeyecektir.
	Daha fazla nokta demek daha fazla kod ve daha yavaş çalışma demektir.
	En fazla 10 nokta oluşturabilirsiniz. xvar değişkenine x koordinatında
	tablonun en yüksek değerinden daha büyük bir değer girmenin ve en düşük
	değerinden daha küçük bir değer girmenin sonucu tanımlı değildir.
	Bu komut bir satırın sağındaki en son komut olmalıdır.

> A/D ÇEVİRİCİDEN OKUMA        Aname
                           --{READ ADC}--

    LDmicro A/D  çeviriciden değer okumak için gerekli kodları desteklediği
	işlemciler için oluşturabilir. Komutun girişi 1 olduğunda A/D çeviriciden 
	değer okunur ve okunan değer `Aname' değişkenine aktarılır. Bu değişken
	üzerinde genel değişkenlerle kullanılabilen işlemler kullanılabilir.
	(büyük, küçük, büyük yada eşit gibi). Bu değişkene işlemcinin bacaklarından
	uygun biri tanımlanmalıdır. Komutun girişi 0 ise `Aname'değişkeninde bir
	değişiklik olmaz.
    
    Şu an desteklenen işlemciler için; 0 Volt için ADC'den okunan değer 0, 
	Vdd (besleme gerilimi) değerine eşit gerilim değeri için ADC'den okunan değer
	1023 olmaktadır. AVR kullanıyorsanız AREF ucunu Vdd besleme gerilimine 
	bağlayınız.
	
	Aritmetik işlemler ADC değişkeni için kullanılabilir. Ayrıca bacak tanımlarken
	ADC olmayan bacakların tanımlanmasını LDMicro engelleyecektir.
	Bu komut bir satırın sağındaki en son komut olmalıdır.

	> PWM PALS GENİŞLİĞİ AYARI      duty_cycle
                             -{PWM 32.8 kHz}-

    LDmicro desteklediği mikrokontrolörler için gerekli PWM kodlarını üretebilir.
    Bu komutun girişi doğru (1) olduğunda PWM sinyalinin pals genişliği duty_cycle
	değişkeninin değerine ayarlanır. Bu değer 0 ile 100 arasında değişir. Pals
	genişliği yüzde olarak ayarlanır. Bir periyot 100 birim kabul edilirse bu
	genişliğin yüzde kaçının palsi oluşturacağı ayarlanır. 0 periyodun tümü sıfır
	100 ise periyodun tamamı 1 olsun anlamına gelir. 10 değeri palsin %10'u 1 geri
	kalan %90'ı sıfır olsun anlamına gelir.

    PWM frekansını ayarlayabilirsiniz. Verilen değer Hz olarak verilir.
    Verdiğiniz frekans kesinlikle ayarlanabilir olmalıdır. LDMicro verdiğiniz değeri
	olabilecek en yakın değerle değiştirir. Yüksek hızlarda doğruluk azalır.
    
	Bu komut bir satırın sağındaki en son komut olmalıdır.
    Periyodun süresinin ölçülebilmesi için işlemcinin zamanlayıcılarının bir tanesi
	kullanılır. Bu nedenle PWM en az iki tane zamanlayıcısı olan işlemcilerde kullanılır.
	PWM PIC16 işlemcilerde CCP2'yi, AVR'lerde ise OC2'yi kullanır.


> EEPROMDA SAKLA             saved_var
                           --{PERSIST}--

    Bu komut ile belirtilen değişkenin EEPROM'da saklanması gereken bir değişken olduğunu
	belirmiş olursunuz. Komutun girişi doğru ise belirtilen değişkenin içeriği EEPROM'a
	kaydedilir. Enerji kesildiğinde kaybolmaması istenen değerler için bu komut kullanılır.
	Değişkenin içeriği gerilim geldiğinde tekrar EEPROM'dan yüklenir. Ayrıca;
	değişkenin içeriği her değiştiğinde yeni değer tekrar EEPROM'a kaydedilir.
	Ayrıca bir işlem yapılması gerekmez.
	Bu komut bir satırın sağındaki en son komut olmalıdır.

************************
> UART (SERİ BİLGİ) AL          var
                           --{UART RECV}--

    LDmicro belirli işlemciler için gerekli UART kodlarını üretebilir. AVR işlemcilerde
	sadece UART1 (UART0) değil) desteklenmektedir. İletişim hızı (baudrate) ayarlarını 
	Ayarlar->İşlemci Ayarları menüsünden yapmalısınız. Hız kristal frekansına bağlı olup,
	bazı hızlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktır. 
    
    Bu komutun girişi yanlışsa herhangi bir işlem yapılmaz. Doğru ise UART'dan 1 karakter
	alınmaya çalışılır. Okuma yapılamaz ise komutun çıkışı yanlış (0) olur. Karakter
	okunursa okunan karakter `var' değişkeninde saklanır ve komutun çıkışı doğru (1) olur.
	Çıkışın doğru olması sadece bir PLC çevrimi sürer.


> UART (SERİ BİLGİ) GÖNDER      var
                           --{UART SEND}--

    LDmicro belirli işlemciler için gerekli UART kodlarını üretebilir. AVR işlemcilerde
	sadece UART1 (UART0) değil) desteklenmektedir. İletişim hızı (baudrate) ayarlarını 
	Ayarlar->İşlemci Ayarları menüsünden yapmalısınız. Hız kristal frekansına bağlı olup,
	bazı hızlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktır.
	
    Bu komutun girişi yanlışsa herhangi bir işlem yapılmaz. Doğru ise UART'dan 1 karakter
	gönderilir. Gönderilecek karakter gönderme işleminden önce `var' değişkeninde saklı
	olmalıdır. Komutun çıkışı UART meşgulse (bir karakterin gönderildiği sürece)
	doğru (1) olur. Aksi halde yanlış olur.
	Çıkışın doğru olması sadece bir PLC çevrimi sürer.
	
	Karakterin gönderilmesi belirli bir zaman alır. Bu nedenle başka bir karakter
	göndermeden önce önceki karakterin gönderildiğini kontrol ediniz veya gönderme
	işlemlerinin arasına geikme ekleyiniz. Komutun girişini sadece çıkış yanlış
	(UART meşgul değilse)ise doğru yapınız.

    Bu komut yerine biçimlendirilmiş kelime komutunu (bir sonraki komut) inceleyiniz.
	Biçimlendirilmiş kelime komutunun kullanımı daha kolaydır. İstediğiniz işlemleri
	daha rahat gerçekleştirebilirsiniz.


> UART ÜZERİNDEN BİÇİMLENDİRİLMİŞ KELİME             var
                                            -{"Pressure: \3\r\n"}-

    LDmicro belirli işlemciler için gerekli UART kodlarını üretebilir. AVR işlemcilerde
	sadece UART1 (UART0) değil) desteklenmektedir. İletişim hızı (baudrate) ayarlarını 
	Ayarlar->İşlemci Ayarları menüsünden yapmalısınız. Hız kristal frekansına bağlı olup,
	bazı hızlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktır.

    Bu komutun girişi yanlıştan doğruya geçerse (yükselen kenar) ise seri port üzerinden
	tüm kelimeyi gönderir. Eğer kelime `\3' özel kodunu içeriyorsa dizi içeriği 
	`var' değişkenin içeriği otomatik olarak kelimeye (string) çevrilerek`var'
	değişkeninin içeriği ile değiştirilir. Değişkenin uzunluğu 3 karakter olacak şekilde
	değiştirilir. Mesela; `var' değişkeninin içeriği 35 ise kelime 35 rakamının başına bir
	adet boşul eklenerek `Pressure:  35\r\n' haline getirilir. Veya `var'değişkeninin
	içeriği 1453 ise yapılacak işlem belli olmaz. Bu durumda `\4' kullanmak gerekebilir.

    Değişken negatif bir sayı olabilecekse `\-3d' (veya `\-4d') gibi uygun bir değer
	kullanmalısınız. Bu durumda LDMicro negatif sayıların önüne eksi işareti, pozitif sayıların
	önüne ise bir boşluk karakteri yerleştirecektir.

    Aynı anda birkaç işlem tanımlanırsa, yada UART ile ilgili işlemler birbirine
	karışık hale getirilirse programın davranışı belirli olmayacaktır. Bu nedenle
	dikkatli olmalısınız.

    Kullanılabilecek özel karakterler (escape kodları) şunlardır:
        * \r   -- satır başına geç
        * \n   -- yeni satır
        * \f   -- kağıdı ilerlet (formfeed)
        * \b   -- bir karakter geri gel (backspace)
        * \xAB -- ASCII karakter kodu 0xAB (hex)

    Bu komutun çıkışı bilgi gönderiyorken doğru diğer durumlarda yanlış olur.
    Bu komut program hafızasında çok yer kaplar.


MATEMATİKSEL İŞLEMLER İLE İLGİLİ BİLGİ
======================================

Unutmayın ki, LDMicro 16-bit tamsayı matematik komutlarına sahiptir.
Bu işlemlerde kullanılan değerler ve hesaplamanın sonucu -32768 ile
32767 arasında bir tamsayı olabilir.

Mesela y = (1/x)*1200 formülünü hesaplamaya çalışalım. x 1 ile 20
arasında bir sayıdır. Bu durumda y 1200 ile 60 arasında olur. Bu sayı
16-bit bir tamsayı sınırları içindedir. Ladder diyagramımızı yazalım.
Önce bölelim, sonra çarpma işlemini yapalım:

   ||         {DIV  temp  :=}          ||
   ||---------{ 1 / x       }----------||
   ||                                  ||
   ||          {MUL  y  :=  }          ||
   ||----------{ temp * 1200}----------||
   ||                                  ||

Yada bölmeyi doğrudan yapalım:

   ||           {DIV  y  :=}           ||
   ||-----------{ 1200 / x }-----------||

Matematiksel olarak iki işlem aynıd sonucu vermelidir. Ama birinci işlem
yanlış sonuç verecektir. (y=0 olur). Bu hata `temp' değişkeninin 1'den
küçük sonuç vermesindendir.Mesela x = 3 iken (1 / x) = 0.333 olur. Ama
0.333 bir tamsayı değildir. Bu nedenle sonuç 0 olur. İkinci adımda ise
y = temp * 1200 = 0 olur. İkinci şekilde ise bölen bir tamsayı olduğundan
sonuç doğru çıkacaktır.

İşlemlerinizde bir sorun varsa dikkatle kontrol ediniz. Ayrıca sonucun
başa dönmemesine de dikkat ediniz. Mesela 32767 + 1 = -32768 olur.
32767 sınırı aşılmış olacaktır. 

Hesaplamalarınızda mantıksal değişimler yaparak doğru sonuçlar elde edebilirsiniz.
Örneğin; y = 1.8*x ise formülünüzü y = (9/5)*x şeklinde yazınız.(1.8 = 9/5)
y = (9*x)/5 şeklindeki bir kod sonucu daha tutarlı hale getirecektir.
performing the multiplication first:

   ||         {MUL  temp  :=}          ||
   ||---------{ x * 9       }----------||
   ||                                  ||
   ||           {DIV  y  :=}           ||
   ||-----------{ temp / 5 }-----------||


KODALAMA ŞEKLİ
==============

Programın sağladığı kolaylıklardan faydalanın. Mesela:

   ||       Xa               Ya        ||
 1 ||-------] [--------------( )-------||
   ||                                  ||
   ||       Xb               Yb        ||
   ||-------] [------+-------( )-------||
   ||                |                 ||
   ||                |       Yc        ||
   ||                +-------( )-------||
   ||                                  ||

yazmak aşağıdakinden daha kolay olacaktır.

   ||       Xa               Ya        ||
 1 ||-------] [--------------( )-------||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||       Xb               Yb        ||
 2 ||-------] [--------------( )-------||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||       Xb               Yc        ||
 3 ||-------] [--------------( )-------||
   ||                                  ||

                  *                 *                  *

Yazdığınız kodların sonuçlarına dikkat ediniz. Aşağıdaki satırlarda
mantıksız bir programlama yapılmıştır. Çünkü hem Xa hemde Xb aynı
anda doğru olabilir.

   ||       Xa         {v  :=       }  ||
 1 ||-------] [--------{ 12      MOV}--||
   ||                                  ||
   ||       Xb         {v  :=       }  ||
   ||-------] [--------{ 23      MOV}--||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||      [v >]             Yc        ||
 2 ||------[ 15]-------------( )-------||
   ||                                  ||

Aşağıdaki satırlar yukarda bahsi geçen tarzdadır. Ancak yapılan
işlem 4-bit binary sayı tamsayıya çevrilmektedir.

   ||                                   {v  :=       }  ||
 3 ||-----------------------------------{ 0       MOV}--||
   ||                                                   ||
   ||       Xb0                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 1    }-----------||
   ||                                                   ||
   ||       Xb1                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 2    }-----------||
   ||                                                   ||
   ||       Xb2                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 4    }-----------||
   ||                                                   ||
   ||       Xb3                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 8    }-----------||
   ||                                                   ||


HATALAR (BUG)
=============

LDmicro tarafından üretilen kodlar çok verimli kodlar değildir. Yavaş çalışan
ve hafızada fazla yer kaplayan kodlar olabilirler. Buna rağmen orta büyüklükte
bir PIC veya AVR küçük bir PLC'nin yaptığı işi yapar. Bu nedenle diğer sorunlar
yer yer gözardı edlebilir.

Değişken isimleri çok uzun olmamalıdır. 

Programınız yada kullandığınız hafıza seçtiğiniz işlemcinin sahip olduğundan
büyükse LDMicro hata vermeyebilir. Dikkat etmezseniz programınız hatalı çalışacaktır.

Bulduğunuz hataları yazara bildiriniz.

Teşekkürler:
    * Marcelo Solano, Windows 98'deki UI problemini bildirdiği için,
    * Serge V. Polubarjev, PIC16F628 işlemcisi seçildiğinde RA3:0'ın çalışmadığı
	  ve nasıl düzelteceğimi bildirdiği için,
    * Maxim Ibragimov, ATmega16 ve ATmega162 işlemcileri test ettikleri, problemleri
	  buldukları ve bildirdikleri için,
    * Bill Kishonti, sıfıra bölüm hatası olduğunda simülasyonun çöktüğünü bildirdikleri
	  için,
    * Mohamed Tayae, PIC16F628 işlemcisinde EEPROM'da saklanması gereken değişkenlerin
	  aslında saklanmadığını bildirdiği için,
    * David Rothwell, kullanıcı arayüzündeki birkaç problemi ve "Metin Dosyası Olarak Kaydet"
	  fonksiyonundaki problemi bildirdiği için.


KOPYALAMA VE KULLANIM ŞARTLARI
==============================

LDMICRO TARAFINDAN ÜRETİLEN KODU İNSAN HAYATI VE İNSAN HAYATINI ETKİLEYEBİLECEK
PROJELERDE KULLANMAYINIZ. LDMICRO PROGRAMCISI LDMICRO'NUN KENDİNDEN VE LDMICRO
İLE ÜRETİLEN KODDAN KAYNAKLANAN HİÇBİR PROBLEM İÇİN SORUMLULUK KABUL ETMEMEKTEDİR.

Bu program ücretsiz bir program olup, dilediğiniz gibi dağıtabilirsiniz,
kaynak kodda değişiklik yapabilirsiniz. Programın kullanımı Free Software Foundation
tarafından yazılan GNU General Public License (version 3 ve sonrası)şartlarına bağlıdır.

Program faydalı olması ümidiyle dağıtılmıştır. Ancak hiçbir garanti verilmemektedir.
Detaylar için  GNU General Public License içeriğine bakınız.

Söz konusu sözleşmenin bir kopyası bu programla beraber gelmiş olması gerekmektedir.
Gelmediyse <http://www.gnu.org/licenses/> adresinde bulabilirsiniz.


Jonathan Westhues

Rijswijk      -- Dec 2004
Waterloo ON   -- Jun, Jul 2005
Cambridge MA  -- Sep, Dec 2005
                 Feb, Mar 2006
                 Feb 2007

Email: user jwesthues, at host cq.cx

Türkçe Versiyon : <http://tekelektirik.com/public/ldmicro.rar>
