29 Aralık 2015 Salı

Windows Üzerinde Linux (ext2,ext3,ext4) Dosya Sistemlerine Sahip Disklerin Kullanılması – Ext2Fsd

 Bu yazımızda bir linux dosya sistemi biçimi olan “ext file system” disklerine windows üzerinden sürücü olarak erişmenin basit yolunu anlatmaya çalışacağız. Bilindiği üzere microsoft firması windows ve dos işletim sistemlerinin desteklediği dosya sistemleri dışında bir dosya sistemiyle çalışmanıza izin vermiyor. Özellikle linux dünyasıyla windows arasında çalışmanız gereken bir iş yapıyorsanız linux tarafından da desteklenen windows dosya sistemlerini, yani fat/fat12/fat32/ntfs gibi dossya sistemlerinden biriyle disk olarak çalışmanız gerekmekte. Ancak yine microsoft tarafındaki bazı kısıtlamalardanmı yada teknik sıkıntılardan mı demek doğru olur linux üzerinden windows tipi dosya sistemleri üzerindeki bazı yetkilendirme problemleri, disk bağlantısını windows tarafının kilitlemesi vs. problemlerden dolayı açıkçası bu konuda bir arayış içerisine düşmemize sebep oldu. Bir iki yıl öncesinde Ext2Read, ext4tc gibi yazılımlarla windows tarafından ext dosya sistemlerini bir dosya yöneticisi penceresi aracılığı ile ulaşılabildiğini görmüştüm. Ancak amacım windows tarafındayken normal bir disk gibi bağlanabilmeyi sağlamak. Ntfs diski neyse ext4 diskine de windowsun aynı muameleyi çekmesini istemiştim. Bunu yapan yazılımın ext2fsd olduğunu keşfetmiş bulunmaktayız. Artık windowsun linux disklerine üvey evlat muamelesi yapmasına da son vereceğiz :)

Ext2Fsd tamamen ücretsiz ve açık kaynaklı bir yazılım. Geliştirilmeye 2001 yılında başlanmış esasında uzun soluklu bir proje. Şu an 2015 Aralık ayı itibariyle 0.62 beta sürümüyle boy göstermekte. Beta olmasına rağmen başarılı bulduğumuz bir yazılım. Şimdi bir linux diskini windows üzerinden bağlayıp rahatlıkla kullanabilmek için gerekli olan adımları sırasıyla anlatalım.

  1. Herhangi bir internet tarayıcısında www.ext2fsd.com adresine gidilir.
  2. Sitenin içerisindeki Download yazısında/bağlantısına tıklanır. Açılan sayfada bize yükleme yönergelerinden bahsetmektedir. İster manuel/elle isterseniz kurulum dosyasını çalıştırarak yükleme yapabileceğimizden bahsetmekte. Biz kurulum dosyasıyla yapacağımız için http://sourceforge.net/projects/ext2fsd/files/ bağlantısına tıklayıp indirmelerin olduğu yere ulaşırız.
  3. Açılan sayfada bize son versiyonu yüklemek istersek kullanacağımızı bağlantıyı hazır halde göstermektedir. “Looking for the latest version? Download Ext2Fsd-0.62.exe (2.8 MB)
  4. Bu bağlantıya tıklayıp kaydetmemizi istediği dosyayı bilgisayarımıza kaydedip daha sonra fareyle çift tıklayarak çalıştırırız.
  5. Kurulum talimatlarını sırasıyla “ileri” butonuna basarak uygularız. Böylece yazılım bilgisayarımıza kurulmuş oldu.

Başlat menüsünden Ext2Fsd --> “Ext2 Volume Manager” başlatma kısayolunu bularak yazılımı çalıştırırız. Aşağıdaki gibi bir ekran bizi karşılayacaktır.





Gördüğünüz üzere Bölüm Tipi “Linux” olarak gözüken (F:) ile isimlendirilmiş EXT4 dosya sistemindeki diski seçmiş bulunmaktayız. Biz şimdilik sadece bu linux diskini İşletim sisteminize yani windows'a bağlayacağız. Bunun için ya tools menüsüne yada fareye sağ tıklayarak aşağıda görünen ekran sağlanır.




Ext2 Volume Management” menüsüne tıkladığımızda aşağıdaki ekran gelecektir.



Biraz bu ekrandan bahsedecek olursak “Volume attribute” başlığının altında diskimiz sadece okunur kipte bağlanabiliriz. Bu okumayı hangi karakter setine göre işletim sisteminin “anlaması” gerektiğini yanındaki Codepage açılır kutusundaki seçenekle yapabiliriz. Bizim seçili linux diskimiz utf8 dir.

Mount Point & driver letter” başlığı altında iki seçenek kutusu bulunmakta. İlki Ext2Mgr çalıştığında bu seçili disk otomatik olarak bağlansın istiyorsak buraya çentik atmalıyız. Diğer “Mountpoint for fixed disk, need reboot” seçeneğini seçersek şayet bu seçili disk bilgisayar windows ile açıldığında hiçbir işleme gerek kalmadan sisteme diğer windows diskleri gibi otomatik bağlanacaktır. Eğer diski sürekli windows tarafından açtığınızda hemen kullanılır durumda olmasını istiyorsanız son söylediğimiz seçenek size uyan seçenektir. He iki şekilde de sonuç aşağıdaki gibi görünecektir.





