791 lines
36 KiB
Plaintext
791 lines
36 KiB
Plaintext
|
||
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>
|