Görünen “Yerel Disk (F:)” bizim linux diskimizdir. Üzerine fareyle çift tıkladığızda gördüğünüz klasik bir linux diskinin içi olacaktır.




Biz bu bağladığımız disk içerisinde bulunan bir Firebird veritabanı kullanan bir uygulama yazılımının başarı ile çalıştırıp bu diske başarı bir şekilde verilerin yazıldığını gördük. Şunu hemen belirtelim; windows tarafında linux disklerinizi sisteme salt okunur dışında bir kip/mod da bağladığınızda windows viruslerinin bulaşmasına da hazır halde gelebileceğini unutmayın. Eğer sadece okuma işlemi yapacaksanız bu açıdan en güvenli yol “salt okunur” kip ile bağlantı sağlamak olacaktır. Başka bir yazıda görüşmek üzere hoşçakalın.

duralikiraz.blogspot.com
29 Aralık 2015
“Muvaffakiyet Allahtandır.”

26 Aralık 2015 Cumartesi

Lazarusta (Ubuntuda) Çalıştırılabilir dosya boyutunu UPX ile küçülme işlemi.


Bundan bir önceki yazımızda “Smart Strip” işleminden bahsetmiştik. Smart Strip lazarus'un oluşturduğu “elf” çalıştırılabilir dosyalarının içerisinde bulunan debug bilgilerinin temizlenerek dosya boyutunu nispeten küçültmemizi sağlamaktaydı. Peki daha da küçültmek istiyorsak çalıştırılabilir dosyamızı yapmamız gereken şey nedir? Tabiki sıkıştırma programları. Piyasa birçok sıkıştırma programı olduğu söylenebilir. Bunlardan birisi de tamamen ücretsiz ve açık kaynak olan UPX programıdır. Bu tip programlar çalıştırılabilir formdaki elf yada exe tipindeki dosyaların sıkıştırılması işlemini yapar. Bu sıkıştırma işlemi çalıştırılabilir dosyanın boyutunu küçültme maksadıyla yapıldığı gibi daha çok yazılımın “cracker” dediğimiz dosya hackleme işlemini yapan kişilerden korumak maksadıyla yapılır. Tabi UPX bilinen bir sıkıştırma algoritmasına sahip olduğu için cracker lar açısından pek uğraştırıcı bir koruma olmayacaktır. Bizim burada kullanma maksadımız çalıştırılabilir dosyamızın daha iyi dağıtılabilir olması için asgari dosya boyutunu elde etmek olduğu için anlatımımız bu yönde olacaktır.

İlk yazımızda bahsettiğimiz gibi öncelikle lazarus “Araçlar (tools)” menüsünden “Configure External Tools” menüsüne tıklarız. Açılan ekrandan sırasıyla “Ekle” butonuna tıklarız. Karşımıza “Edit Tool” isimli bir ekran gelecek. Bu ekranda;


Title : UPX Sıkıştırma
Program Name : /home/gnukarabatak/upx-3.91-i386_linux/upx
Parameters : ./upx "$TargetFile()"

Bir derlenmiş dosyayla ilgili yapılmış bir çalışmadan örnek veriler :

Sırası
İşlem Adı
İşlem Öncesi Dosya Boyutu
İşlem Sonrası Dosya Boyutu
1
Derleme İşlemi .... 56,8 MB
2
Smart Strip 56,8 MB 9,1 MB
3
UPX Sıkıştırma 9,1 MB 3,0 MB


Lazarusla ilgili ekran görüntüleri aşağıdaki gibidir.


 


 


 
Bu yazıdaki en önemli nokta ve hatta bu yazıyı yazmama sebep olan husus girilen “Parameters” değeridir. Ubuntu için bu değeri

./upx "$TargetFile()" yerine
upx "$TargetFile()" şeklinde 

girerseniz Upx çalışmayacaktır. Bu ubuntu(linux) üzerindeki elf formundaki dosyaların konsol /terminal üzerinde çalıştırılırken uyulması gereken bir kuraldan kaynaklandığını söyleyebiliriz. Ayrıntılar için ubuntu yada linux kullanım kitapçıklarına, wiki belgelerine bakabilirsiniz.

Başka bir yazıda görüşmek üzere hoşçakalın.


duralikiraz.blogspot.com
21 Aralık 2015
Muvaffakiyet Allahtandır.”


Kaynaklar :

21 Aralık 2015 Pazartesi

Lazarusda (ubuntu üzerinde) Çalıştırılabilir Dosya Boyutunu Küçültme İşlemi


Çoğumuzun bildiği üzere Lazarusta derleme esnasında oluşan elf yada exe dosyaların boyutları debug bilgilerinin ihtiva edilmesinden dolayı biraz şişkin olabilmektedir. Normal bir çalışmada kullanılmayan bu fazlalık kısımların elf/exe dosyalardan temizlenmesi gereksiz yer işgal etmemesi açısından faydalı olur. Bu işlemin exe dosyalar için olan “nasıl yapılır” bilgilerini boreas.gen.tr1 de C.Emre Öz'ün çalışmasından ve ayrıca daha geniş anlatımıyla lazplanet2 sitesinden de inceleyebilirsiniz. Biz burada ubuntu üzerinde kurulu lazarusta nasıl olduğunu kısaca bahsedeceğiz.

Öncelikle bu işlemi yapan dosya ubuntu üzerinde varsayılan kurulumla yüklenmiş Lazarus idesi için “/usr/share/lazarus/1.4.4/tools/install/smart_strip.sh” adresinde bulunur. Anlaşılacağı üzere bu bir betik(script)dir. Bize düşen doğru parametreyi verip smart_strip.sh betiği ile maksadımıza ulaşmak. Doğrudan bir derlenmiş elf dosyasını

./smart_strip.sh --strip-all "DosyaAdı"

şeklinde doğrudan işleme tâbi tutup sonuca ulaşabiliriz. Aslında anlatılacak olan şeyin hepsi bu :) Peki bu şekilde elde uğraşmayıpta doğrudan Lazarus programına entegre etmemiz nasıl olacak? Bunun için öncelikle Lazarus ide sinin Tools(araçlar) menüsünden “Configure External Tool..” menü başlığına tıklarız. Açılan ekrandan Ekle(insert) butonuna tıklanır. Aşağıdaki gibi bir ekran gelir ve aşağıdaki gibi bilgileri doldururuz.

Burada can alıcı nokta

  1. Program ismi ve yolu olarak : /usr/share/lazarus/1.4.4/tools/install/smart_strip.sh
  2. Parametreler kısmına : --strip-all "$TargetFile()"

bilgilerinin işlenmesi. Şekil aşağıdadır.






 
Bu ekrandan OK tıklanır ve pencereler kapatılır. Artık Tools(Araçlar) menüsünün altında “smart strip” isimli bir yeni menü başlığımız oluşmuştur. Tek yapmamız gereken Lazarusda derleme yaptıktan sonra bu menü başlığına bir kere tıklamak. Göreceğiniz üzere elf/exe dosyalarınızın boyutu neredeyse 4 te 1 ine inmiş durudumda. Benim yaptığım bir derleme ve strip işlemi sonucunu burada paylaşacak olursak;

Smart Strip İşlemden Önce : 37.9 MB
Smart Strip İşlemden Sonra: 10.6 MB


Başka bir yazıda görüşmek üzere hoşçakalın.


duralikiraz.blogspot.com
  21 Aralık 2015
Muvaffakiyet Allahtandır.”

Kaynaklar :

Ek not : (31.12.2015)

Normalde ayrı bir yazı yazıp yazmama konusunda kararsız kaldım. Strip küçültme işlemlerini ide üzerindeki ayarlarla otomatik yapılmasının yazılı ve videolu anlatıldığı başka bir kaynağı aşağıdaki vermeyi uygun buldum.

http://www.schoolfreeware.com/Free_Pascal_Lazarus_App_GUI_Tutorial_2.html



2 Kasım 2015 Pazartesi

İpucu : Bir video dosyasındaki “video akışı” nasıl çıkartılır? (ffmpeg)




Daha önceki yazımızda video dosyasındaki ses akışını çıkartma işlemini ffmpeg programcığıyla yapmıştık. Aynı programcıkla video akışı çıkartma işleminin ne kadar basit yapılabildiğini göreceğiz. Ubuntu üzerindeyken Ctr + Alt + T tuş bileşimiyle Terminal/Konsol ekranı açılır. Eğer windows kullanıyorsanız karşılığı “cmd.exe” dir. Konsol ekranı açıldığında aşağıdaki satırı yazarız.

ffmpeg -i apollo13videodosyamiz.avi -vcodec copy -an sadecevideo.avi

Yukardaki komut satırı cümlesinde

-i apollo13videodosyamiz.avi

parametresi gördüğünüz üzere -i ile giriş (input) kaynak video dosyasını işaret eder. Yani bu dosya üzerinde işlem yapacağız.

-vcodec copy

-vcodec parametresi “video codec” ile ilgili işlemin ne yapılacağı bilgisini alır. Biz bu parametreden sonra “copy” ifadesini kullanmışız. Yani “video codec üzerinde hiçbir işlem yapmadan doğrudan ham veriyi kopyala” diyoruz.

-an

Bu parametre ile “audio no” demiş oluyoruz. Yani video dosyamızda ses akışı ile ilgili hiçbir işlem yapmayacağız. Dolayısıyla sesle ilgili işlemleri hariç tut şeklinde bir anlam çıkar ortaya.

sadecevideo.avi

Son olarak verilen dosya ismide çıkış dosyasının adıdır.


Gördüğünüz üzere birkaç basit adımda video akışını video dosyasının içinde çok rahat bir şekilde aldık. Şayet video dosyasını alırken birde dönüştürme işlemleri yapmış olsaydık -vcodec parametresinden sonra ek bilgileri de işlememiz gerekirdi. Bunların nasıl yapılacağı ile ilgili bilgiyi ffmpeg programının kendi sitesinde documents altında bulabilirsiniz.

Başka bir yazıda buluşmak üzere hoşçakalın.


Kaynak:
https://www.ffmpeg.org/ffmpeg.html



duralikiraz.blogspot.com
02 Kasım 2015

Muvaffakiyet Allahtandır.”

31 Ekim 2015 Cumartesi

İpucu : Bir videonun içindeki ses nasıl alınır? (ffmpeg)




Bugünlerde daha önce birkaç kez seyrettiğim Apollo 13 (1995) filminin kaliteli görüntü ve Türkçe ses dublajıyla bir araya getirip yeniden 1080p görüntü kalitesiyle seyretmek için kalitesiz görüntünün içinde olan Türkçe ses dosyasını almaya ihtiyacım vardı. Sonrasında kaliteli görüntüyle bu ses dosyasını yeniden dublaj işlemine tabi tutacağım. Bu küçük yazıda sadece ses bir videodan nasıl çıkarılır onu göstermek istiyorum.

Öncelikle bu iş için tamamen ücretsiz ve açık kaynak kodlu “ffmpeg” programcığına ihtiyacımız var. Boyutu küçük yaptığı işler çok büyük olan bu yazılımla neler yapılmıyorki ! Ubuntu üzerindeyken Ctr + Alt + T tuş bileşimiyle Terminal/Konsol ekranı açılır. Eğer windows kullıyorsanız karşılığı “cmd.exe” dir. Konsol ekranı açıldığında aşağıdaki satırı yazarız.

ffmpeg -i apollo13videodosyamiz.avi -vn -acodec mp3 apollo13-sesdosyasi.aac

Eğer hiçbir dönüştürme işlemine tabi tutmadan doğrudan sesi almak istersek mp3 yerine copy ifadesini yazmalıyız.

ffmpeg -i apollo13videodosyamiz.avi -vn -acodec copy apollo13-sesdosyasi.aac

Bunu yazıp enterladığımızda işlem yapmaya başlar. Hepsi bu :)

Parametrelerinden biraz bahsedecek olursak -i parametresi giriş dosyamızı belirtmeye yarar yani

-i apollo13videodosyamiz.avi

dediğimizde biz “apollo13videodosyamiz.avi” isimli bir dosyayı kaynak olarak ele alacağımızı programa söylemiş oluyoruz. Tabi siz dosyanızın yeri neredeyse onu tam olarak dosya yolu ve dosya adı şeklinde belirtmiş olmanız lâzım. Mesele sizin dosyanız 'c:\filmlerim\Apollo13filmi.avi' şeklinde olabilir. O zaman bu halini -i parametresinden sonra tam olarak yazmamız gerekir. Aksi halde kaynak dosyanın bulunamadığı yolunda hata mesajı alırsınız.

-vn

parametresiyle ise “no video” şeklinde düşünebilirsiniz. Yani bu işlemde video kısmıyla ilgilenmediğimizi programa ifade etmiş oluruz. Dolayısıyla video ile ilgili bir kayıt işlemi yapılmaz.

-acodec mp3

parametresiyle ses kodekini ayarlarız. Burada biz mp3 ile çalışacağımızı belirtmişiz. Burada dikkat edilecek bir hususta eğer -ab parametresiyle bir şey belirtmezsek filmdeki sesin bitrate hızı neyse onu doğrudan alır. Misal bitrate 96k ise aynen çıkış dosyasını da 96k alacaktır. Fakat biz tutarda mp3 yazısından sonra -ab 36k yaparsak çıkışın bitrate ini 36k yapar.

apollo13-sesdosyasi.aac

son olarak çıkış ses dosyamızın ismini belirtmişiz. Hemen aklınıza aac uzantısı nedir sorusu gelebilir. Kısaca tanımlayacak olursan “Advanced Audio Coding File” isminin kısaltmasıdır. Peki nedir bu?

Bir .MP3 dosyasına benzeyen, ancak bazı performans iyileştirmeleri sunan sıkıştırılmış ses dosyasıdır; bunlar arasında sabit ve sürekli olmayan sinyaller için daha yüksek kodlama verimi, daha basit bir filtreleme bankası ve 16 kHz'nin üzerindeki frekansların daha iyi idare edilmesi bulunmaktadır; orijinal ses kaynağıyla neredeyse farkedilemez bir şekilde yakın bir kaliteye sahiptir. Advanced Audio Coding (AAC), Apple iTunes ve iTunes Music Store tarafından kullanılan varsayılan kodlamadır.

Yani hemen hemen mp3 ile aynı diyebiliriz. İçinize sinmezse siz aac uzantısını mp3 de yapabilirsiniz.

Son olarak kendi ubuntuMATE yüklü bilgisayarımda ses dosyasını konsola yazdığım şu satırlarla elde ettim.

ffmpeg -i '/media/durali/Depo/Apollo 13 (1995) [1080p]/Apollo13-1999-DVDRip-TR.avi' -vn -acodec mp3 outfilm-apollo13-audio.aac

Başka bir yazıda görüşmek üzere hoşçakalın.


Kaynak:
https://www.ffmpeg.org/ffmpeg.html
http://stackoverflow.com/questions/9913032/ffmpeg-to-extract-audio-from-video



duralikiraz.blogspot.com
01 Kasım 2015

Muvaffakiyet Allahtandır.”

5 Ağustos 2015 Çarşamba

SDCC ile Dahili Eeprom'a okuma ve yazma (16F877A) -Ders14



eepromokuyaz.c” ana dosyamız
============================================================

// Durali Kiraz 2015
// PIC16F877A için hazırlanmıştır.
#include "ayarlar.h"
#include "bizim_lcd.h" // LCD kütüphanesi tanımlanıyor
#include "delay.h"
#include "eeprom.h"


void main(void) // Ana fonksiyon alanı
{
  TRISB = 0x00; // LCD'ye bağlı portlar çıkış yapılıyor
  TRISC = 0x00; // C portları çıkış yapılıyor

  PORTB = 0x00;
  PORTC = 0x00;

  lcd_baslat();

  eeprom_yaz(0x00, 'D');
  eeprom_yaz(0x01, 'U');
  eeprom_yaz(0x02, 'R');
  eeprom_yaz(0x03, 'A');
  eeprom_yaz(0x04, 'L');
  eeprom_yaz(0x05, 'i');
  eeprom_yaz(0x06, ' ');
  eeprom_yaz(0x07, 'K');
  eeprom_yaz(0x08, 'i');
  eeprom_yaz(0x09, 'R');
  eeprom_yaz(0x0A, 'A');
  eeprom_yaz(0x0B, 'Z');

  lcd_yaz("EEPROM verisi:");
  lcd_konumlanxy(2,1);

  veri_yolla( eeprom_oku(0x00) );
  veri_yolla( eeprom_oku(0x01) );
  veri_yolla( eeprom_oku(0x02) );
  veri_yolla( eeprom_oku(0x03) );
  veri_yolla( eeprom_oku(0x04) );
  veri_yolla( eeprom_oku(0x05) );
  veri_yolla( eeprom_oku(0x06) );
  veri_yolla( eeprom_oku(0x07) );
  veri_yolla( eeprom_oku(0x08) );
  veri_yolla( eeprom_oku(0x09) );
  veri_yolla( eeprom_oku(0x0A) );
  veri_yolla( eeprom_oku(0x0B) );

  for(;;); //Sonsuz döngüye giriliyor
}

============================================================

eeprom.c” dosyamız
============================================================

#include <pic14regs.h>
#include "delay.h"

void eeprom_yaz(unsigned char adres, unsigned char data)
{
  EEADR = adres;
  EEDATA = data;
  WREN = 1;
  EECON2 = 0x55;
  EECON2 = 0xAA;
  WR = 1;
  while(WR);
  WREN = 0;
}

unsigned char eeprom_oku(unsigned char adres)
{
  EEADR = adres;
  RD = 1;
  return(EEDATA);
}

============================================================

eeprom.h” dosyamız
============================================================
*
Dahili EEPROM Kullanım Klavuzu
* eeprom_yaz(address, data); ile eepromun istenilen adresine istenilen bilgi yazılır.
* eeprom_oku(address); ile eepromun istenilen adresi okunur.
*/
extern void eeprom_yaz(unsigned char adres, unsigned char data);
extern unsigned char eeprom_oku(unsigned char adres);
============================================================


Bu dersimizde mikrodenetleyici programlamanın vazgeçilmezlerinden dahili eeproma yazma ve okuma işleminin nasıl yapıldığını göreceğiz.

EEPROM, Electronically Erasable Programmable Read-Only Memory yani elektriksel olarak
silinip yazılabilen hafıza bölümüdür. Pic16f877a’nın içinde 256 byte yani 256x8 bit’lik EEPROM
bulunmaktadır. Kullanacağımız işlemlerdeki bilgilerin, enerji kesildiğinde de korunmasını
istiyorsak pic’in EEPROM birimini kullanabiliriz. Eğer kaydedeceğimiz değerler 256byte’tan
büyük ise harici EEPROM’lar kullanarak istediğimizi yine gerçekleştirebiliriz. Harici eepromlar şu an bizim konumuz değil. O yüzden dahili eeprom üzerinde basit bir iki işlem yapacağız.



EEPROM üzerinde okuma ve yazma yapabilmemiz için datasheetinde yazdığı gibi bir takım sıralı işlemlerini kuralına göre yapmamız gerekmekte. Bu işlemlerin işlem adımlarını oluşturan fonksiyonlar topluluğuna esasında eeprom sürme kodları desek daha isabetli bir anlatım yapmış oluruz. Bizim sürücü eeprom.c dosyamızda iki fonksiyon tanımı var. Biri okuma diğeri yazma işlemini yapmakta. PIC16F877A üzerinde EECON1 ve EECON2(sanal olarak var) isimli iki adet kontrol registerları bulunur. Eğer eeprom üzerinde okuma ve yazma yapacaksak bunları doğru şekilde sürmeniz/kontrol etmemiz gerekir. Bu registerlarla ilgili daha detaylı bilgiyi datasheet dosyasından edinebilirsiniz. Biz yazma ve okuma işlem adımlarındaki işlemleri açıklayalım.

OKUMA İŞLEMİ:
-----------------------------------------------------------------------------------
1- EEADR = adres;
Bu adımda okunması gereken adres değerini EEADR isimli registera yazarız

2- RD = 1;
Bu adımda RD Bitini (EECON1 0.bit) 1 yaparız. Bu da okuma yapmak istediğimizi gösterir.

3-return(EEDATA);
Yukardaki iki işlemden sonra hafızadaki değer EEDATA registerına yazılmıştır. Bizde bu registerın değerini okursak sonuca ulaşmış oluruz


YAZMA İŞLEMİ:
-----------------------------------------------------------------------------------
1- EEADR = adres;
Hangi adrese yazma işi yapılacaksa o adresin değeri EEADR registerına yazılır.

2- EEDATA = data;
Yazılacak hafıza değeri EEDATA registerına yazılır.

3- WREN = 1;
EECON1 bit 2 yani WREN 1 yapılırsa yazma izni verilmiş olur.0 da yazılma olmaz.

4- EECON2 = 0x55;
yazma işlemi için kurallardan birisi

5- EECON2 = 0xAA;
yazma işlemi için kurallardan birisi

6- WR = 1;
(EECON1 bit 1)WR nin 1 olması ile yazma işlemi başlatılır.
7- while(WR);
WR sıfır olana kadar program bekletilir.

8- WREN = 0;
WR sıfır olduktan sonra WREN sıfır yapılır ki artık yazma izni kaldırılmış olsun.

Görüldüğü üzere kurallarını yukarıda açıklamaya çalıştık. Aslında olay gayet basit. Bu eeprom üzerine yazdığımız veriler mikrodenetleyici eeprom hafızasında kalıcıdır.

Ana programımızdan bahsedecek olursak doğrudan eeprom kütüphanemizdeki eeprom_yaz fonksiyonumuz ile yazdırmak istediğimiz 8 bitlik değeri yazdırıyoruz. Burada char tipi karakterler yazdırdık. İsterseni 0 dan 255 e kadar sayılardan birini de yazdırabilirsiniz. Sonrasında ise eeprom_oku fonksiyonu ile okuyup veri_yolla lcd fonksiyonumuz ile eeprom hafızasındaki karakterleri sırasıyla lcd ye gönderiyoruz. Sonrasında program for(;;) sonsuz döngüsüne girerek bizim değerleri lcd üzerinde sürekli göstermemizi sağlıyor. Bu derste verilemeyen diğer dosyalar bir önceki derslerde bulunmaktadır. Bu dersimizde bu kadar. Başka bir derste görüşmek üzere hoşçakalın.


duralikiraz.blogspot.com
04 Ağustos 2015

Muvaffakiyet Allahtandır”


Kaynak:
* Hi-Tech ile Pic Programlama – Fırat Deveci

3 Ağustos 2015 Pazartesi

SDCC ile Ultrasonick Sensör Mesafe Ölçümü, Timer1, LCD kullanımı (16F877A) -Ders13




bizim_lcd.h” dosyası
=======================================================================

/* Durali Kiraz 2015
* www.duralikiraz.blogspot.com
*
* D4,D5,D6,D7 pinlerini kullanarak 4 bit iletişim kullanır.
* Cursor kapalıdır.
* RW kullanılmadığı için direk toprağa bağlanabilir.
* 2x16 LCD Kullanım Klavuzu
*
* lcd_baslat(); ile LCD'nin ilk ayarlarını yap
* lcd_ekranisil(); ile LCD'yi sil
* lcd_yaz("deneme"); Şeklinde yazı yazdır.
* veri_yolla('F'); Şeklinde tek ascii kodu yazdır.
* lcd_konumlanxy(1,13); Şeklinde LCD'nin istenilen yerine git.
*
*
*/


#define rs RC0 //Pin tanımlamaları
#define rw RC1
#define e RC2
#define lcd_port PORTB


/* LCD'de kullanilan komutlarin tanimlamasi*/
#define Sil 1 // Ekrani temizler
#define BasaDon 2 // Imleci sol üst köseye getirir
#define SolaYaz 4 // Imlecin belirttigi adres azalarak gider
#define SagaYaz 6 // Imlecin belirttigi adres artarak gider
#define ImlecGizle 12 // Göstergeyi ac, kursor görünmesin
#define ImlecAltta 14 // Yanip sönen blok kursor
#define ImlecYanSon 15 // Yanip sönen blok kursor
#define ImleciGeri 16 // Kursoru bir karakter geri kaydır
#define KaydirSaga 24 // Göstergeyi bir karakter sağa kaydır
#define KaydirSola 28 // Göstergeyi bir karakter sola kaydır
#define EkraniKapat 8 // Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir başlangıç adresi
// (DDRAM adres)
#define IkinciSatir 192 // İkinci satirin başlangıç adresi
#define KarakUretAdres 64 // Karakter üreteci adresini belirle
// (CGRAM adres)

/* LCD'de Kullanilan Fonksiyon Seçimi */
#define CiftSatir8Bit 56 // 8 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir8Bit 48 // 8 bit ara birim, 1 satir, 5*7 piksel
#define CiftSatir4Bit 40 // 4 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir4Bit 32 // 4 bit ara birim, 1 satir, 5*7 piksel


extern void veri_yolla(unsigned char);
extern void lcd_ekranisil(void);
extern void lcd_yaz(const char *s);
extern void lcd_konumlanxy(unsigned char x, unsigned char y);
extern void lcd_baslat(void);
extern void lcd_komut(unsigned char c);
extern void lcd_int_yaz(int x,unsigned int y);
//
=======================================================================


bizim_lcd.c” dosyası
=======================================================================

/* Durali Kiraz 2015
* www.duralikiraz.blogspot.com
*/

#include <pic14regs.h> //mikrodenetleyici hazır tanımları alınıyor
#include "bizim_lcd.h" // bizim_lcd.h dosyası tanımlanıp, değerler alınıyor
#include "delay.h" // Gecikme fonksiyonu tanımlanıyor

void lcd_busy(void)
{
   us_delay_20(12); //DelayUs(250);
}

void lcd_komut(unsigned char c) // Komut gönderme fonksiyonu
{
   rw=0; // LCD'ye yazma yapılacak
   rs=0; // LCD'ye komut gönderilecek
   e=1; // Düşen kenar tetikleme olduğu için E önce 1
   lcd_port = ( c & 0xF0 ); // Yüksek değerlikli bitler gönderiliyor
   e=0; // E, 0 yapılıyor
   lcd_busy(); //Belirli süre bekleniyor
   e=1; // E, 1 yapılıyor
   lcd_port = ( (c & 0x0F)<<4 ); // Düşük değerlikli bitler gönderiliyor
   e=0; // E, 0 yapılıyor
   lcd_busy(); // Belirli bir süre bekleniyor
}

void veri_yolla(unsigned char c)
{
  rw=0;
  rs=1; // Komut yolladan tek farkı, RS'nin 1 olması
  e=1;
  lcd_port = ( c & 0xF0 );
  e=0;
  lcd_busy();
  e=1;
  lcd_port = ( (c & 0x0F)<<4 );
  e=0;
  lcd_busy();
}

void lcd_ekranisil(void) // LCD siliniyor
{
   lcd_komut(0x1);
   ms_delay(2);
}

void lcd_yaz(const char * s) // LCD'ye string ifade gönderiliyor
{
  lcd_busy();
  while(*s)
  veri_yolla(*s++);
}

void lcd_konumlanxy(unsigned char x,unsigned char y) //LCD'nin belli lcd_gotoxy
//bölgesine gidiliyor
{
  if(x==1)
     lcd_komut(0x80+((y-1)%16));
  else
     lcd_komut(0xC0+((y-1)%16));
}

void lcd_baslat() // LCD ilk yükleme ayarları yapılıyor
{
   rs = 0;
   e = 0;
   rw = 0;
   ms_delay(15);
   e=1;
   lcd_komut(0x02);
   ms_delay(2);

   lcd_komut(CiftSatir4Bit);
   lcd_komut(SagaYaz);
   lcd_komut(ImlecGizle);
   lcd_ekranisil();
   lcd_komut(BirinciSatir);
}

void lcd_int_yaz(int val,unsigned int field_length)
{
/***************************************************************
This function writes a integer type value to LCD module

Arguments:
1)int val : Value to print

2)unsigned int field_length :total length of field in which the value is printed
must be between 1-5 if it is -1 the field length is no of digits in the val

****************************************************************/

char str[5]={0,0,0,0,0};
int i=4,j=0;
while(val)
{
   str[i]=val%10;
   val=val/10;
   i--;
}
if(field_length==-1)
  while(str[j]==0) j++;
else
  j=5-field_length;

if(val<0) veri_yolla('-');
   for(i=j;i<5;i++)
   {
      veri_yolla(48+str[i]);
   }
}

=======================================================================


mesafeolcumu.c” ana dosyası

=======================================================================

// Durali Kiraz 2015
// PIC16F877A için hazırlanmıştır.

#include "ayarlar.h"
#include "bizim_lcd.h" // LCD kütüphanesi tanımlanıyor
#include "delay.h"

#define trigger RD0 //pin tanımları
#define ECHO RD1



void main(void) // Ana fonksiyon alanı
{
   unsigned int sure, mesafe;

   TRISD = 0b0000010; // RD1 giriş diğer D portları çıkış yapılıyor
   TRISB = 0x00; // LCD'ye bağlı portlar çıkış yapılıyor
   TRISC = 0x00; // C portları çıkış yapılıyor

   PORTD = 0x00;
   PORTB = 0x00;
   PORTC = 0x00;
   T1CON = 0b00000101; //TIMER1 ayarları yapılıp çalıştırılıyor

   lcd_baslat(); // LCD ilk ayarları yapılıyor
   ms_delay(100);
   lcd_ekranisil();

   for(;;) //Sonsuz döngüye giriliyor
   {
      trigger = 1;
      us_delay_20(1); //20us bekletiyoruz. Bu 15 us yada 10 us de olabilir.
      trigger = 0;
      
      while(!(ECHO)); //echo pini bekle
      TMR1=0; //echo pini 1 se timeri 0 la ve saymaya başla

      while((ECHO)); //echo pini 0 olunca timer değerini süreye eşitle
      sure=TMR1;

      mesafe = (sure/58); //mesafeyi hesapla cm olarak

      lcd_konumlanxy(1,1); //uzaklık ve sure lcdye yazdırılıyor
      lcd_yaz("uzaklik:");
      lcd_int_yaz(mesafe,2);
      lcd_yaz("cm");
      lcd_konumlanxy(2,1);
      lcd_yaz("sure:");
      lcd_int_yaz(sure,2);
      lcd_yaz("us");
      ms_delay(100); //yeni ölçüm için bekle.
   }

}

=======================================================================






Bu dersimizde Timer1 sayıcısını kullanarak ultrasonik sensörümüzden gelen verileri sayarak mesafe ölçümünü yapacağız. İstersek timer1 kullanmadanda ultrasonik sensörün echo yapma süresini hesaplamamız mümkün. Ancak Timer kullanarak yapmak hem daha sağlıklı hemde mikrodenetleyicinin yükünü biraz daha hafifletir.

Ultrasonik sensörler; özel bir hoparlörden gönderilen ses dalgasının karşısındaki bir engele çarpıp geri gelmesi esnasında arada geçen sürenin yol=hız*zaman formülünden hesaplanmasıyla kullanılır. Ses saniyede 340m/sn lk hızla hareket eder. Hesaplamalarımızda kolaylık olması açısından bu mesafeyi cm olarak 34000cm (340m), zamanı da 1000000us (1sn) olarak düşünelim. Hâl böyle olunca (340000/1000000=1/29) olarak düzenlersek formül mesafe=zaman/29 olarak bulunur. Burada ses sinyali hem gitmekte hemde gelmekte. Dolayısıyla 29*2 = 58 yapar. Mesafe formümüz Mesafe=zaman/58 olur. (Sesin havadaki hızına hava sıcaklığı ve nemin de azda olsa etki ettiğini unutmayınız. Ama normal şartlarda saniyede 340m kabul edilir.)

Mikrodenetleyici timer larından bahsedilince akla hemen timer kesmeleri gelebilir. Ancak unutulmamalıdırki timerlar illa timer kesmesi ile beraber kullanılacak diye bir kaide yoktur. Bu örneğide özellikle seçme sebeplerinden biride budur. Timer1'in zamanlayıcı olarak kullanılmasına güzel bir örnek olacağı kanaatindeyim. 4 MHZ lik bir kristal osilatör kullanıldığında mikrodenetleyici bunu 4 e bölerek kullanılmasından dolayı timer1 in her komut çevriminde bir artması söz konusudur. Dolayısıyla mikrosaniye olarak süreyi elde etmemiz mümkün olmaktadır. Tabi bunu yapabilmek için T1CON register ının ayarlanması gerekmektedir. T1CON registeri 8 bitlik bir kontrol registeridir.

Bit 7-6
Kullanılmayan bitler. Okunurken bu bitler 0 okunur
Bit 5-4 T1CKPS1-T1CKPS0
Timer1 bölme (prescaler) oranı
11 = 1:8
10 = 1:4
01 = 1:2
00 = 1:1
Bit 3 T1OSCEN
Timer1 osilatör kontrol biti
1: osilatör açık
0: osilatör kapalı
Bit 2 T1SYNC
Timer1 dış clock sinyali senkronizasyon kontrol biti
1: Harici clock sinyali girişi ile senkronize yok
0: Harici clock sinyali girişi ile senkronize
Bit 1 TMR1CS
Timer1 clock kaynağı seçme biti
1: RC0/T1OSO/T1CK1 pininden dış clock sinyali
0: Dahili clock sinyali (FOSC /4)
Bit 0 TMR1ON
Timer1 açma-kapama biti
1: Timer1 açık
0: Timer1 kapalı

(Bu tablo CCS C ile PIC programlama (Serdar Çiçek) Kitabından alınmıştır)

Biz zamanlayıcı olarak Timer1 in kullanılabilmesi için ana program dosyamızda

T1CON = 0b00000101;

ayarını yaptık. Yani burada yapılan 0.bitin 1 yapılması. Yukarıdaki tabloda bakarsak 0.bit Timer1 1 yapıldığında “açık” olduğu anlamına geliyor. 2. bitin 1 yapılması Harici clock sinyali ile senkronizasyonun olmadığını gösterir. Dikkat çeken diğer bir değer ise 5. ve 4. bitin 00 olması. Buda Timer1 bölme(prescaler) oranının 1:1 olacağını gösterir. Bu şartları sağladığımızda timer1 zamanlayıcı olarak kullanılmaya hazır demektir. Daha fazla teknik bilgi için lütfen pic programlama kitaplarına yada PIC16F877A datasheet belgelerine bakabilirsiniz.

Ana program dosyamızda PORTD nin 1. bacağını giriş olarak diğerlerini ise çıkış olarak seçtiğimizi gösteriyoruz. Giriş olan bacağı HC-SR04 ultrasonik sensörün Echo çıkışına bağladığımızda mikrodenetleyicimiz bu sönsörden sinyal okumayı yapabilecektir. Sensörün diğer trigger bacağı ise mikrodenetleyiciden gelen çıkışı giriş olarak alır. Bu sayade sensör çalışabilecek kararlılığa ulaşır. Bunun için en az 10us kadar trigger portunun lojik 1 olarak kalması gerekir. Aksi takdirde sensör çalışmaya hazır hale gelemez. Sonrasında echo pininden bir sinyal gelene kadar beklenir. Bu sinyalin gelmesi sensörden çıkan ses dalgasının herhangi bir engele çarpıp geri geldiği zamanı bize bildirir. İşte bu zamanı yakaladığımızda bu ses dalgasının aldığı yolu (mesafeyi) hesaplayabiliriz. Kodun diğer kısmı mesafenin hesaplama formulu ve lcd ye yazı gönderme işini kapsar. Burada da yeni olan bir lcd fonksiyonumuz lcd_int_yaz() fonksiyonumuzdan bahsedecek olursak, doğrudan tam sayı değerleri lcd ye gönderebilmemiz için oluşturulmuş bir fonksiyondur. İki parametre alır. Birincisi yazdırılacak integer değeri, diğeri ise bu değerin kaç basamaklı bir alana yazdırılacağı bilgisidir. Zaten sırf bu fonksiyonu eklemek için bizim_lcd.cd ve bizim_lcd.h dosyalarında değişiklik yapıldı. Değişikliğe uğramamış dosyalara ve derleme adımlarının nasıl yapılacağına önceki derslerden ulaşabilirsiniz. Başka bir derste görüşmek üzere hoşçakalın.


duralikiraz.blogspot.com
03 Ağustos 2015

Muvaffakiyet Allahtandır”



Kaynaklar :
* CCS C ile PIC programlama Serdar Çiçek.