<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FxDev &#124; ße Different Everytime! &#187; pic</title>
	<atom:link href="http://www.fxdev.org/etiket/pic/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fxdev.org</link>
	<description>FxDev &#124; This Evolution is Revolution</description>
	<lastBuildDate>Wed, 01 Feb 2012 22:16:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Digital Dummy Load and Battery Capacity Tester</title>
		<link>http://www.fxdev.org/digital-dummy-load-and-battery-capacity-tester/</link>
		<comments>http://www.fxdev.org/digital-dummy-load-and-battery-capacity-tester/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 15:43:21 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[akım]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[batarya]]></category>
		<category><![CDATA[battery]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[capacity]]></category>
		<category><![CDATA[cihazı]]></category>
		<category><![CDATA[current]]></category>
		<category><![CDATA[dummy]]></category>
		<category><![CDATA[electronic]]></category>
		<category><![CDATA[elektronik]]></category>
		<category><![CDATA[gerilim]]></category>
		<category><![CDATA[koruma]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[seri]]></category>
		<category><![CDATA[sıcaklık]]></category>
		<category><![CDATA[temperature]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[tester]]></category>
		<category><![CDATA[uart]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[voltage]]></category>
		<category><![CDATA[yük]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=1102</guid>
		<description><![CDATA[Siteyle epeydir ilgilenememe yol açan, daha önce burada bahsettiğim projemi biraz geliştirerek oluşturduğum, hem batarya kapasite test hem de dijital yükleme cihazını sizlere tanıtmak istedim. Günümüzde bataryalar özellikle bir çok mobil cihazın vazgeçilmez elemanı olarak kullanılmaktadırlar. Özellikle uzun ömürlü kullanım için üreticiler, hem bataryayı en verimli şekilde kullanmalı hem de en iyi şekilde şarj etmeleri [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox" title="Battery" href="http://www.fxdev.org/wp-content/uploads/2011/09/Battery.png"><img class="alignright size-full wp-image-1103" title="Battery" src="http://www.fxdev.org/wp-content/uploads/2011/09/Battery.png" alt="" width="264" height="129" /></a>Siteyle epeydir ilgilenememe yol açan, daha önce <a href="http://www.fxdev.org/dummy-load/" target="_blank"><strong>burada</strong></a> bahsettiğim projemi biraz geliştirerek oluşturduğum, hem batarya kapasite test hem de dijital yükleme cihazını sizlere tanıtmak istedim.<br />
Günümüzde bataryalar özellikle bir çok mobil cihazın vazgeçilmez elemanı olarak kullanılmaktadırlar. Özellikle uzun ömürlü kullanım için üreticiler, hem bataryayı en verimli şekilde kullanmalı hem de en iyi şekilde şarj etmeleri gerekmektedir. Yalnız gerek üretim gerekse kullanıcı ve ürün hatalarından kaynaklanan problemler nedeniyle bataryaların ömürleri, kapasiteleri ve kısa devre koruma gibi iç devre elemanları bozulabilir. <span id="more-1102"></span><a class="lightbox" title="Genel Görünüm - 1" href="http://www.fxdev.org/wp-content/uploads/2011/09/genel_gorunum.jpg"><img class="alignleft size-full wp-image-1105" title="Genel Görünüm - 1" src="http://www.fxdev.org/wp-content/uploads/2011/09/genel_gorunum.jpg" alt="" width="201" height="244" /></a>Özellikle kapasite gibi ürünün uzun süre çalışmasını etkileyen bir faktörün ölçümü için ise batarya kapasite test cihazları kullanılır. Batarya kapasitesinin ise doğru olarak ölçülebilmesi için bataryadan sabit bir akım değeri, öngörülen süre boyunca çekilmelidir. Bu noktada ise uzun süre yüklenecek olan bataryanın gerilim değişimine göre ayarlanması gereken yük oldukça önem kazanmaktadır. Bunu elle ayarlamak ise oldukça güç olduğundan genellikle dijital (ya da analog) ayarlı yük devreleri kullanılır; yani bir taşla iki kuş!<br />
Yan tarafta resmi görülen (tıklarsanız büyür) prototipi, tüm yazılımları ve ürünün kendi iki hafta gibi kısa sürede tamamlanan projenin, bir diğer güzel özelliği ise kat kat tasarlanmış olmasıdır. Boyutları genel itibariyle 8x8x10cm olan devrenin barındırdığı özellikler aşağıdadır;<br />
<div class="important-green"><span class="important-title-green">Digital Dummy Load and Battery Capacity Tester</span>* 0.1A akım çözünürlüğü<br />
* 0.1V gerilim çözünürlüğü<br />
* 25Vmax veya 50Vmax giriş gerilimi<br />
* 25/50V ve 20A&#8217;e kadar akım/gerilim grafiği çıkarabilme<br />
* 15W sürekli güç çekebilme<br />
* Sabit akım çekme, ~1.5 saniye tepki süresi<br />
* Batarya kapasitesi ölçme<br />
* Oluşturulan grafiklerin jpeg veya png olarak kaydedilmesi<br />
* Dahili USB/Seri port çeviricisi sayesinde harici çeviricilere ihtiyaç duymama<br />
* Aşırı sıcaklık koruması<br />
* Ortalama 1W güç tüketimi (12V sabit adaptör ile kullanımda)<br />
* Bilgisayar arayüzü ile kontrol edilebilme<br />
* Pleksiglas ile sağlanan şık tasarım</div></p>
<p>Bu konularla pek ilgisi olmayan bir kişinin &#8220;bu tasarım ne işime yarayacak&#8221; sorusuna şöyle cevap verebilirim; hepimiz öyle ya da böyle regülatör tasarımı ya da step down, step up, izolasyonlu topojiler kullanarak güç kaynakları yapıyor ya da satın alıyoruz. Özellikle bazı uygulamalarda ya da aldığımız ürünün kalitesini, ne kadar zorlayabileceğimizi görmek için gerilim/akım grafiklerine gerek duyuyoruz.<br />
Örneğin aldığımız bir SMPS 24V/10A kaynağının gerçekteki regülasyonu bilmek, ileride yapacağımız uygulama için önemli olabilir. Bu bir güneş panelinden, DC motora, herhangi bir pilden, adaptölere kadar uzanabilmektedir. Yaptığımız cihaz ise bu grafiği sadece 10-15 saniye gibi bir aralıkta bizlere sunmaktadır. Bu da güç kaynağımızın kalitesi hakkında bize yorum yapma olanağı sağlar.<br />
Bunun yanında proje özellikle bataryalarla çok fazla çalışan, telsizciler, hobi araçlar, quadrotorlar ve daha bir çok batarya kullanılan alanda bataryanın performansını ölçmek için kullanılabilir.</p>
<p><span style="color: #008000;"><strong>1) Digital Dummy Load (Dijital Yük)</strong></span><br />
Örnek olarak kendi evimde hobi amaçla kullandığım bilgisayar güç kaynağının 12V çıkışının gerilim akım grafiğini göstermek istiyorum. Grafiği yorumlarsak regülasyonun oldukça kötü olduğunu söylemek mümkündür (resme tıklarsanız büyür).<a class="lightbox" title="Kötü Regülasyon 12V Test" href="http://www.fxdev.org/wp-content/uploads/2011/09/bad_reg_12V.jpg"><img class="aligncenter size-full wp-image-1107" title="Kötü Regülasyon 12V Test" src="http://www.fxdev.org/wp-content/uploads/2011/09/bad_reg_12V.jpg" alt="" width="612" height="252" /></a>Aşağı yukarı 10 yıllık bir güç kaynağının (SMPS tamircileri daha iyi bilecektir) çıkış kapasitörlerinin değer kaybetmesinden dolayı bu sorunun olabileceğini düşünerekten çıkışa sağlam kapasitörler bağlandığında elde edilen aşağıdaki grafik ise yukarıdakine nazaran bize daha iyi regülasyon sağlamaktadır (resme tıklarsanız büyür).<a class="lightbox" title="Good Reg. 12V" href="http://www.fxdev.org/wp-content/uploads/2011/09/good_reg.png"><img class="aligncenter size-full wp-image-1108" title="Good Reg. 12V" src="http://www.fxdev.org/wp-content/uploads/2011/09/good_reg.png" alt="" width="615" height="310" /></a>Akım gerilim grafiğinin kapasite bağlandıktan sonraki ölçümünü ve cihazın genel özelliklerini aşağıdaki videodan izleyebilirsiniz (tam ekran ve yüksek çözünürlükte izlemenizi öneririm).<p><a href="http://www.fxdev.org/digital-dummy-load-and-battery-capacity-tester/"><em>Click here to view the embedded video.</em></a></p>Bir diğer göstermek istediğim grafik ise telsiz bataryaları ile ilgili; aşağıda HYT marka telsiz bataryasının akım gerilim grafiği görülmektedir (resme tıklarsanız büyür). <a class="lightbox" title="HYT Battery Test" href="http://www.fxdev.org/wp-content/uploads/2011/09/hyt-bandrolsuz.png"><img class="aligncenter size-full wp-image-1109" title="HYT Battery Test" src="http://www.fxdev.org/wp-content/uploads/2011/09/hyt-bandrolsuz.png" alt="" width="619" height="255" /></a>Yukarıdan da görüldüğü üzere batarya gerilimi yük arttıkça düşmekte ve bir süre sonra da batarya koruma moduna girmektedir. Bu da bizlere bataryanın koruma iç devresinin sağlıklı çalıştığını yansıtmaktadır.</p>
<p><span style="color: #ff0000;"><strong>2) Battery Capacity Tester (Batarya Kapasite Testi)</strong></span><br />
Batarya testi aslında oldukça basit bir testtir. Genel itibari ile belirlenen sabit bir akım değeri, belirli bir süre boyunca çekilir. Grafiğin altında kalan alan ise bizlere kapasite değerini Ah birimiyle geri döndürür.<br />
Örneğin; 7.2V 1500mAh bir bataryamız olduğunu düşünelim. Bu değer bize bu bataryadan 1.5A&#8217;i 1 saat boyunca alabileceğimizi söylemektedir. Peki aklımıza şu soru gelebilir; 1 saat uzun bir süre bunu 15dk gibi kısa bir sürede yükleyip tam kapasite değerini ölçemez miyiz? Aslında ölçebiliriz, örneğin bir batarya bir saat boyunca 1.5A verebiliyorsa, 15dk için 6A verebilir. Yalnız gerek sıcaklık, gerekse diğer etmenler nedeniyle hiç bir zaman bu örnekteki bataryadan 15dk boyunca 6A çekemeyiz. Bu durum Alman bilimadamı W. Peukert tarafından 1897&#8242;de Peukert denklemi ile aşağıdaki şekilde açıklanmıştır.</p>
<p><center><img src='http://s.wordpress.com/latex.php?latex=Cp%3DI%5EnxT&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='Cp=I^nxT' title='Cp=I^nxT' class='latex' /></center>Yukarıdaki formülde I akım (A), T süre (h), Cp ise kapasitedir (Ah). n ise bataryanın tipine, sıcaklığına bağlı bir değişkendir. Örneğin kurşun asit bataryalar için bu değer 1.35 alınabilir. Deneysel bir sabit olduğundan önceden kestirmek pek mümkün değildir.<br />
Batarya boşalım grafikleri genellikle gerilim/zaman üzerinden verilir. Yani bataryadan sabit bir akım çekilirken, zaman işletilerek bataryanın gerilimi ölçülür. Aşağıda örnek bir Li-Po bataryanın boşalım grafiği görülmektedir.<a class="lightbox" title="Li-Po Discharge" href="http://www.fxdev.org/wp-content/uploads/2011/09/lipo_discharge.png"><img class="aligncenter size-full wp-image-1110" title="Li-Po Discharge" src="http://www.fxdev.org/wp-content/uploads/2011/09/lipo_discharge.png" alt="" width="386" height="252" /></a>Bir çok bataryanın datasheetine baktığınızda da boşalım grafiğinin yukarıdakine benzediğini görebilirsiniz. Aşağıda ise Kirusun marka, 7.4V, 1500mAh kapasiteye sahip bir bataryanın, 1.5A yükte, batarya test cihazıyla alınmış 1 saatlik gerilim/zaman grafiğini görebilirsiniz.<a class="lightbox" title="Krisun 1h Test" href="http://www.fxdev.org/wp-content/uploads/2011/09/krisun-1h-test.png"><img class="aligncenter size-full wp-image-1111" title="Krisun 1h Test" src="http://www.fxdev.org/wp-content/uploads/2011/09/krisun-1h-test.png" alt="" width="615" height="310" /></a>Yukarıda test ettiğim bataryanın kapasitesini daha hızlı ölçmek için yükü 3A&#8217;e çıkardığımda aldığım grafiği ise aşağıda görebilirsiniz.<a class="lightbox" title="Krisun 0.5h Test" href="http://www.fxdev.org/wp-content/uploads/2011/09/krisun-0.5h-test.png"><img class="aligncenter size-full wp-image-1112" title="Krisun 0.5h Test" src="http://www.fxdev.org/wp-content/uploads/2011/09/krisun-0.5h-test.png" alt="" width="615" height="310" /></a>Yukarıdaki grafiklerden baktığımızda 1 saatlik testte 3500 saniye bataryanın ortalama 1.5A verdiğini varsayarak gerçek kapasite değerimizi Cp=1458mAh buluruz. İkinci testimizde ise akım değerimiz I=3A ve grafiğe baktığımızda bu akımın 1500 saniye boyunca alındığını düşünerek yeni kapasite değerimiz 1250mAh bulunur. Buradan da görüldüğü gibi fazla yük bataryanın kapasitesini düşürücü yönde bir etki göstermektedir.</p>
<p><span style="color: #800080;"><strong>Sonuç olarak&#8230;</strong></span><br />
<a class="lightbox" title="Genel Görünüm - 2" href="http://www.fxdev.org/wp-content/uploads/2011/09/genel_gorunum_2.jpg"><img class="alignright size-full wp-image-1106" title="Genel Görünüm - 2" src="http://www.fxdev.org/wp-content/uploads/2011/09/genel_gorunum_2.jpg" alt="" width="267" height="273" /></a><br />
Belki herkesin değil fakat benim gibi güç elektroniği konusuna meraklı arkadaşların bu tür bir cihaza sahip olmaları bence oldukça önemli. Örnek olarak daha önce <a href="http://www.fxdev.org/mc34063a-step-updown-convertor-incelemesi/" target="_blank"><strong>burada</strong></a> ve <a href="http://www.fxdev.org/lm2576-step-down-convertor-incelemesi/" target="_blank"><strong>burada</strong></a> yaptığım incelemelerde dirençleri paralel bağlayarak ancak uygun yükleme işlemini gerçekleştirdiğimi hatırladığımda ya da bir bataryanın testi için 1 saate yakın bir lambayı yaktığımda böyle bir aracın benim için vazgeçilmez olduğunu anladım. Şu an için ürün her ne kadar ilk versiyonda olsa elde edilen sonuç bence oldukça tatmin edici.</p>
<p>Yukarıda tanıttığım ve geliştirmesini üstlendiğim ürünün hazır halini satın almak isteyen arkadaşlar iletişim bölümünden benimle irtibata geçebilir artı daha fazla bilgiyi mail yoluyla öğrenebilirler.</p>
<p>Her türlü sorunuzu, tasarım ile ilgili düşüncelerinizi yorum kısmından bana ulaştırabilirsiniz..<br />
Herkese çalışmalarında başarılar, bol elektronikli günler dilerim..</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/digital-dummy-load-and-battery-capacity-tester/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/digital-dummy-load-and-battery-capacity-tester/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PIC18F2550 USB Deneme Kartı</title>
		<link>http://www.fxdev.org/pic18f2550-usb-deneme-karti/</link>
		<comments>http://www.fxdev.org/pic18f2550-usb-deneme-karti/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 00:14:19 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[18f2550]]></category>
		<category><![CDATA[18f4550]]></category>
		<category><![CDATA[besleme]]></category>
		<category><![CDATA[board]]></category>
		<category><![CDATA[deneme]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[kartı]]></category>
		<category><![CDATA[kit]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[USB]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=1092</guid>
		<description><![CDATA[Son haftalarda işlerimin yoğunluğundan bir türlü siteye zaman ayıramadım. Bu süre zarfı boyunca bir çok yeni bilgi öğrendim ve önümüzdeki günlerde özellikle güç kaynakları ve batarya performansları konusunda, yaptığım projeyle ilgili olarak burada bilgi paylaşmayı düşünüyorum. Özellikle yukarıda çok az da olsa bahsettiğim projede USB/Seri çeviricinin devreye ekstra yer kaplaması ve maliyet oluşturmasından sonra USB [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="USB" href="http://www.fxdev.org/wp-content/uploads/2011/09/usb.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/09/usb.png" alt="" title="USB" width="238" height="114" class="alignright size-full wp-image-1098" /></a>Son haftalarda işlerimin yoğunluğundan bir türlü siteye zaman ayıramadım. Bu süre zarfı boyunca bir çok yeni bilgi öğrendim ve önümüzdeki günlerde özellikle güç kaynakları ve batarya performansları konusunda, yaptığım projeyle ilgili olarak burada bilgi paylaşmayı düşünüyorum.<br />
Özellikle yukarıda çok az da olsa bahsettiğim projede USB/Seri çeviricinin devreye ekstra yer kaplaması ve maliyet oluşturmasından sonra USB öğrenmeye karar verdim.<span id="more-1092"></span> Özellikle HID protokolü kontrolü üzerine yoğunlaşmak istediğim devre şemasını aşağıda görebilirsiniz. (Resmin üzerine tıklarsanız büyüyecektir)<a class="lightbox" title="PIC18F2550 USB Circuit" href="http://www.fxdev.org/wp-content/uploads/2011/09/usb_circuit_fxdev.jpg"><img class="aligncenter size-full wp-image-1093" title="PIC18F2550 USB Circuit" src="http://www.fxdev.org/wp-content/uploads/2011/09/usb_circuit_fxdev.jpg" alt="" width="600" height="412" /></a>Yukarıdaki şemadan da görebileceğiniz üzere devreyi oldukça sade tuttum. Yaklaşık 5.5&#215;5.5cm olmasını istediğim devrede bir adet USB portu, bir adet pot ve PICKIT2 ile devreyi programlayabilmem için çıkışlar bulunmaktadır. Ayrıca devre beslemesini direkt olarak USB&#8217;den sağlamaktadır. Aşağıdaki resim &#8220;Google SketchUp&#8221; yardımıyla çıkarılmıştır.<a class="lightbox" title="PIC18F2550 USB Board Gerber" href="http://www.fxdev.org/wp-content/uploads/2011/09/usb_devre_gerber.jpg"><img class="aligncenter size-full wp-image-1094" title="PIC18F2550 USB Board Gerber" src="http://www.fxdev.org/wp-content/uploads/2011/09/usb_devre_gerber.jpg" alt="" width="344" height="358" /></a>Devre tamamlandığında aşağıdaki gibi görünmesi gerekmektedir. Bu görüntü ise Eagle 3D kullanılarak çıkarılmıştır.<a class="lightbox" title="PIC18F2550 USB Board 3D" href="http://www.fxdev.org/wp-content/uploads/2011/09/USB-Test-Board-3D.jpg"><img class="aligncenter size-full wp-image-1095" title="PIC18F2550 USB Board 3D" src="http://www.fxdev.org/wp-content/uploads/2011/09/USB-Test-Board-3D.jpg" alt="" width="585" height="329" /></a>Son olarak ise devrenin son halini göstermek istiyorum.<a class="lightbox" title="PIC18F2550 USB Board" href="http://www.fxdev.org/wp-content/uploads/2011/09/pcb_son_hal.jpg"><img class="aligncenter size-full wp-image-1097" title="PIC18F2550 USB Board" src="http://www.fxdev.org/wp-content/uploads/2011/09/pcb_son_hal.jpg" alt="" width="485" height="322" /></a>Parçalar yerleştirildikten sonra devrenin (özellikle USB) çalışıp çalışmadığını anlamak için yazının sonundaki eke iki adet program koyuyorum. Bu programlarından bir tanesiyle sırasıyla LED&#8217;leri yakarken, diğeriyle USB&#8217;yi direkt olarak kullanabilirsiniz.</p>
<p>Özellikle bir konuda çalışmaya başlamadan önce yapılan ön hazırlıkları ve sitemde daha önce hiç PCB örneği paylaşmadığım için hazırladığım bu yazıyı bitirirken ileride yapacağım USB çalışmalarımın detaylarını yine buradan paylaşacağımı hatırlatmak isterim.<br />
Yapacağım çalışmalarımı CCS C ile <span style="color: #ff0000;"><strong>yapmayacağımdan</strong></span>, bu konuda bana gelecek soruları cevapsız bırakacağımı şimdiden söylemeliyim. <strong><span style="color: #008000;">Onun için herkesi <span style="color: #0000ff;">C18</span>&#8216;e davet ediyorum</span></strong> <img src="http://www.fxdev.org/wp-content/plugins/more-smilies/Phoenity/smile.png" alt=")" class="wp-smiley" /> </p>
<p>Yazıyla ilgili tüm PCB şematik ve baskı devre dosyalarına, ilgili programlara ve resimlere <a href="http://www.4shared.com/file/K9yxeMPv/USB_Board_FxDevorg.html" target="_blank"><strong>buradan</strong></a> ulaşabilirsiniz. Son olarak devre çiziminde Eagle 5.11.0 kullandığımı söylemek isterim.</p>
<p><strong>Ayrıca yukarıda resmi görülen kiti edinmek isteyenler bana mesaj yoluyla ulaşabilirler.</strong></p>
<p>Herkese çalışmalarında başarılar dilerim..</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/pic18f2550-usb-deneme-karti/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/pic18f2550-usb-deneme-karti/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Serial Port Terminal V1.1</title>
		<link>http://www.fxdev.org/serial-port-terminal-v1-1/</link>
		<comments>http://www.fxdev.org/serial-port-terminal-v1-1/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 21:53:37 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[connect]]></category>
		<category><![CDATA[even]]></category>
		<category><![CDATA[hyper]]></category>
		<category><![CDATA[odd]]></category>
		<category><![CDATA[parity]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[seri]]></category>
		<category><![CDATA[seri port]]></category>
		<category><![CDATA[serial]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[uart]]></category>
		<category><![CDATA[usart]]></category>
		<category><![CDATA[windows 7]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=1034</guid>
		<description><![CDATA[Daha önce burada ilk versiyonunu çıkardığım seri port terminal programı her ne kadar çok büyük bir ilgi görse de bazı eksiklikleri olduğunu farkettiğimden bugün üzerinde bir kaç değişiklik yapıp versiyon 1.1&#8242;i çıkardım. Özellikle tez çalışmalarım sırasında, C# ile bilgisayar arayüzü geliştirirken bir yazı dizisini, belirli süreyle seri porttan göndermem gerekti. Bunun gibi ihtiyaçları Terminal v1.9b [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Microsoft Visual C# 2010" href="http://www.fxdev.org/wp-content/uploads/2010/08/c.png"><img src="http://www.fxdev.org/wp-content/uploads/2010/08/c.png" alt="" title="Microsoft Visual C# 2010" width="214" height="32" class="alignright size-full wp-image-789" /></a>Daha önce <a href="http://www.fxdev.org/serial-port-terminal" target="_blank"><strong>burada</strong></a> ilk versiyonunu çıkardığım seri port terminal programı her ne kadar çok büyük bir ilgi görse de bazı eksiklikleri olduğunu farkettiğimden bugün üzerinde bir kaç değişiklik yapıp versiyon 1.1&#8242;i çıkardım.</p>
<p>Özellikle tez çalışmalarım sırasında, C# ile bilgisayar arayüzü geliştirirken bir yazı dizisini, belirli süreyle seri porttan göndermem gerekti. Bunun gibi ihtiyaçları Terminal v1.9b programını geliştirenler görmüş olacaklar ki, programa 3 adet makro tanımlama bölgesi koymuşlar. Her ne kadar bu programı sevmesem de, programı tez geliştirme süresince kullanıyor olmak beni ayrıca sinirlendirdi ve beni seri port terminal programımın 1.1 sürümünü çıkarmaya zorladı.<span id="more-1034"></span></p>
<p>Bu sürümde programa eklenen özellikleri ise aşağıdaki tablodan görebilirsiniz.</p>
<div class="important-green"><span class="important-title-green">Serial Port Terminal V1.1</span>- 6 adet farklı makro tanımlayabilme,<br />
- Makroları 200 ile 20000ms arasında süreyle gönderebilme,<br />
- Boyutlandırmaya açılmış görünüm,<br />
- Daha hoş arayüz,<br />
- Gelen veri tipi hexadecimal, binary, decimal şeklinde görüntülenirken her karakterden sonra bir alt satıra geçme,<br />
- İstenilen anda makronun butona basarak gönderebilme.</div>
<p>Programın yeni sürümüne ait görüntüyü aşağıdan görebilirsiniz.<a class="lightbox"  title ="Serial Port Terminal V1.1" href="http://www.fxdev.org/wp-content/uploads/2011/07/serial_port_terminal_v1_1.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/07/serial_port_terminal_v1_1.png" alt="" title="Serial Port Terminal V1.1" width="626" height="372" class="aligncenter size-full wp-image-1035" /></a></p>
<p>Programın son sürümünü <a href="http://www.4shared.com/file/b5LRMUzF/Serial_Port_Terminal_V11_-_FxD.html" target="_blank"><strong>buradan</strong></a> veya <a href="http://www.megaupload.com/?d=WSRPARGD" target="_blank"><strong>buradan</strong></a> indirebilirsiniz.<br />
Herkese çalışmalarında başarılar dilerim.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/serial-port-terminal-v1-1/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/serial-port-terminal-v1-1/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>RTOS&#8217;a Giriş: OSA RTOS</title>
		<link>http://www.fxdev.org/rtosa-giris-osa-rtos/</link>
		<comments>http://www.fxdev.org/rtosa-giris-osa-rtos/#comments</comments>
		<pubDate>Sun, 15 May 2011 23:35:03 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[18f]]></category>
		<category><![CDATA[18f2520]]></category>
		<category><![CDATA[18f452]]></category>
		<category><![CDATA[microchip]]></category>
		<category><![CDATA[microcontroller]]></category>
		<category><![CDATA[microprocessor]]></category>
		<category><![CDATA[mikrodenetleyici]]></category>
		<category><![CDATA[mikroişlemci]]></category>
		<category><![CDATA[operating]]></category>
		<category><![CDATA[osa]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[real]]></category>
		<category><![CDATA[rtos]]></category>
		<category><![CDATA[system]]></category>
		<category><![CDATA[time]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=974</guid>
		<description><![CDATA[Mikrodenetleyicilerde adım adım ilerlerken RTOS adıyla sıkça karşılaşmaya başlıyorsunuz. Bu yüzden benim de bir kaç haftadır gündemimi meşgul eden RTOS&#8217;lara, hiç bu konulara girmemiş/girememiş bir kişi gözünden anlatmak ve ilk adımların nasıl atılacağını göstermek istiyorum. Öncelikle RTOS&#8217;a biraz değinmek gerekirse, ki kısa değinmenin haksızlık olduğunu düşünsem de, açılımından da anlaşılacağı üzere bir işin, tam belirtilen [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="OSA RTOS" href="http://www.fxdev.org/wp-content/uploads/2011/05/osa_logo.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/05/osa_logo.png" alt="" title="OSA RTOS" width="278" height="83" class="alignright size-full wp-image-977" /></a>Mikrodenetleyicilerde adım adım ilerlerken RTOS adıyla sıkça karşılaşmaya  başlıyorsunuz. Bu yüzden benim de bir kaç haftadır gündemimi meşgul eden RTOS&#8217;lara, hiç bu konulara girmemiş/girememiş bir kişi gözünden anlatmak ve ilk adımların nasıl atılacağını göstermek istiyorum.<br />
Öncelikle RTOS&#8217;a biraz değinmek gerekirse, ki kısa değinmenin haksızlık olduğunu düşünsem de, açılımından da anlaşılacağı üzere bir işin, tam belirtilen zaman aralıklarında yapılması ilkesi taşıyan, içerisinde bu amacı gerçekleştirmek üzere birimler barındıran, küçük işletim sistemleri desek sanırım yanlış olmaz. Peki RTOS&#8217;a ne için ihtiyaç duyarız?<span id="more-974"></span></p>
<p>- Spagetti kod yazımı, yani sonsuz for, binlerce if/else&#8217;den kurtulmak,<br />
- Kodların bakımını daha kolay yapabilmek ve kodun bölümlerini daha keskin belirleyebilmek,<br />
- Bizim için acil olan işlemleri, tam belirlenen sürede yaptırabilmek,<br />
- Görünürde paralel işlem yapabilmek için.</p>
<p><a class="lightbox"  title ="Bad Design" href="http://www.fxdev.org/wp-content/uploads/2011/05/BadGuiDesign.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/05/BadGuiDesign.jpg" alt="" title="Bad Design" width="149" height="201" class="alignleft size-full wp-image-976" /></a>Normal kod yazdığımızı düşündüğümüzde işlemlerimizi bir sıraya sokar, bir kesme yardımıyla bu işlemleri sırasıyla yürütürüz. Elbette kısa kod parçaçıkları yazdığımızda bunu kontrol etmesi ve yönetmesi bizim için kolaydır, fakat onlarca kontrol mekanizması işin içine girdiğinde sistemin takibi ve bakımı oldukça zorlaşır ve işin içinden çıkılamaz noktaya gelinir. İşte bu noktada RTOS işin içine girer. Burada unutulmaması gereken iki konu vardır, RTOS sisteminize artı bir hız katmaz, işleyiş organizasyonu ve yönetimi katar. Tasarlanan RTOS sistemleri kurulduğu sistemden bağımsızdır ve bunun için neredeyse tüm RTOS&#8217;ların farklı mikrodenetleyicilerle de rahatça çalıştığı görülür.</p>
<p>RTOS tercihleri konusunda ise oldukça fazla alternatifiniz var. İnternette &#8220;RTOS&#8221; diye aradığınızda bedava veya ücretli binlerce RTOS ile karşılaşıyorsunuz. Ben ise bedava olduğu ve 8 bitlik mikrodenetleyicilerde kolay bir biçimde kullanmak için OSA RTOS&#8217;u tercih ettim. İlgili sistemi incelemek ve indirmek için <a href="http://www.pic24.ru/doku.php/en/osa/ref/intro" target="_blank"><strong>buraya</strong></a> tıklayabilirsiniz. Bu yazıda yaptığım örneğin ise yapım aşamalarını aşağıdaki videodan izleyebilirsiniz(1080p ve tam ekran izlemenizi öneririm). RTOS kullanımına geçmeden önce OSA RTOS&#8217;un yardım dosyasını çok dikkatli bir şekilde okumanızı şiddetle tavsiye ediyorum. Gerçekten en ince ayrıntısına kadar özenilerek hazırlanmış bir kaynak.<br />
<p><a href="http://www.fxdev.org/rtosa-giris-osa-rtos/"><em>Click here to view the embedded video.</em></a></p>Karşılaştıracağımız örnek her ne kadar RTOS&#8217;un gücünü göstermede yetersiz olacaksa da karşılaştırma örneğimizde RC0-3 bacaklarından sırasıyla 200-400-600 ve 800ms&#8217;lik kare dalgalar üretelim. C18&#8242;de derleyeceğim kodları öncelikle klasik metotla yazalım.</p>
<pre class="brush: c; highlight: [3];">// www.FxDev.org

#include < p18f2520.h >

// Fuse ayarlamaları, ayrıntılı bilgi için C18 help dosyasına bakılmalı
#pragma config OSC      = HSPLL
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = ON
#pragma config BOREN    = ON
#pragma config BORV     = 1
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config STVREN   = OFF
#pragma config DEBUG    = OFF
#pragma config WDT      = OFF
#pragma config LVP      = OFF

int i,flag;

void PIC_Init(void)
{
    LATC            = 0x00;
    TRISC           = 0x00;

    T1CON           = 0x80;     // 16bit mode
    TMR1H           = 0xD8;     // 1ms'de bir kesme için değerler yükleniyor
    TMR1L           = 0xF0;

    INTCON = 0;
    INTCONbits.PEIE = 1;
    PIR1bits.TMR1IF = 0;        // Timer1 kesme bayrağı siliniyor
    PIE1bits.TMR1IE = 1;        // Timer1 kesmesi aktif
    T1CONbits.TMR1ON= 1;        // Timer1 çalıştırılıyor
    INTCONbits.GIE  = 1;        // Kesmeler açılıyor
}

void main(void)
{
    PIC_Init();                     // Pic için genel ayarlar yapılıyor

    for(;;)
    {
        if(flag)
        {
            flag=0;
            i++;
            if((i%100)==0) {LATCbits.LATC0^=1;}
            if((i%200)==0) {LATCbits.LATC1^=1;}
            if((i%300)==0) {LATCbits.LATC2^=1;}
            if((i%400)==0) {LATCbits.LATC3^=1;}
        }
    }
}

/*//////////////////////  Kesme Rutinleri \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
void kesme(void);       // Kesme fonksiyonu tanımlanıyor
                        // Ayrıntılı bilgi için C18 User Guide Interrupt Kısmına bakılmalı
//----------------------------------------------------------------------------

// Yüksek öncelikli kesme vektörü
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
  _asm
    goto kesme         //Kesmeye atla
  _endasm
}
#pragma code

#pragma interrupt kesme
void kesme(void)
{
    if (PIR1bits.TMR1IF)
    {
        PIR1bits.TMR1IF = 0;
        TMR1H           = 0xD8;     // 1ms'de bir kesme için değerler yükleniyor
        TMR1L           = 0xF0;
        flag=1;
    }
}</pre>
<p>Şimdi de aynı işlemi OSA RTOS kullanarak yazalım.</p>
<pre class="brush: c; highlight: [3];">// www.FxDev.org
// OSA RTOS Örneği
#include < p18f2520.h >
#include < osa.h >

// Fuse ayarlamaları, ayrıntılı bilgi için C18 help dosyasına bakılmalı
#pragma config OSC      = HSPLL
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = ON
#pragma config BOREN    = ON
#pragma config BORV     = 1
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config STVREN   = OFF
#pragma config DEBUG    = OFF
#pragma config WDT      = OFF
#pragma config LVP      = OFF

void PIC_Init(void)
{
    LATC            = 0x00;
    TRISC           = 0x00;

    T1CON           = 0x80;     // 16bit mode
    TMR1H           = 0xD8;     // 1ms'de bir kesme için değerler yükleniyor
    TMR1L           = 0xF0;

    INTCON = 0;
    INTCONbits.PEIE = 1;
    PIR1bits.TMR1IF = 0;        // Timer1 kesme bayrağı siliniyor
    PIE1bits.TMR1IE = 1;        // Timer1 kesmesi aktif
    T1CONbits.TMR1ON= 1;        // Timer1 çalıştırılıyor
}

void Task_1(void)
{
    for(;;)
    {
        OS_Delay(100);
        LATCbits.LATC0^=1;
    }
}

void Task_2(void)
{
    for(;;)
    {
        OS_Delay(200);
        LATCbits.LATC1^=1;
    }
}

void Task_3(void)
{
    for(;;)
    {
        OS_Delay(300);
        LATCbits.LATC2^=1;
    }
}

void Task_4(void)
{
    for(;;)
    {
        OS_Delay(400);
        LATCbits.LATC3^=1;
    }
}

void main(void)
{
    PIC_Init();                     // Pic için genel ayarlar yapılıyor

    OS_Init();                      // RTOS ilk ayarları yapılıyor

    OS_Task_Create(1,Task_1);       // 1. task oluşturuluyor, öncelik 1
    OS_Task_Create(2,Task_2);       // 2. task oluşturuluyor, öncelik 2
    OS_Task_Create(3,Task_3);       // 3. task oluşturuluyor, öncelik 3
    OS_Task_Create(4,Task_4);       // 4. task oluşturuluyor, öncelik 4

    OS_EI();                        // Kesmeler açılıyor
    OS_Run();                       // RTOS çalıştırılıyor
}

/*//////////////////////  Kesme Rutinleri \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
void kesme(void);       // Kesme fonksiyonu tanımlanıyor
                        // Ayrıntılı bilgi için C18 User Guide Interrupt Kısmına bakılmalı
//----------------------------------------------------------------------------

// Yüksek öncelikli kesme vektörü
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
  _asm
    goto kesme         //Kesmeye atla
  _endasm
}
#pragma code

#pragma interrupt kesme
void kesme(void)
{
    if (PIR1bits.TMR1IF)
    {
        PIR1bits.TMR1IF = 0;
        TMR1H           = 0xD8;     // 1ms'de bir kesme için değerler yükleniyor
        TMR1L           = 0xF0;
        OS_Timer();
    }
}</pre>
<p>Her iki kodu da derlediğimizde aşağıda göreceğiniz üzere, yer konusunda aralarında bariz bir fark oluşmamaktadır.<a class="lightbox"  title ="Karşılaştırma" href="http://www.fxdev.org/wp-content/uploads/2011/05/karsilastirma.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/05/karsilastirma.png" alt="" title="Karşılaştırma" width="616" height="272" class="aligncenter size-full wp-image-975" /></a>Fakat bu örnekte tam olarak belli olmasa da öncelik atayabilme, işi zamanında tamamlama, büyüyen kod öbeklerinde anlaşılabileceği gibi sistemin takip edilebilirliğinin kolay olmasından RTOS tercihimiz olacaktır.<br />
Örneğin elinizde 10ms&#8217;de bir ADC&#8217;den örnek alan, alınan değeri 0.5ms&#8217;de bir PI, PID&#8217;den geçiren ve tüm sonuçları 200ms&#8217;de bir bilgisayara aktaran, 50ms&#8217;de bir ise sistemin tepkisini değiştiren yazılım parçaları bulunsun. Bunu if/else&#8217;ler ile oluşturmaktansa RTOS&#8217;un bize sunduğu Task&#8217;larla yapmak hem kolay hem de anlaşılır olacaktır. Dahası sürelerin kesin ve görevlere kolaylıkla öncelik atanabilmesi de cabası.</p>
<p>RTOS ile ilgili giriş yazımı kapamadan önce, ileriki RTOS örneklerimde kullanacağım <strong>OSA RTOS</strong>&#8216;un 10F&#8217;ten 24F&#8217;e, AVR ve STM&#8217;e kadar mikrodenetleyici ve C18, C30, CCS C, Hi-Tech, WinAVR gibi çok farklı derleyiciler için rahatça kullanılabildiğini belirtmek isterim.</p>
<p>İleride daha komplike örnekler ve OSA RTOS&#8217;un derin görevlerini de ele almayı düşünüyorum.<br />
Herkese çalışmalarında başarılar dilerim.</p>
<p>Dip Not: Kodları Rus&#8217;lar yazdığı için de müzik onlara özel..</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/rtosa-giris-osa-rtos/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/rtosa-giris-osa-rtos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sponsorluk ve Reklam: ExpKits ve EX33DS</title>
		<link>http://www.fxdev.org/sponsorluk-ve-reklam-expkits-ve-ex33ds/</link>
		<comments>http://www.fxdev.org/sponsorluk-ve-reklam-expkits-ve-ex33ds/#comments</comments>
		<pubDate>Tue, 10 May 2011 13:36:29 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Hayat]]></category>
		<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[24f]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[ex33ds]]></category>
		<category><![CDATA[expkits]]></category>
		<category><![CDATA[lpc1768]]></category>
		<category><![CDATA[nxp]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[stm]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[tanıtım]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=965</guid>
		<description><![CDATA[Sitenin ayakta durması için arayışa giriştiğim desteğini bugün itibari ile ExpKits ile sağlamış bulunmaktayım. Destekleri için şirket sahibi Göktuğ Bey&#8217;e teşekkürlerimi sunmak isterim. Ayrıca bu desteğin yanında bana kendilerinin geliştirdiği EX33DS geliştirme kitini göndermeleri de, bu kartı sizler için incelememe vesile oldu. Böylelikle farklı durumlar gerçekleşmedikçe bundan sonraki çalışmalarımda bu kiti kullanacağımı da sizlere bu [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="ExpKits EX33DS" href="http://www.fxdev.org/wp-content/uploads/2011/05/expkits.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/05/expkits.png" alt="" title="ExpKits EX33DS" width="305" height="229" class="alignright size-full wp-image-966" /></a>Sitenin ayakta durması için arayışa giriştiğim desteğini bugün itibari ile <a href="http://www.expkits.com/" target="_blank"><strong>ExpKits</strong></a> ile sağlamış bulunmaktayım. Destekleri için şirket sahibi Göktuğ Bey&#8217;e teşekkürlerimi sunmak isterim. Ayrıca bu desteğin yanında bana kendilerinin geliştirdiği EX33DS geliştirme kitini göndermeleri de, bu kartı sizler için incelememe vesile oldu. Böylelikle farklı durumlar gerçekleşmedikçe bundan sonraki çalışmalarımda bu kiti kullanacağımı da sizlere bu yolla belirtmek isterim.</p>
<p>Günümüzde ister elektronik isterseniz de elektriğe gönül vermiş olun, şartlar herkese bir mikrodenetleyici ya da bir mikroişlemciyi öğrenme zorunluluğu getirmiştir. Özellikle yeni başlayan birinin kafasındaki en büyük problemler ise nereden, hangi kaynak ve dil ile hangi donanımı öğreneceğinin yanında bunu hazır bir kitle yapıp yapmayacağıdır.<span id="more-965"></span> Profesyonel bir kişi için ise kullanılacak kit üzerinde barındırdığı donanım ve kullanım kolaylığı açısından ele alınır. Ayrıca yine günümüzde zaman ve para oldukça değerli olduğundan, alınacak herhangi bir elektronik kitin, çabuk ve ucuz elimizde olması da ayrıca istediğimiz bir durumdur.<br />
Tüm bunlar ve Türkiye şartlarını göz önünde bulundurduğumuzda bir elin parmağını geçmeyen bir kaç firma içerisinden ExpKits özellikle öğrenci dostu olması nedeniyle diğerlerinden bir adım öne çıkmaktadır. Özellikle ürettiği ürünün kalite, yardım ve desteği konusunda benzerlerine nazaran çok az sorun yaşanmaktadır.<br />
<a class="lightbox"  title ="EX33DS" href="http://www.fxdev.org/wp-content/uploads/2011/05/expkits-2.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/05/expkits-2.jpg" alt="" title="EX33DS" width="600" height="485" class="aligncenter size-full wp-image-967" /></a><br />
Expkits&#8217;in piyasaya geçtiğimiz ay sürdüğü ExpKits EX33DS, özellikle 32 bit, ARM ve PIC mikrodenetleyicilerine giriş yapacaklar için oldukça ideal bir tasarım. Kit, yukarıdaki resimde görüldüğü gibi, tek başına aslında bir donanım kartı. Üzerinde kullanılmak üzere aşağıdaki donanımları barındırmakta;<br />
- 2&#215;16 LCD giriş soketi,<br />
- 128&#215;64 ve 240&#215;128 GLCD giriş soketleri,<br />
- RS232, RS485, RF, IRDA, PS2 gibi klasikleşmiş haberleşme ve bunların yanında,<br />
- ENC28J60 kontrollü Ethernet birimi,<br />
- Servo motor sürme soketleri,<br />
- DS18B20, SHT7XX, I2C EEPROM birimleri,<br />
- 64 adet led ve yine 64 adet giriş birimi,<br />
- Bu birimlerin Pull-Up ya da Pull-Down ayarlanabilmesi,<br />
- Joystick ve 4&#215;4 keypad,<br />
- 2 adet röle ve yine 2 adet optocoupler,<br />
- MiniSD kart yuvası,<br />
- 4&#215;7 segment ve Buzzer,<br />
- GLCD&#8217;ler için touch screen soketi,<br />
- 2 adet harici pot ve uygulama için bir adet LDR,<br />
- USB&#8217;den haberleşme ve enerjisini yine buradan sağlama gibi daha bir çok özellik.</p>
<p>Yukarıdaki listeden de görülebileceği gibi eğitim için kullanılmak üzere tasarlanmış ve her türlü ihtiyacı karşılayan bir tasarım olmuş. Tasarlanan bu donanım kartını tek başına kullanmak mümkün olmasa da yine ExpKits&#8217;in ürettiği MCU kartları ile ürünü istediğiniz mikrodenetleyiciye göre kullanmak mümkün. Bu da bizleri her yeni mikrodenetleyici için yeni bir kit alımı yapmaktan ve gereksiz masraflardan kurtarmakta. Ayrıca karta özel kendi tasarımımızı yaparak donanım kartını istediğimiz mikrodenetleyici ile kullanmak ise sadece sizin yeteneğinizle sınırlı. Özellikle Türkiye&#8217;de ARM kiti eksikliği yaşayan ve ARM konusuna yeni başlayacaklara yurtdışındaki değişik firmaların kitleri yerine bu kit şiddetle önerimdir.</p>
<p>Kitin en güzel ve benim için en önemli konusu ise örnek kodların açıklamalarının Türkçe ve diğer firmalar gibi örnek kodların firmanın kendine has programıyla yazılmamış olmasıdır. Bu da bizlere çalışmalarımızda kolaylık sağlamaktadır. Genel geçer kurala göre; 16 Bit PIC&#8217;ler C30, ARM ailesi ise Keil ile programlanır. Onun içindir ki firmanın örnek kodlarını bu derleyicilerle çıkarması ve kullanıcılara bunu rahatça sunması bence çok önemli ve artı puan.<br />
<a class="lightbox"  title ="MCU Boards" href="http://www.fxdev.org/wp-content/uploads/2011/05/mcu.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/05/mcu.jpg" alt="" title="MCU Boards" width="600" height="320" class="aligncenter size-full wp-image-968" /></a><br />
Hazırlanan kit bize donanım sunduğundan, hazır kitlerde görmeye alıştığımız herhangi bir programlayıcıyı üzerinde barındırmamaktadır. Bunun yerine programlama işi PIC MCU kartlarında ICSP&#8217;den, ARM MCU kartları ise gerek JTAG üzerinden gerekse seri port+Flash Magic programı ile sağlanmaktadır.</p>
<p>Sonuç olarak Türkiye şartları ele alındığında piyasaya çıkmış olan bu kart biz öğrenciler ve kendini geliştirmek isteyenler için güzel özelliklere sahip, işlevli bir kit olmuştur.</p>
<p>Kiti incelemek isteyen arkadaşlar <a href="http://www.expkits.com/?s=ex33ds.htm" target="_blank"><strong>buraya</strong></a> basarak kitin tanıtım sayfasına ve yazılmış örnek kodlara ulaşabilirler.</p>
<p>Kit konusunda merak ettiğiniz her tür sorunuzu yorum kısmından bana ulaştırırsanız elimden geldiğince sizlere yardımcı olmaya çalışırım.</p>
<p>Herkese çalışmalarında başarılar dilerim.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/sponsorluk-ve-reklam-expkits-ve-ex33ds/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/sponsorluk-ve-reklam-expkits-ve-ex33ds/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>İnceme: PIC Programlayıcılar</title>
		<link>http://www.fxdev.org/pic-programlayicilar/</link>
		<comments>http://www.fxdev.org/pic-programlayicilar/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 21:30:31 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[brenner]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[jdm]]></category>
		<category><![CDATA[klon]]></category>
		<category><![CDATA[microchip]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[pickit2]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[programlayıcı]]></category>
		<category><![CDATA[seri]]></category>
		<category><![CDATA[sprut]]></category>
		<category><![CDATA[USB]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=934</guid>
		<description><![CDATA[Kolay bulunabilirliği ve kullanım kolaylığı nedeniyle PIC&#8217;ler hemen hemen her programcının hayatında bir kez uğraştığı mikrodenetleyicilerdir fakat her elektronikçide satılan PIC&#8217;lere yeni başlayanlar için en büyük sorunlardan birisi kullanacağı programlayıcıdır. Gün itibari ile Türkiye piyasasını ele aldığımızda 3 adet PIC programlayıcı öne çıkmaktadır: PicKit2, Brenner ve JDM. Bunlardan Pickit2 ve Brenner USB desteği sunarken JDM [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox" title="PIC" href="http://www.fxdev.org/wp-content/uploads/2011/02/PIC.png"><img class="alignright size-full wp-image-936" title="PIC" src="http://www.fxdev.org/wp-content/uploads/2011/02/PIC.png" alt="" width="200" height="202" /></a>Kolay bulunabilirliği ve kullanım kolaylığı nedeniyle PIC&#8217;ler hemen hemen her programcının hayatında bir kez uğraştığı mikrodenetleyicilerdir fakat her elektronikçide satılan PIC&#8217;lere yeni başlayanlar için en büyük sorunlardan birisi kullanacağı programlayıcıdır.<br />
Gün itibari ile Türkiye piyasasını ele aldığımızda 3 adet PIC programlayıcı öne çıkmaktadır: PicKit2, Brenner ve JDM. Bunlardan Pickit2 ve Brenner USB desteği sunarken JDM seri port ile programlama yapmaktadır.</p>
<p>Peki bir elektronikçinin, bir programlayıcıdan beklentileri nelerdir?<span id="more-934"></span><br />
Bu sorunun yanıtı kişiden kişiye, uygulamadan uygulamaya değişmekle birlikte, bir programlayıcıdan beklenen genel geçer istekler aşağıdaki gibi sıralanabilir;</p>
<p>1) Desteklediği PIC, EEPROM vb. aygıtların sayısının oldukça fazla olması, son çıkan ürünlere hızlı adapte olabilmesi,<br />
2) Firmware güncellemelerinin çok hızlı bir biçimde gerçekleştirmesi,<br />
3) Her türlü gerilim aralığını, PIC&#8217;ler için bu 3.3 ve 5V oluyor, desteklemesi,<br />
4) Çok hızlı bir şekilde program atılabilmesi,<br />
5) Programlayıcılar için vazgeçilmez olan ve bu konuda ilerlemek isteyenlerin mutlaka kullanacağı hata ayıklama yani debugger özelliğinin olması,<br />
6) MPLAB, Hi-Tide veya benzeri IDE&#8217;lere uyum sağlaması,<br />
7) Sadece bir programlayıcı olarak değil, gerektiğinde seri port ve logic analyzer olarak kullanılabilmesi,<br />
8) Programmer-To-Go özelliğini bulunması,<br />
9) ZIF soket barındırması.</p>
<p>Yukarıdaki çoğu maddeyi, PIC programlamaya yeni başlayan birinin anlaması elbette beklenemez. Fakat klasik hale gelen fiyat/performans durumu herkes için ön plandadır. Hem bunu düşünerek, hem de yeni başlayan kullanıcılara yardımda bulunmak amacıyla, elimde bulunan <a href="http://www.expkits.com/?s=pickit2.htm" target="_blank"><strong>ExpKits PicKit2 Klonu</strong></a>, <a href="http://urun.gittigidiyor.com/USB-2-0-PIC-PROGRAMLAYICI-GARANTILI-ve-HEDIYELI_W0QQidZZ34659379" target="_blank"><strong>Memox Brenner</strong></a> ve <a href="http://feng3.cool.ne.jp/en/pg5v2.html" target="_blank"><strong>JDM</strong></a> PIC programlayıcılarını inceledim. Bu programlayıcıların karşılaştırılmarını aşağıdaki tabloda görebilirsiniz.<a class="lightbox" title="Pic Programlayıcıları Karşılaştırması" href="http://www.fxdev.org/wp-content/uploads/2011/02/Karsilastirma.png"><img class="aligncenter size-full wp-image-935" title="Pic Programlayıcıları Karşılaştırması" src="http://www.fxdev.org/wp-content/uploads/2011/02/Karsilastirma.png" alt="" width="651" height="374" /></a>Yukarıdaki tablodan da anlaşılacağı üzere Microchip haklı sebeplerle diğer ürünleri geride bırakıyor. Tabloda dikkatinizi çekmek istediğim bir diğer nokta da Memox Brenner&#8217;inin firmware güncellemesinin kapalı gelmesi. Amatör kullanıcıların Memox&#8217;un 2 yıllık garantisi bozulur diye tornavida değemedikleri kutuyu açtığınızda ise PIC18F2550&#8242;nin soket yerine direk karta lehimlenmiş olduğunu göreceksiniz. Dolayısıyla programlama yapmanız için PIC&#8217;i önce lehimlerden sökmeli daha sonra da programlamalısınız. Bu elbette istenmeyen bir durum.<br />
JDM ise seri portlu bir bilgisayarınız varsa özellikle okulda ödevleri öğrenmek için değil de ders geçmek için yapanlar için biçilmiş kaftan.</p>
<h2>Sonuç Olarak..</h2>
<p><a class="lightbox"  title ="Pickit 2" href="http://www.fxdev.org/wp-content/uploads/2011/02/Pickit2.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/Pickit2.png" alt="" title="Pickit 2" width="204" height="63" class="alignleft size-full wp-image-937" /></a>Eğer ileride amacınız mikrodenetleyicilerle haşır neşir olmaksa ve bunlar içinde PIC sık sık kullanacağınız bir donanımsa o halde kesinlikle ister clone ya da orijinal alın, ister kendiniz yapın, kesinlikle bir Pickit2 sahibi olun. İleride bu kararınız size en azından fazla bir programlayıcı edinmekten kurtaracaktır.<br />
Ayrıca elinizin altına JDM tarzı, delikli karta çok kolay yapabileceğiniz bir programlayıcının olması size avantaj sağlayabilir, en olmadık anda günü kurtarabilir.</p>
<p>Dip not: Karşılaştırmayı direk sitelerden ziyade elimde bulunan donanımı test ederek yaptım. Eğer donanımlarınızda var olan ya da olmayan özellikler varsa, bunu bana bildirirseniz sevinirim.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/pic-programlayicilar/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/pic-programlayicilar/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>SD/MMC Kart ve Data Logger Uygulaması</title>
		<link>http://www.fxdev.org/sdmmc-kart-ve-data-logger-uygulamasi/</link>
		<comments>http://www.fxdev.org/sdmmc-kart-ve-data-logger-uygulamasi/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 16:44:10 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[atmel]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[c30]]></category>
		<category><![CDATA[chan]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[ds18b20]]></category>
		<category><![CDATA[fat]]></category>
		<category><![CDATA[fat16]]></category>
		<category><![CDATA[fat32]]></category>
		<category><![CDATA[fatfs]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[glcd]]></category>
		<category><![CDATA[logger]]></category>
		<category><![CDATA[mdd]]></category>
		<category><![CDATA[mdd file system]]></category>
		<category><![CDATA[micro sd]]></category>
		<category><![CDATA[mmc]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[rtc]]></category>
		<category><![CDATA[sd]]></category>
		<category><![CDATA[sıcaklık]]></category>
		<category><![CDATA[spi]]></category>
		<category><![CDATA[system]]></category>
		<category><![CDATA[txt]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=918</guid>
		<description><![CDATA[İki aydır sınavlardan ve tez çalışmalarımdan bana kalan küçük boşluklarda çalıştığım FAT ve SD/MMC kart uygulamamı en sonunda tamamlayabildim. Benim gibi bu konu üzerine uygulama yapmak isteyenleri doktora tezi kıvamında bir çalışma yapmadan nasıl SD ve MMC kartlara yazım yapabileceklerini bu yazımda ele almaya çalışacağım. SD/MMC kart ve FAT16/32, bu konu üzerinde çalışanların bileceği gibi [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Toshiba Micro SD Kart" href="http://www.fxdev.org/wp-content/uploads/2011/02/Toshiba_Micro_SD.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/Toshiba_Micro_SD.jpg" alt="" title="Toshiba Micro SD Kart" width="158" height="216" class="alignright size-full wp-image-920" /></a>İki aydır sınavlardan ve tez çalışmalarımdan bana kalan küçük boşluklarda çalıştığım FAT ve SD/MMC kart uygulamamı en sonunda tamamlayabildim. Benim gibi bu konu üzerine uygulama yapmak isteyenleri doktora tezi kıvamında bir çalışma yapmadan nasıl SD ve MMC kartlara yazım yapabileceklerini bu yazımda ele almaya çalışacağım.</p>
<p>SD/MMC kart ve FAT16/32, bu konu üzerinde çalışanların bileceği gibi yeri geldiğince gerçekten baş ağrıtıcı bir uygulama olabilmektedir. İstatistiksel bir rakam vermem gerekirse internette bu konuda yapılmış çalışmaların %90&#8242;nı üreticilerin örnek kodlarının devşirilip, yontulmasıyla oluşturulmuş ve neredeyse tüm insanlık Chan&#8217;ın o ünlü kütüphanesine yönelmiş.<br />
Elektor dergisinin Ocak 2011 sayısında da değindiği bu konuya, aşağıdaki basit soruları sorarak giriş yapmak istiyorum.<span id="more-918"></span></p>
<p><strong>FAT16/FAT32 Nedir?</strong><br />
Günümüzde taşınabilir (SD/MMC/Flash Bellek) depolama aygıtlarının ortak dosya sistemi haline gelen FAT, özellikle büyük hacimli ve sürekli yazım/silim işlemleri yapılan veri saklama birimleri için geliştirilmiş bir dosya sistemidir. Günümüzde en fazla kullanılanı FAT32 olmakla beraber FAT16 ve FAT12 dosya sistemleri de bulunmaktadır.</p>
<p><strong>Hangi Bağlantı Çeşidini Kullanacağız?</strong><br />
SD/MMC kartlar bir çok iletişim yöntemini desteklese de biz SPI iletişimini tercih edeceğiz. İletişim hızımız ise maksimum 20MHz ile sınırlı kalacak.</p>
<p><strong>En Önemlisi, Hangi Kütüphaneyi Tercih Etmeliyiz?</strong><br />
Yazımın başında da belirttiğim gibi SD/MMC ve FAT konusunda lider <strong>Chan FatFS</strong> kütüphanesi olarak gözükmektedir. Bir çok firma, çoğu ARM üreticisi, Atmel AVR ve Texas Inst., bu kütüphane ile uygulama örneklerini sitelerine koymuşlardır. Microchip ise kendine ait <strong>MDD File System</strong> adlı SD/MMC kütüphanesini kullanmaktadır.</p>
<p>Ben bu konu hakkında ilk çalışmama Chan ile başlamış olsam da, istediğim başarıyı sağlayamadıktan sonra MDD File System&#8217;e yöneldim. Gerek PIC üzerinde çalışmam gerekse kullanımının oldukça basit oluşu MDD File System&#8217;e ısınmamı sağladı. Fakat bu Chan FatFs&#8217;in elbette kötü bir kütüphane olduğu anlamına gelmez. Çalışmak istediğimiz FAT dökümanı istediğimiz işlemlerimizi gerçekleştiriyorsa benim için ister Chan FatFs ister MDD File System ister FıratFs olmuş açıkçası hiç önemli değil. Sonuç olarak hazır kütüphane kullanıyoruz ve her şeyin bize uymasını beklemek yanlış olur.</p>
<p><strong>Birbirlerine Karşı Üstünlükleri Var Mıdır?</strong><br />
Her iki kütüphane de en temel fonksiyonları, dosya/klasör açma, okuma, yaratma, değiştirme bünyesinde barındırmaktadır. Sadece MDD kütüphanesi FatFs kütüphanesine nazaran boyut olarak biraz daha büyüktür.</p>
<p><strong>PIC Dışındaki Mikrodenetleyicilerde Ne Yapmalıyız?</strong><br />
PIC dışındaki mikrodenetleyicilerde de durum aynıdır. Fakat ARM ve Chan FatFs kütüphanesi ile ilgili bir çok örnek internette bulunmaktadır. İstenirse MDD File System kütüphanesi de istediğiniz mikrodenetleyici için düzenlenebilir.</p>
<p><strong>Bunca Sene Hazır Kütüphaneye Karşı Çıkan Sen, Şimdi Neden Hazır Kütüphane Öneriyorsun?</strong><br />
Başta da belirttiğim gibi FAT dosya sistemi çok karışık gözükmese de bunu herkesin kullanabileceği standart haline getirmek bizlere oldukça fazla zaman kaybettirir. Ayrıca dünya çapında bir çok kullanıcının deneyip, geri bildirimlerde bulunduğu ve geliştirilmesini sağladığı bu kütüphanelerin bizim sıfırdan yazacağımız kütüphanelerden daha iyi olacağını düşünmek sanırım yanlış olmaz. Bunun için Amerika&#8217;yı tekrar keşfetmeye hiç gerek yok. Sadece ileride çıkabilecek sorunlara karşın kütüphanenin ve dosya sisteminin nasıl çalıştığını anlayalım yeter.</p>
<p><strong>Uygulamalarda Takıldığın En Önemli Konu Nedir?</strong><br />
FAT ve SD/MMC uygulama örneklerinde en fazla takıldığım konu yukarıda da bahsettiğim gibi üretici firmanın ya da örneklerinin devşirilerek kullanılmasıdır. Buradaki en önemli eksiklik SD/MMC karta bir TXT dosyası yazıldığında başarının elde edildiği yanılgısıdır. Bir çok üretici firma kodlarını seri haberleşmeyle birleştirip, özellikle mikrodenetleyicinin herhangi bir Timer ya da başka bir modülünü kullanmaktadır. Bunlar bazı uygulamalarda açıklansa da çoğu uygulamada es geçilmektedir. Dolayısıyla yaptığınız sistemde oluşturduğunuz bir kesmenin ya da başka bir işlemin dosya sistemine zarar verip vermediği bilinememektedir.</p>
<p><strong>Peki Bizler Ne Arıyoruz?</strong><br />
Çoğu kütüphanede olduğu gibi yapmayı istediğimiz şey, donanımı en az yoracak şekilde aşağıdaki işlemleri yapmaktır.<br />
- SD/MMC&#8217;yi tanı, tanıt,<br />
- SD/MMC karta yeni dosya aç, veri yaz, veri oku,<br />
- Açılan dosyayı kapa.<br />
Onun için gayet sade ve fonksiyonların ne olduğu açık saf kütüphaneler kullanmak her zaman bizim avantajımıza olacaktır.</p>
<p><strong>Data Logger Uygulaması</strong><br />
Bu kadar söz ettikten sonra gelelim Data Logger uygulamamıza. Data Logger, adından da anlaşılacağı üzerinde dış ortamdan ya da sistemden alınan verileri belirli zaman aralıklarıyla kayıt altına alma işlemidir. Ben de bu uygulamamda DS18B20 dijital sıcaklık sensöründen aldığım verileri Micro SD karta yazarak basit bir kayıt işlemi yaptım.<br />
Öncelikle kullanacağımız MDD File System kütüphanesine ait tüm dosyaları <strong><a href="http://www.4shared.com/file/O6QK2Rf2/Data_Logger_Uygulamas.html" target="_blank">buradan</a></strong> indirebilirsiniz. Benim kullandığım Micro SD kartta herhangi bir yazım koruma metodu olmadığından, uygulamamda &#8220;yazım koruma kontrolü&#8221; yapmadım ve kütüphaneyi buna göre düzenledim. Değişiklik yaptığım fonksiyon isimleri aşağıdaki gibidir;<br />
-<strong>SD-SPI.c</strong> dosyasındaki <strong>MDD_SDSPI_InitIO()</strong>,<br />
-<strong>SD-SPI.c</strong> dosyasındaki <strong>MDD_SDSPI_MediaDetect()</strong>,<br />
-Ve <strong>tüm kütüphane kısayol tanımlamaları</strong>.<br />
<a class="lightbox"  title ="Proje Dosyaları" href="http://www.fxdev.org/wp-content/uploads/2011/02/Dosyalar.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/Dosyalar.png" alt="" title="Proje Dosyaları" width="186" height="401" class="alignleft size-full wp-image-921" /></a><br />
Kütüphaneyi indirip, proje klasörüne attıktan sonra yapmamız gerekenler şunlardır;<br />
-<strong>HardwareProfile.h</strong> dosyasının içerisinden <strong>kullanacağımız pin tanımlamaları yapılmalıdır</strong>. İstenirse kullanılacak registerler de buradan değiştirilebilir.<br />
-<strong>FSConfig.h</strong> dosyasının içerisinden de <strong>SD/MMC kart ile ilgili tüm ayarlar yapılabilir</strong>.<br />
-Her iki dosyada da tanımlamaların ne işe yaradığı belirtilmektedir.</p>
<p>Tüm bu işlemleri yaptığımızda MDD File System dosyaları yandaki hiyerarşide toplanmalıdır. Daha sonra istediğimiz uygulama bu kütüphane dosyaları kullanılarak geliştirilebilir. Ben uygulamamda <strong>PIC24FJ256GB110</strong> ile <strong>128&#215;64 GLCD</strong> kullandığım için onunla ilgili kütüphane dosyalarımı projeme ekledim. Bu dosyaları <strong><a href="http://www.4shared.com/file/O6QK2Rf2/Data_Logger_Uygulamas.html" target="_blank">buradan</a></strong> indirebilirsiniz.</p>
<p>Projemize gelecek olursak öncelikle elimizde bulunan Micro SD kartımızın içerisinde &#8220;<strong>fxdev-1.txt</strong>&#8220;, &#8220;<strong>fxdev-2.txt</strong>&#8221; ve &#8220;<strong>fxdev-3.txt</strong>&#8221; adında 3 adet TXT dosyası oluşturalım ve içerilerine istediğimiz metni yazıp kaydedelim.<br />
Benim yazdığım metinler aşağıdaki resimde görülebilir. <a class="lightbox"  title ="Micro SD İçerisindeki Dosyalar" href="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_Dosyalari.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_Dosyalari.png" alt="" title="Micro SD İçerisindeki Dosyalar" width="605" height="240" class="aligncenter size-full wp-image-922" /></a>Ben projemde bu belgelerin içeriklerini sırasıyla GLCD&#8217;de gösterip, &#8220;<strong>fxdev-3.txt</strong>&#8221; belgesinin silimini gerçekleştirdim. Daha sonra &#8220;<strong>DATA.TXT</strong>&#8221; adlı metin belgesi açıp sırasıyla tarih, saat ve o anki sıcaklık bilgilerini 5&#8242;er saniye aralıklarla kaydettim. </p>
<p>Bu işlemler olmadan önce RTC tarihini 09/02/2011 ve saatini 20:42:05 ayarladım. Dosya yaratma, kaydetme işlemleri RTC üzerinden olduğundan son kaydetme işlemi bittiğinde aradan ne kadar süre geçtiğini görebildim. Kayıt işlemini bitirmek içinse <strong>RA7</strong> bacağına bağlı butona basarak işlemi tamamladım. Tüm bu işlemler sonrasında Micro SD kartının barındırdığı son dosyalar ve &#8220;<strong>DATA.txt</strong>&#8221; dosyasının içeriği aşağıdaki resimde görülebilir.<a class="lightbox"  title ="Micro SD'nin Son İçeriği ve DATA.TXT Dosyası" href="http://www.fxdev.org/wp-content/uploads/2011/02/DATA_Dosyasi.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/DATA_Dosyasi.png" alt="" title="Micro SD&#039;nin Son İçeriği ve DATA.TXT Dosyası" width="622" height="216" class="aligncenter size-full wp-image-923" /></a>Uygulama verilerini Excel&#8217;e atıp grafik çizdirdiğimde ise aşağıdaki sonucu aldım.<a class="lightbox"  title ="Sıcaklık Zaman Grafiği" href="http://www.fxdev.org/wp-content/uploads/2011/02/Sicaklik-Zaman-Grafigi.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/Sicaklik-Zaman-Grafigi.png" alt="" title="Sıcaklık Zaman Grafiği" width="609" height="299" class="aligncenter size-full wp-image-924" /></a>Yukarıdaki resimde bir yükselti görülmektedir. Bu yükselti ben tam sensörü tuttuğumda gerçekleşmiştir.</p>
<p>Bu uygulamaya ait <strong>main.c</strong> dosyasının içeriği aşağıda görülebilir.</p>
<pre class="brush: c; highlight: [8,133,138,142,148,149,150,151,179,181,190,221,223,236];">// Yazar:   Fırat DEVECİ
// Konu :   Micro SD Kart ile Data Logger Uygulaması
// Tarih:   10/02/2011

#include "p24Fxxxx.h"
#include "string.h"
#include "stdio.h"
#include "FSIO.h"
#include "ks0108.h"
#include "ds18b20.h"

_CONFIG3(WPCFG_WPCFGDIS &#038; WPDIS_WPDIS)
_CONFIG2(IESO_OFF &#038; PLLDIV_NODIV &#038; PLL_96MHZ_ON &#038; FNOSC_FRCPLL &#038; FCKSM_CSDCMD &#038; OSCIOFNC_OFF &#038; IOL1WAY_OFF &#038; DISUVREG_OFF &#038; POSCMOD_EC)
_CONFIG1(JTAGEN_OFF &#038; GCP_OFF &#038; GWRP_OFF &#038; BKBUG_OFF &#038; COE_OFF &#038; ICS_PGx1 &#038; FWDTEN_OFF &#038; WINDIS_OFF)

char sendBuffer1[] = "\tFxDev.org Sunar!";
char sendBuffer2[] = "\r\nDS18B20 ile MMC Data Logger Uygulamasi\r\n\r\n";
char sendBuffer3[] = "Tarih\t\tSaat\t\tSicaklik\r\n";
char sendBuffer4[] = "%0.2d/%0.2d/%0.2d\t%0.2d:%0.2d:%0.2d\t%3.1f\r\n";
char receiveBuffer1[120];
char receiveBuffer2[120];
char receiveBuffer3[120];

void RTC_init(int gun, int ay, int yil, int haftagun, int saat, int dakika, int saniye)
{
    // RTC ilk ayarlamaları //
    // 32768Hz kristal girişi açılıyor
    __builtin_write_OSCCONL(0x02);
    // RTCWREN başta kapalı gelir, bu da registerlere erişmemizi engeller
    // Aşağıdaki asm koduyla bu kilit kaldırılır
    asm volatile("disi #5");
    asm volatile("mov #0x55, w7");
    asm volatile("mov w7, _NVMKEY");
    asm volatile("mov #0xAA, w8");
    asm volatile("mov w8, _NVMKEY");
    // Bu bilgi direk datasheetten alınmıştır
    RCFGCALbits.RTCWREN=1;  // Artık registerlere yazım yapılabilir
    RCFGCALbits.RTCEN=0;    // RTC kapatılıyor
    PADCFG1bits.RTSECSEL=1; // Alarm kullanılacaksa bu bit sıfır olmalı
                            // Biz saniye çıkışını dışarı vereceğiz
    RCFGCALbits.RTCOE=1;    // Eğer PADCFG1bits.RTSECSEL=1 olursa bu bitte 1 olmak zorunda
    RCFGCALbits.RTCPTR=3;   // Yıldan itibaren değerler yüklenmeye başlayacak
                            // RTCVAL registerine her yükleme sonrasında RCFGCALbits.RTCPTR
                            // registerinin içeriği bir azalarak sırasıyla ay-gün,haftasaat-saat,dakika-saniye
                            // değerlerinin girilmesine izin verecek
                            // Alarm kurmak için de ALRMPTR bitleri aynen bu şekilde kullanılır
                            // Çok gıcık bir yöntem olduğunu bende kabul ediyorum
    // Şimdi tarih ve saat bilgilerini girelim.
    // Bir aptal uygulama daha burada bizi bekliyor
    // Örneğin ay değeri için aralıkta 0x12 girmemiz gerekiyor, yıl için de aynen 0x2009
    // Ya da gün için 0x31 0x24 gibi. Bunun neden 21,23 şeklinde yapılmadığını microchip'e sorabilirsiniz.

    gun=(gun/10)*16+gun%10;
    ay=(ay/10)*16+ay%10;
    yil=(yil/10)*16+yil%10;
    haftagun=(haftagun/10)*16+haftagun%10;
    saat=(saat/10)*16+saat%10;
    dakika=(dakika/10)*16+dakika%10;
    saniye=(saniye/10)*16+saniye%10;

    // Tüm tarih-saat bileşenleri yukarıdaki anlatılan şekle dönüştürüldü.
    // Şimdi ise registerler için bunları aşağıdaki şekilde birleştirmek gerekiyo
    // RTCPTR=3
    RTCVAL=yil;                 // 99 yıla kadar değer alabiliyor
    // RCFGCALbits.RTCPTR 1 azaldı, RTCPTR=2
    RTCVAL=(ay< &lt;8)+gun;         // Ay 12'ye kadar gün ise 31'e kadar yazılabilir
    // RCFGCALbits.RTCPTR 1 azaldı, RTCPTR=1
    RTCVAL=(haftagun<&lt;8)+saat;  // Haftagün 0-6, saat 23'e kadar yazılabilir
    // RCFGCALbits.RTCPTR 1 azaldı, RTCPTR=0
    RTCVAL=(dakika<&lt;8)+saniye;  // Dakika 59, saniye 59'a kadar yazılabilir

    RCFGCALbits.CAL=0;      // Kablibrasyon yapılmayacak
    RCFGCALbits.RTCEN=1;    // RTC açılacak
    RCFGCALbits.RTCWREN=0;  // RTC yazımı engellenecek, böylelikle cihaza reset atılsa da RTC çalışmasına devam edecek
                            // Elbette bizim uygulamamızda bu olmayacak
}

void RTC_read(int *gun, int *ay, int *yil, int *haftagun, int *saat, int *dakika, int *saniye)
{
    int yil_temp,ay_gun,haftagun_saat,dakika_saniye;
    while(RCFGCALbits.RTCSYNC); // Tam değişim anında okuma yapmamak için bu bitin sıfır olması bekleniyor
    RCFGCALbits.RTCPTR=3;       // Yine bu registeri 3 yaparak yıldan itibaren okumaya başlıyoruz

    yil_temp        =RTCVAL;    // RTCPTR=3 oldu
    ay_gun          =RTCVAL;    // RTCPTR=2 oldu
    haftagun_saat   =RTCVAL;    // RTCPTR=1 oldu
    dakika_saniye   =RTCVAL;    // RTCPTR=0 oldu

    *yil=((yil_temp>>4)&#038;0x0F)*10+(yil_temp&#038;0x0F);
    *ay=((ay_gun>>12)&#038;0x0F)*10+((ay_gun>>8)&#038;0x0F);
    *gun=((ay_gun>>4)&#038;0x0F)*10+(ay_gun&#038;0x0F);
    *haftagun=(haftagun_saat>>8)&#038;0x0F;
    *saat=((haftagun_saat>>4)&#038;0x0F)*10+(haftagun_saat&#038;0x0F);
    *dakika=((dakika_saniye>>12)&#038;0x0F)*10+((dakika_saniye>>8)&#038;0x0F);
    *saniye=((dakika_saniye>>4)&#038;0x0F)*10+(dakika_saniye&#038;0x0F);
}

void loading(int i)
{
    switch(i)
    {
        case 0: ks0108_circle(32,29,4,1,1);ks0108_circle(44,29,4,0,0);ks0108_circle(56,29,4,0,0);ks0108_circle(68,29,4,0,0);ks0108_circle(80,29,4,0,0);ks0108_circle(92,29,4,0,0);break;
        case 1: ks0108_circle(32,29,4,0,0);ks0108_circle(44,29,4,1,1);ks0108_circle(56,29,4,0,0);ks0108_circle(68,29,4,0,0);ks0108_circle(80,29,4,0,0);ks0108_circle(92,29,4,0,0);break;
        case 2: ks0108_circle(32,29,4,0,0);ks0108_circle(44,29,4,0,0);ks0108_circle(56,29,4,1,1);ks0108_circle(68,29,4,0,0);ks0108_circle(80,29,4,0,0);ks0108_circle(92,29,4,0,0);break;
        case 3: ks0108_circle(32,29,4,0,0);ks0108_circle(44,29,4,0,0);ks0108_circle(56,29,4,0,0);ks0108_circle(68,29,4,1,1);ks0108_circle(80,29,4,0,0);ks0108_circle(92,29,4,0,0);break;
        case 4: ks0108_circle(32,29,4,0,0);ks0108_circle(44,29,4,0,0);ks0108_circle(56,29,4,0,0);ks0108_circle(68,29,4,0,0);ks0108_circle(80,29,4,1,1);ks0108_circle(92,29,4,0,0);break;
        case 5: ks0108_circle(32,29,4,0,0);ks0108_circle(44,29,4,0,0);ks0108_circle(56,29,4,0,0);ks0108_circle(68,29,4,0,0);ks0108_circle(80,29,4,0,0);ks0108_circle(92,29,4,1,1);break;
    }
}

int main (void)
{
    FSFILE *yazi;

    float sicaklik;
    int yil,ay,gun,haftagun,saat,dakika,saniye;
    int pre_saniye;

    TRISA=0x80;
    TRISB=0x00;
    TRISE=0x00;
    ks0108_init();

    // SDIN -> RP4 olmalı
    // SDOT -> RP12
    // SCLK -> RP3

    _RP3R=8;
    _RP12R=7;
    _SDI1R = 4;

    // RTC ayarları yapılıyor
    RTC_init(9,2,11,4,20,42,5);

    ks0108_text(20,1,"Karti Takiniz..",1,1);
    // Kartın takılı olup olmadığı kontrol ediliyor
    // Kart takılı ise SD_CD pini sıfır olmalıdır
    while (!MDD_MediaDetect());

    ks0108_fill(0);
    // SD/MMC kart için ilk ayarlamalar yapılıyor
    while (!FSInit());

    LATAbits.LATA1=1;

    ks0108_text(1,1,"FxDev-1.TXT",1,1);
    ks0108_line(1,9,60,9,1);
    yazi=FSfopen ("FxDev-1.TXT","r");
    FSfread (receiveBuffer1, 120, 1, yazi);
    while(FSfclose (yazi));
    ks0108_text(1,11,receiveBuffer1,1,1);

    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
    ks0108_fill(0);

    ks0108_text(1,1,"FxDev-2.TXT",1,1);
    ks0108_line(1,9,60,9,1);
    yazi=FSfopen ("FxDev-2.TXT","r");
    FSfread (receiveBuffer2, 120, 1, yazi);
    while(FSfclose (yazi));
    ks0108_text(1,11,receiveBuffer2,1,1);

    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
    ks0108_fill(0);

    ks0108_text(1,1,"FxDev-3.TXT",1,1);
    ks0108_line(1,9,60,9,1);
    yazi=FSfopen ("FxDev-3.TXT","r");
    FSfread (receiveBuffer3, 120, 1, yazi);
    while(FSfclose (yazi));
    ks0108_text(1,11,receiveBuffer3,1,1);

    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
    ks0108_fill(0);

    FSchdir ("\\");
    // FxDev-3.TXT'yi silelim
    while(FSremove ("FxDev-3.TXT"));

    ks0108_text(1,1,"Dosya Silindi",1,1);

    LATAbits.LATA0=1;       // Buraya kadar her şey yolundaysa LATA0'a bağlı led yanacak

    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);
    DelayMs(250);DelayMs(250);DelayMs(250);DelayMs(250);

    yazi=FSfopen("DATA.TXT", "w");    // Data Logs.TXT adında bir text dosyası açılıyor

    if (yazi == NULL)
    {
        ks0108_text(1,9,"DATA.TXT Yaratilamadi",1,1);
        while(1);
    }
    else
    {
        ks0108_text(1,9,"DATA.TXT Olusturuldu",1,1);
    }

    FSfwrite(sendBuffer1, 1, strlen(sendBuffer1), yazi);
    FSfwrite(sendBuffer2, 1, strlen(sendBuffer2), yazi);
    FSfwrite(sendBuffer3, 1, strlen(sendBuffer3), yazi);
    FSfclose (yazi);

    ks0108_text(1,17,"Kayit Basladi",1,1);

    RTC_read(&#038;gun,&#038;ay,&#038;yil,&#038;haftagun,&#038;saat,&#038;dakika,&#038;saniye);
    pre_saniye=saniye;
    yazi=FSfopen ("DATA.TXT","a");

    for(;;)
    {
        RTC_read(&#038;gun,&#038;ay,&#038;yil,&#038;haftagun,&#038;saat,&#038;dakika,&#038;saniye);
        loading(saniye%6);

        if((((saniye%10)-(pre_saniye%10))==5)||(((pre_saniye%10)-(saniye%10))==5))
        {
            pre_saniye=saniye;
            sicaklik=ds18b20_read();
            sprintf(sendBuffer4,"%0.2d/%0.2d/%0.2d\t%0.2d:%0.2d:%0.2d\t%3.1f\r\n", gun,ay,yil,saat,dakika,saniye,sicaklik);
            FSfwrite(sendBuffer4, 1, strlen(sendBuffer4), yazi);
            LATAbits.LATA1^=1;      // LATA1'e bağlı led her data girişinde toggle yapacak
        }

        if(PORTAbits.RA7)
        {
            DelayMs(50);
            while(PORTAbits.RA7);
            break;
        }
    }

    LATAbits.LATA2=1;
    FSfclose (yazi);
    ks0108_text(1,34,"Kayit Sonlandi",1,1);

    for(;;);
}</pre>
<p>Yukarıdaki kodlarda görülen taralı alanların Micro SD kart ile ilgili olduğunu belirtmek isterim. Bu fonksiyonların ne işe yaradıklarını Microchip&#8217;in <strong><a href="http://ww1.microchip.com/downloads/en/AppNotes/01045b.pdf" target="_blank">01045b</a></strong> kodlu uygulama dökümanında bulabilirsiniz.<br />
Uygulamaya ait fotoğraflara aşağıdan bakabilirsiniz. Fotoğraflar cep telefonundan çekildiğinden kaliteleri düşük olabilir.<a class="lightbox"  title ="Micro SD Uygulaması - Micro SD Kart Takılması Bekleniyor" href="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_1.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_1.jpg" alt="" title="Micro SD Uygulaması - Micro SD Kart Takılması Bekleniyor" width="453" height="254" class="aligncenter size-full wp-image-925" /></a><a class="lightbox"  title ="Micro SD Uygulaması - "fxdev-1.txt" Dosyası İçeriği" href="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_2.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_2.jpg" alt="" title="Micro SD Uygulaması - &quot;fxdev-1.txt&quot; Dosyası İçeriği" width="450" height="252" class="aligncenter size-full wp-image-926" /></a><a class="lightbox"  title ="Micro SD Uygulaması - "fxdev-2.txt" Dosyası İçeriği" href="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_3.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_3.jpg" alt="" title="Micro SD Uygulaması - &quot;fxdev-2.txt&quot; Dosyası İçeriği" width="450" height="252" class="aligncenter size-full wp-image-927" /></a><a class="lightbox"  title ="Micro SD Uygulaması - "fxdev-3.txt" Dosyası İçeriği" href="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_4.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_4.jpg" alt="" title="Micro SD Uygulaması - &quot;fxdev-3.txt&quot; Dosyası İçeriği" width="450" height="252" class="aligncenter size-full wp-image-928" /></a><a class="lightbox"  title ="Kayıt Anı, Sıcaklıklar Kaydediliyor" href="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_5.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_5.jpg" alt="" title="Kayıt Anı, Sıcaklıklar Kaydediliyor" width="450" height="252" class="aligncenter size-full wp-image-929" /></a><a class="lightbox"  title ="Kayıt İşlemi Sonu" href="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_6.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/02/MicroSD_6.jpg" alt="" title="Kayıt İşlemi Sonu" width="450" height="252" class="aligncenter size-full wp-image-930" /></a></p>
<p><strong>Bitirirken..</strong><br />
FxDev.org&#8217;un en uzun teknik yazısını bitirirken SD/MMC, FAT ve data logger konularına değinmeye ve anlatmaya çalışırken bunu özellikle cluster şöyledir, buna bu kadar veri yollanmalıdır, cevap şu alınmalıdır tarzı açıklamalarla kafa bulandırmamaya, en kısa yoldan SD/MMC karta FAT dosya sistemiyle veri yazma/okuma işlemlerinin nasıl yapıldığını anlatmaya çalıştım. </p>
<p>Son olarak Chan FatFs tutkunları için de ARM çalışmalarıma başladığımda bir uygulama yapmak istediğimi söyleyerek herkese çalışmalarında başarılar diler, her türlü soruyu yorum bölümüne beklerim.</p>
<p><em>Dip Not: Çalışmada <a href="http://www.expkits.com" target="_blank">ExpKits</a> firmasının EX33DS adlı geliştirme kiti ile PIC24FJ256GB110 mikrodenetleyici kartı kullanılmıştır. </em></p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/sdmmc-kart-ve-data-logger-uygulamasi/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/sdmmc-kart-ve-data-logger-uygulamasi/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Teoriden Gerçeğe: Goertzel Algoritması (Vol. II)</title>
		<link>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-ii/</link>
		<comments>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-ii/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 22:56:44 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[18f]]></category>
		<category><![CDATA[24f]]></category>
		<category><![CDATA[algoritması]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[fft]]></category>
		<category><![CDATA[frekans]]></category>
		<category><![CDATA[goertzel]]></category>
		<category><![CDATA[harmonik]]></category>
		<category><![CDATA[kod]]></category>
		<category><![CDATA[örnekleme]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=908</guid>
		<description><![CDATA[Daha önceki yazımda teorisinden bahsedip, bilgisayar ortamında örneklerini yaptığım Goertzel Algoritmasını bugün en sonunda gerçeğe dökebildim. Uygulamada temel bileşen ile (50Hz) özellikle elektrik ve güç elektroniği ile ilgilenenlerin başını sıkça ağrıtan ilk 10 harmoniği (150-250-350-450-550-650-750-850-950-1050) algılamaya çalıştım. Yaptığım uygulama ayrıca PIC24F serileri ile örnek alımını ve bu serilerin ADC ve Timer birimlerini öğrenmek isteyenlere güzel [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Continuous to Discrete" href="http://www.fxdev.org/wp-content/uploads/2011/01/Cont.to_.Disc.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Cont.to_.Disc.png" alt="" title="Continuous to Discrete" width="250" height="200" class="alignright size-full wp-image-905" /></a>Daha önceki <a href="http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/" target="_blank"><strong>yazımda</strong></a> teorisinden bahsedip, bilgisayar ortamında örneklerini yaptığım Goertzel Algoritmasını bugün en sonunda gerçeğe dökebildim. </p>
<p>Uygulamada temel bileşen ile (50Hz) özellikle elektrik ve güç elektroniği ile ilgilenenlerin başını sıkça ağrıtan ilk 10 harmoniği (150-250-350-450-550-650-750-850-950-1050) algılamaya çalıştım. Yaptığım uygulama ayrıca PIC24F serileri ile örnek alımını ve bu serilerin ADC ve Timer birimlerini öğrenmek isteyenlere güzel bir örnek teşkil edeceğini düşünüyorum.<span id="more-908"></span></p>
<p>Yaptığım uygulamaya ait blok diyagram aşağıda görülebilir.<a class="lightbox"  title ="Goertzel Block Diagram" href="http://www.fxdev.org/wp-content/uploads/2011/01/GOERTZEL.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/GOERTZEL.png" alt="" title="Goertzel Block Diagram" width="637" height="392" class="aligncenter size-full wp-image-910" /></a>Yukarıdaki blok diyagramın görevini yerine getiren kodu aşağıda görebilirsiniz.</p>
<pre class="brush: c; highlight: [19];">/*
 * Yazar: Fırat Deveci (FxDev)
 * Konu : Goertzel Algoritması
 */

#include "p24FJ64GA002.h"
#include "math.h"

_CONFIG1(JTAGEN_OFF &#038; GCP_OFF &#038; GWRP_OFF &#038; BKBUG_OFF &#038; COE_OFF &#038; ICS_PGx1 &#038; FWDTEN_OFF &#038; WINDIS_OFF);
_CONFIG2(IESO_OFF &#038; SOSCSEL_LPSOSC &#038; WUTSEL_FST &#038; FNOSC_FRCPLL &#038; FCKSM_CSDCMD &#038; OSCIOFNC_OFF &#038; IOL1WAY_OFF &#038; I2C1SEL_PRI &#038; POSCMOD_NONE)

#define Fs              5000            // Örnekleme frekansımız, izleyeceğimiz en yüksek frekans değerinin en az iki katı
#define BINS            11              // 11 temel frekans izlenecek
#define Pi              3.141592654     // Pi sayısı tanımlanıyor
#define GOERTZEL_N      100             // 128 örnek alınacak
#define Level_Segment   7
#define divider         16000000/Fs

const int   freqs    [BINS] = {50, 150, 250, 350, 450, 550, 650, 750, 850, 950, 1050};
float       samples  [GOERTZEL_N];

float       coeffs   [BINS];
float       prev1    [BINS];
float       prev2    [BINS];
float       magnitude[BINS];
int         levels   [BINS];
float       n        [GOERTZEL_N];

unsigned char sample_counter    = 0;
unsigned char sample_complete   = 0;

void timer2_init(void)
{
    // 16Mhz/ftimer=PR2 olmalı.
    PR2                 = divider;
    T2CON               = 0x0000;     // 1:1, Fosc/2
    IPC1bits.T2IP       = 6;          // Kesme öncelik sırası 6
    IFS0bits.T2IF       = 0;          // Timer1 kesme bayrağı temizleniyor
    IEC0bits.T2IE       = 1;          // Timer1 kesmesi aktif
    T2CONbits.TON       = 1;          // Timer1 açılıyor
}

void ADC_init(void)
{
    AD1PCFG             = 0xFFFC;       // AN0 ve AN1 ADC portu, diğer AN portları digital I/O
    AD1CON2             = 0x0000;       // AVdd ve AVss seçildi, 28pinli modeller için bunlar zaten VDD ve VSS'ye bağlı
    AD1CON3bits.ADRC    = 0;            // Tcy kullanılacak
    AD1CON3bits.SAMC    = 3;            // Minimum Tad süresi 75ns'den büyük seçilmeli, 32MHz kristal için Tcy=62.5ns, bu değer için 2 yeterlidir
    AD1CON3bits.ADCS    = 2;            // ADCS=(Tad/Tcy)-1 şeklinde seçilir
    AD1CON1             = 0x00E0;       // Atomatik örnekleme ve çevrim yapılacak, ASAM yada SAMP bitine emirle çevrim başlayacak
    AD1CSSL             = 0x0000;       // Auto tarama yapılmayacak
    AD1CON1bits.ADON    = 1;            // ADC açılıyor
}

int ADC_read(unsigned char channel)
{
    AD1CHS              = channel;
    AD1CON1bits.DONE    = 0;
    AD1CON1bits.SAMP    = 1;           // Çevrim başlama komutu veriliyor
    while(AD1CON1bits.SAMP);
    while(!AD1CON1bits.DONE);          // Çevrimin bitmesi bekleniyor

    return ADC1BUF0;
}

// Goertzel için katsayılar hesaplanıyor

void coefficient(void)
{
    unsigned int k, i;
    for(i=0;i < BINS;i++)
    {
        k           =(unsigned int)(0.5 + (float)GOERTZEL_N * freqs[i] / Fs);
        coeffs[i]   = 2.0 * cos(2.0 * Pi * ((float)k/GOERTZEL_N));
    }
}

int goertzel(void)
{
    int big =0,
        i   =0;
    float val = 0,
          max = 0;

    // Geçici dizilerin içerisi temizleniyor
    for(i=0;i < BINS;i++)
    {
        prev2[i]=0;
        prev1[i]=0;
    }

    // GOERTZEL Algoritması İşletiliyor
    for(sample_counter=0;sample_counter < GOERTZEL_N; sample_counter++)
    {
        for(i=0;i < BINS;i++)
        {
            val     = coeffs[i] * prev1[i] - prev2[i] + (float)samples[sample_counter];
            prev2[i]= prev1[i];
            prev1[i]= val;
        }
    }

    // Genlikler belirleniyor
    for(i=0;i < BINS;i++)
    {
        magnitude[i] = (prev1[i] * prev1[i]) + (prev2[i] * prev2[i]) - (coeffs[i] * prev1[i] * prev2[i]);
        if(magnitude[i]>max)
        {
            max=magnitude[i];
            big=i;
        }
    }

    for(i=0;i < BINS;i++)
    {
        levels[i]=(int)(Level_Segment*(float)(magnitude[i]/max));
    }

    return big;
}

int main(void)
{
    CLKDIV=0;
    TRISB=0x0000;

    lcd_init();

    coefficient();
    ADC_init();
    timer2_init();

    lcd_gotoxy(2,1);
    lcd_yaz("FxDev.org");

    for(;;)
    {
        if(sample_complete)
        {
            goertzel();     // Goertzel hesaplanıyor
            lcd_gotoxy(1,1);
            veri_yolla(levels[0]);
            veri_yolla(levels[1]);
            veri_yolla(levels[2]);
            veri_yolla(levels[3]);
            veri_yolla(levels[4]);
            veri_yolla(levels[5]);
            veri_yolla(levels[6]);
            veri_yolla(levels[7]);
            veri_yolla(levels[8]);
            veri_yolla(levels[9]);
            veri_yolla(levels[10]);
            sample_complete = 0;
            sample_counter  = 0;
            IEC0bits.T2IE   = 1;
            T2CONbits.TON   = 1;
        }

    }
}

void __attribute__((__interrupt__, auto_psv)) _T2Interrupt(void)
{
    samples[sample_counter++]=(ADC_read(0)-512);
    if(sample_counter==GOERTZEL_N)
    {
        IEC0bits.T2IE   = 0;
        T2CONbits.TON   = 0;
        sample_complete = 1;
    }
    IFS0bits.T2IF = 0;
}</pre>
<p>Yukarıdaki kodun daha önce <a href="http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/" target="_blank"><strong>burada</strong></a> anlattığım C kodlarıyla ne kadar fazla benzerlik gösterdiğini görebilirsiniz.<br />
Uygulamaya ait çalışma videosunu aşağıda seyredebilirsiniz.<br />
<p><a href="http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-ii/"><em>Click here to view the embedded video.</em></a></p></p>
<p>Bir başka çalışmada görüşmek üzere.<br />
Herkese kolay gelsin.</pre>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-ii/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-ii/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>PIC24Fxx ve RTC ile Analog Saat</title>
		<link>http://www.fxdev.org/pic24fxx-ve-rtc-ile-analog-saat/</link>
		<comments>http://www.fxdev.org/pic24fxx-ve-rtc-ile-analog-saat/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 00:10:17 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[analog]]></category>
		<category><![CDATA[clock]]></category>
		<category><![CDATA[glcd]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[pic24f]]></category>
		<category><![CDATA[register]]></category>
		<category><![CDATA[rtc]]></category>
		<category><![CDATA[saat]]></category>
		<category><![CDATA[trigonometri]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=881</guid>
		<description><![CDATA[Daha önceden tezim için öğrenmeye başladığım PIC24Fxx serisi ile ne zamandır yapmak istediğim GLCD ve analog saat uygulamasını en sonunda gerçekleştirdim ve bir &#8216;oh!&#8217; çektim. Yazılım ya da mesleki diğer hobilerle uğraşanların bu &#8216;oh!&#8217; dan kastımın ne olduğunu anladıklarını varsayıyorum. RTC birimi ve uygulamamı anlatmadan önce daha önceki yazımda değinemediğim &#8216;neden 24F&#8217; sorusunun cevabını çok [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Analog_Saat" href="http://www.fxdev.org/wp-content/uploads/2010/12/Analog_Saat.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2010/12/Analog_Saat.jpg" alt="" title="Analog_Saat" width="300" height="165" class="alignright size-full wp-image-883" /></a>Daha önceden tezim için öğrenmeye başladığım PIC24Fxx serisi ile ne zamandır yapmak istediğim GLCD ve analog saat uygulamasını en sonunda gerçekleştirdim ve bir &#8216;oh!&#8217; çektim. Yazılım ya da mesleki diğer hobilerle uğraşanların bu &#8216;oh!&#8217; dan kastımın ne olduğunu anladıklarını varsayıyorum.<br />
RTC birimi ve uygulamamı anlatmadan önce daha önceki yazımda değinemediğim &#8216;neden 24F&#8217; sorusunun cevabını çok kısa vermek istiyorum; PIC&#8217;ler bilindiği gibi çoğu uygulamada &#8216;kullanıcı dostu&#8217; olduğundan tercih edilirler. 24F serisi de PIC ile haşır neşir olanlar için, bana göre, oldukça uygun bir üst seçenek. <span id="more-881"></span>Öncelikle 16F ve 18F&#8217;lerde olduğu gibi Fcy=Fosc/4 yerine Fcy=Fosc/2 (Atmega&#8217;cıların şimdiden gülümsediklerini hissediyorum) olarak kullanılıyor. Bu da aynı kristal değerinde iki kat hız demek. Ayrıca bir çok serisinde güç elektroniği veya sinyal işleme için özelleştirilmiş birimlerin yanında bu yazımın konusu da olan dahili RTC birimine sahipler. Yine çoğu modelde PWM çözünürlükleri 16bit, ADC çevrim hızları 500ksps ve üzerinde.<br />
<h4><span style="text-decoration: underline;">PIC24F ve RTC Birimi</span></h4>
<p>Bu uygulamamda kullandığım <strong>PIC 24FJ256GB110</strong>&#8216;nun dahili RTC&#8217;sini kullanmak için öncelikle bir kaç adımı uygulamamız gerekiyor. Bunlardan ilki RTC registerlerine yazım izni vermek ile alakalı. Bu özellikle yazılım güvenliği için çok hoş bir uygulama, çünkü üreticiler genelde RTC&#8217;yi fabrika çıkışında bir kez ayarlayıp, ayarladıkları bu RTC değerinin hiç bir koşulda değişmemesini isteyebilirler. Buradan da garanti süresi veya daha çeşitli bilgilere çok kolay erişim sağlayabilirler. Bu özelliği ortadan kaldıran assembly kod öbeğini aşağıda verdiğim kodda görmeniz mümkün.<br />
Daha sonraki işlem ise daha önceki RTC&#8217;lerde karşılaşmadığım türden. Örneğin biz 10/01/1988 pazartesi saat 23:50:05&#8242;i RTC&#8217;mize girmek isteyelim. Bu noktada PIC&#8217;in datasheet&#8217;ini açıp register yapılarına baktığımızda bizden istenen sayı yapısının sırayla aşağıdaki gibi olduğu görülebilir.<center>10 -> 0&#215;10<br />
01 -> 0&#215;01<br />
88 -> 0&#215;88<br />
Pzt-> 0&#215;01<br />
23 -> 0&#215;23<br />
50 -> 0&#215;50<br />
05 -> 0&#215;05</center>Yukarıdan da görüleceği üzere girilecek sayılar sanki 16 tabanındaymış gibi kabul görmektedir. Okurken de aynı şekilde ters çevrim yaparak bilgiye ulaşmak mümkün olmaktadır. Bu konuda ayrıntılı bilgiyi yazdığım koddaki yorum kısımlarında bulabilirsiniz.<br />
Bu bölümü kapamadan önce 24F&#8217;in içerisindeki RTC&#8217;nin alarm özelliği olduğunu ve istendiğinde RTC çıkış bacağı üzerinden istenilen aletin istenilen saatte çalışmasının sağlanabileceğini söylemek isterim. Ben bu uygulamamda bu bacağı saniye çıkışı olarak kullanıp bir ledin yanıp söndürülmesini sağladım.</p>
<h4><span style="text-decoration: underline;">GLCD ve Analog Saat Uygulaması</span></h4>
<p><a class="lightbox"  title ="Trigonometri" href="http://www.fxdev.org/wp-content/uploads/2010/12/Trigonometri.png"><img src="http://www.fxdev.org/wp-content/uploads/2010/12/Trigonometri.png" alt="" title="Trigonometri" width="244" height="260" class="alignleft size-full wp-image-882" /></a>Analog saatler küçüklüğümden beri hep ilgimi çekmiştir. Özellikle <a href="http://dergi.picproje.org/pic18f452-ccs-c-analog-saat-glcd-320x240" target="_blank"><strong>buradaki</strong></a> uygulamayı gördükten sonra &#8216;bunu neden her yerde bulunabilecek GLCD&#8217;lere uygulamayayım&#8217; diye düşünürken bugün en sonunda aşağıda videosunu görebileceğiniz uygulamamı gerçekleştirdim.<br />
Öncelikle oluşturulan saatin piksel sayısının düşüklüğü dolayısı ile çok da hoş görünmediğini fakat benim için yeterli olduğunu söylemek isterim. Ayrıca uygulamamda ortaokulda gördüğümüz trigonometrik denklemleri kullandığımı da belirtmek isterim.<br />
Bunun için yanda görülebilecek birim çemberden yola çıkıp istenilen saniye, dakika, saat değeri için istenilen koordinatlar çok kolay bir şekilde bulunabilir. Örnek bir hesabı sizler için yaparsam:<br />
360derece/60saniye=6 derece/saniye yapar. Buradan her saniyede 6 derece katedileceği görülebilir.<br />
GLCD&#8217;mizin x=31 ve y=31 noktası için düşünürsek 1. saniye için değerler; x=31+28*(cos(pi/2-pi*saniye/30)), y=31-28*(sin(pi/2-pi*saniye/30)) olur. Buradaki 28 ise saniye çubuğunun uzunluğudur. Aynı şekilde düşünülerek akrep ve yelkovan da çok kolay bir şekilde oluşturulabilir.<br />
Tüm bunları ele aldığımızda oluşan uygulamaya ait videoyu aşağıdan seyredebilirsiniz.<p><a href="http://www.fxdev.org/pic24fxx-ve-rtc-ile-analog-saat/"><em>Click here to view the embedded video.</em></a></p>Yukarıdaki videoya ait kodları ise aşağıda bulabilirsiniz.<br />
Üzeri çizili olarak görülebilecek &#8220;ks0108.h&#8221; kütüphanesini PIC kitabımın içerisinde bulabilir ya da kendi yazdığınız GLCD kütüphanenizi kullanabilirsiniz.
<pre class="brush: c; highlight: [11];">/*
 * Yazar                : FxDev - Fırat DEVECİ
 * Konu                 : RTC ve GLCD uygulaması
 * Yazar WEB Sitesi     : www.fxdev.org
 */

#include "p24Fxxxx.h"
#include "math.h"
#include "stdio.h"
#include "delay.h"
#include "ks0108.h"

_CONFIG3(WPCFG_WPCFGDIS &#038; WPDIS_WPDIS)
_CONFIG2(IESO_OFF &#038; FNOSC_FRC &#038; FCKSM_CSDCMD &#038; OSCIOFNC_OFF &#038; IOL1WAY_ON &#038; DISUVREG_OFF &#038; POSCMOD_XT)
_CONFIG1(JTAGEN_OFF &#038; GCP_OFF &#038; GWRP_OFF &#038; BKBUG_OFF &#038; COE_OFF &#038; ICS_PGx1 &#038; FWDTEN_OFF &#038; WINDIS_OFF)

#define pi 3.1416

char saat_bilgisi[2]="";

int pre_saniye,
    pre_dakika,
    pre_saat,
    pre_gun,
    pre_ay,
    pre_yil;

int s_x,s_y,s_xx,s_yy,
    m_x,m_y,m_xx,m_xxx,m_yy,m_yyy,
    h_x,h_y,h_xx,h_yy,h_xxx,h_yyy;

void tarih_saat_yaz(int saat, int dakika, int saniye, int gun, int ay, int yil)
{
    if(pre_saniye!=saniye)
    {
        sprintf(saat_bilgisi,"%02d",pre_saniye);
        ks0108_text(104,9,saat_bilgisi,1,0);
        sprintf(saat_bilgisi,"%02d",saniye);
        ks0108_text(104,9,saat_bilgisi,1,1);
        ks0108_line(s_xx,s_yy,s_x,s_y,0);
        pre_saniye=saniye;
    }
    if(pre_dakika!=dakika)
    {
        sprintf(saat_bilgisi,"%02d",pre_dakika);
        ks0108_text(87,9,saat_bilgisi,1,0);
        sprintf(saat_bilgisi,"%02d",dakika);
        ks0108_text(87,9,saat_bilgisi,1,1);
        ks0108_line(m_xx,m_yy,m_x,m_y,0);
        ks0108_line(m_xxx,m_yyy,m_x,m_y,0);
        pre_dakika=dakika;
    }
    if(pre_saat!=saat)
    {
        sprintf(saat_bilgisi,"%02d",pre_saat);
        ks0108_text(70,9,saat_bilgisi,1,0);
        sprintf(saat_bilgisi,"%02d",saat);
        ks0108_text(70,9,saat_bilgisi,1,1);
        ks0108_line(h_xx,h_yy,h_x,h_y,0);
        ks0108_line(h_xxx,h_yyy,h_x,h_y,0);
        pre_saat=saat;
    }
    if(pre_yil!=yil)
    {
        sprintf(saat_bilgisi,"%02d",pre_yil);
        ks0108_text(106,32,saat_bilgisi,1,0);
        sprintf(saat_bilgisi,"%02d",yil);
        ks0108_text(106,32,saat_bilgisi,1,1);
        pre_yil=yil;
    }
    if(pre_ay!=ay)
    {
        sprintf(saat_bilgisi,"%02d",pre_ay);
        ks0108_text(88,32,saat_bilgisi,1,0);
        sprintf(saat_bilgisi,"%02d",ay);
        ks0108_text(88,32,saat_bilgisi,1,1);
        pre_ay=ay;
    }
    if(pre_gun!=gun)
    {
        sprintf(saat_bilgisi,"%02d",pre_gun);
        ks0108_text(70,32,saat_bilgisi,1,0);
        sprintf(saat_bilgisi,"%02d",gun);
        ks0108_text(70,32,saat_bilgisi,1,1);
        pre_gun=gun;
    }
}

void RTC_init(int gun, int ay, int yil, int haftagun, int saat, int dakika, int saniye)
{
    // RTC ilk ayarlamaları //
    // 32768Hz kristal girişi açılıyor
    __builtin_write_OSCCONL(0x02);
    // RTCWREN başta kapalı gelir, bu da registerlere erişmemizi engeller
    // Aşağıdaki asm koduyla bu kilit kaldırılır
    asm volatile("disi #5");
    asm volatile("mov #0x55, w7");
    asm volatile("mov w7, _NVMKEY");
    asm volatile("mov #0xAA, w8");
    asm volatile("mov w8, _NVMKEY");
    // Bu bilgi direk datasheetten alınmıştır
    RCFGCALbits.RTCWREN=1;  // Artık registerlere yazım yapılabilir
    RCFGCALbits.RTCEN=0;    // RTC kapatılıyor
    PADCFG1bits.RTSECSEL=1; // Alarm kullanılacaksa bu bit sıfır olmalı
                            // Biz saniye çıkışını dışarı vereceğiz
    RCFGCALbits.RTCOE=1;    // Eğer PADCFG1bits.RTSECSEL=1 olursa bu bitte 1 olmak zorunda
    RCFGCALbits.RTCPTR=3;   // Yıldan itibaren değerler yüklenmeye başlayacak
                            // RTCVAL registerine her yükleme sonrasında RCFGCALbits.RTCPTR
                            // registerinin içeriği bir azalarak sırasıyla ay-gün,haftasaat-saat,dakika-saniye
                            // değerlerinin girilmesine izin verecek
                            // Alarm kurmak için de ALRMPTR bitleri aynen bu şekilde kullanılır
                            // Çok gıcık bir yöntem olduğunu bende kabul ediyorum
    // Şimdi tarih ve saat bilgilerini girelim.
    // Bir aptal uygulama daha burada bizi bekliyor
    // Örneğin ay değeri için aralıkta 0x12 girmemiz gerekiyor, yıl için de aynen 0x2009
    // Ya da gün için 0x31 0x24 gibi. Bunun neden 21,23 şeklinde yapılmadığını microchip'e sorabilirsiniz.

    gun=(gun/10)*16+gun%10;
    ay=(ay/10)*16+ay%10;
    yil=(yil/10)*16+yil%10;
    haftagun=(haftagun/10)*16+haftagun%10;
    saat=(saat/10)*16+saat%10;
    dakika=(dakika/10)*16+dakika%10;
    saniye=(saniye/10)*16+saniye%10;

    // Tüm tarih-saat bileşenleri yukarıdaki anlatılan şekle dönüştürüldü.
    // Şimdi ise registerler için bunları aşağıdaki şekilde birleştirmek gerekiyor =@
    // RTCPTR=3
    RTCVAL=yil;                 // 99 yıla kadar değer alabiliyor
    // RCFGCALbits.RTCPTR 1 azaldı, RTCPTR=2
    RTCVAL=(ay< &lt;8)+gun;         // Ay 12'ye kadar gün ise 31'e kadar yazılabilir
    // RCFGCALbits.RTCPTR 1 azaldı, RTCPTR=1
    RTCVAL=(haftagun<&lt;8)+saat;  // Haftagün 0-6, saat 23'e kadar yazılabilir
    // RCFGCALbits.RTCPTR 1 azaldı, RTCPTR=0
    RTCVAL=(dakika<&lt;8)+saniye;  // Dakika 59, saniye 59'a kadar yazılabilir

    RCFGCALbits.CAL=0;      // Kablibrasyon yapılmayacak
    RCFGCALbits.RTCEN=1;    // RTC açılacak
    RCFGCALbits.RTCWREN=0;  // RTC yazımı engellenecek, böylelikle cihaza reset atılsa da RTC çalışmasına devam edecek
                            // Elbette bizim uygulamamızda bu olmayacak
}

void RTC_read(int *gun, int *ay, int *yil, int *haftagun, int *saat, int *dakika, int *saniye)
{
    int yil_temp,ay_gun,haftagun_saat,dakika_saniye;
    while(RCFGCALbits.RTCSYNC); // Tam değişim anında okuma yapmamak için bu bitin sıfır olması bekleniyor
    RCFGCALbits.RTCPTR=3;       // Yine bu registeri 3 yaparak yıldan itibaren okumaya başlıyoruz

    yil_temp        =RTCVAL;    // RTCPTR=3 oldu
    ay_gun          =RTCVAL;    // RTCPTR=2 oldu
    haftagun_saat   =RTCVAL;    // RTCPTR=1 oldu
    dakika_saniye   =RTCVAL;    // RTCPTR=0 oldu

    *yil=((yil_temp>>4)&#038;0x0F)*10+(yil_temp&#038;0x0F);
    *ay=((ay_gun>>12)&#038;0x0F)*10+((ay_gun>>8)&#038;0x0F);
    *gun=((ay_gun>>4)&#038;0x0F)*10+(ay_gun&#038;0x0F);
    *haftagun=(haftagun_saat>>8)&#038;0x0F;
    *saat=((haftagun_saat>>4)&#038;0x0F)*10+(haftagun_saat&#038;0x0F);
    *dakika=((dakika_saniye>>12)&#038;0x0F)*10+((dakika_saniye>>8)&#038;0x0F);
    *saniye=((dakika_saniye>>4)&#038;0x0F)*10+(dakika_saniye&#038;0x0F);
}

int main(void)
{
    int saniye=59,
        dakika=15,
        saat=11,
        haftagun,
        gun=10,
        ay=1,
        yil=88;

    TRISB=0x00;
    TRISE=0x00;

    ks0108_init();
    RTC_init(16,12,10,1,20,36,50);

    ks0108_circle(31,31,30,0,1);
    ks0108_circle(31,31,5,1,1);
    ks0108_line(30,0,30,2,1);       // 12 çizgisi
    ks0108_line(30,60,30,62,1);     // 6 çizgisi
    ks0108_line(0,30,2,30,1);       // 9 çizgisi
    ks0108_line(60,31,62,31,1);     // 3 çizgisi

    ks0108_text(70,0,"Saat",1,1);
    ks0108_text(70,9,"  :  :  ",1,1);
    ks0108_text(70,24,"Tarih",1,1);
    ks0108_text(70,32,"  /  /  ",1,1);
    ks0108_text(65,50,"FxDev.org",1,1);

    for(;;)
    {
        RTC_read(&#038;gun,&#038;ay,&#038;yil,&#038;haftagun,&#038;saat,&#038;dakika,&#038;saniye);
        tarih_saat_yaz(saat,dakika,saniye,gun,ay,yil);

        // Saniye okunun yönleri belirleniyor
        s_x=31+28*(cos(pi/2-pi*saniye/30));
        s_y=31-28*(sin(pi/2-pi*saniye/30));
        s_xx=31+7*(cos(pi/2-pi*saniye/30));
        s_yy=31-7*(sin(pi/2-pi*saniye/30));

        // Dakika okunun yönleri belirleniyor
        m_x     =31+25*(cos(pi/2-pi*dakika/30));
        m_y     =31-25*(sin(pi/2-pi*dakika/30));
        m_xx    =31+7*(cos(pi/2-pi*dakika/30-pi/12));
        m_yy    =31-7*(sin(pi/2-pi*dakika/30-pi/12));
        m_xxx   =31+7*(cos(pi/2-pi*dakika/30+pi/12));
        m_yyy   =31-7*(sin(pi/2-pi*dakika/30+pi/12));

        // Saat okunun yönleri belirleniyor
        if(saat>12)saat-=12;
        h_x     =31+19*(cos(pi/2-pi*((saat*5)+dk/12)/30));
        h_y     =31-19*(sin(pi/2-pi*((saat*5)+dk/12)/30));
        h_xx    =31+7*(cos(pi/2-pi*((saat*5)+dk/12)/30-pi/12));
        h_yy    =31-7*(sin(pi/2-pi*((saat*5)+dk/12)/30-pi/12));
        h_xxx   =31+7*(cos(pi/2-pi*((saat*5)+dk/12)/30+pi/12));
        h_yyy   =31-7*(sin(pi/2-pi*((saat*5)+dk/12)/30+pi/12));

        ks0108_line(s_xx,s_yy,s_x,s_y,1);
        ks0108_line(m_xx,m_yy,m_x,m_y,1);
        ks0108_line(m_xxx,m_yyy,m_x,m_y,1);
        ks0108_line(h_xx,h_yy,h_x,h_y,1);
        ks0108_line(h_xxx,h_yyy,h_x,h_y,1);
    }
}</pre>
<p>Konuyla ilgili her türlü soruyu bana yorum bölümünden iletebilirsiniz.<br />
Herkese çalışmalarında başarılar dilerim.</p>
<p><em>* Müzik: Gülden Gökşen &#8211; Türkicaz</em><br />
<em>* Uygulamanın gerçekleştirildiği ExpKits EX33DS geliştirme kartı için <a href="http://www.expkits.com/" target="_blank"><strong>ExpKits</strong></a>&#8216;e teşekkürler.</em></p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/pic24fxx-ve-rtc-ile-analog-saat/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/pic24fxx-ve-rtc-ile-analog-saat/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Bir Klasik: Kayan Yazı V2</title>
		<link>http://www.fxdev.org/bir-klasik-kayan-yazi-v2/</link>
		<comments>http://www.fxdev.org/bir-klasik-kayan-yazi-v2/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 18:39:41 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[kayan]]></category>
		<category><![CDATA[kayan yazı]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[marquee]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[tabela]]></category>
		<category><![CDATA[yazı]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=852</guid>
		<description><![CDATA[Gün geçtikçe çevremizde uygulaması artan, reklam, tanıtım aracı olarak sıkça kullanılmaya başlayan LED tabelalar, kayan yazılar konusuna burada biraz değinmiş, bir simülasyon videosu koymuştum. Aradan uzunca bir zaman geçmesine karşın bugün bölümümde teknik çizim ödevi alan öğrencilerin ve Mutlu Boztepe&#8216;nin birlikte yaptıkları devre elime geçti ve ben de fırsat budur deyip ilk denemelerimi gerçekleştirdim. Aşağıdaki [...]]]></description>
			<content:encoded><![CDATA[<p>Gün geçtikçe çevremizde uygulaması artan, reklam, tanıtım aracı olarak sıkça kullanılmaya başlayan LED tabelalar, kayan yazılar konusuna <a href="http://www.fxdev.org/bir-klasik-kayan-yazi/" target="_blank"><strong>burada</strong></a> biraz değinmiş, bir simülasyon videosu koymuştum. Aradan uzunca bir zaman geçmesine karşın bugün bölümümde teknik çizim ödevi alan öğrencilerin ve <a href="http://electronics.ege.edu.tr/boztepe" target="_blank"><strong>Mutlu Boztepe</strong></a>&#8216;nin birlikte yaptıkları devre elime geçti ve ben de fırsat budur deyip ilk denemelerimi gerçekleştirdim.<br />
Aşağıdaki videoda görebileceğiniz uygulamanın muhteşem olduğunu söyleyemem fakat bugün yolda gelirken bir kaç LED tabelasına baktığımda yaptığım demonun çok da kötü olmadığını fark ettim.<p><a href="http://www.fxdev.org/bir-klasik-kayan-yazi-v2/"><em>Click here to view the embedded video.</em></a></p><span id="more-852"></span>Uygulama ile ilgili kodlarımı <span style="text-decoration: underline;">özellikle</span> paylaşmıyorum. Bunun haricinde aklınıza takılan tüm soruları yorum kısmından bana sorabilirsiniz.<br />
Herkese iyi çalışmalar dilerim. <img src="http://www.fxdev.org/wp-content/plugins/more-smilies/Phoenity/wink.png" alt=")" class="wp-smiley" /> </p>
<p><em>*Müzik: Fullmetal Alchemist Original Soundtrack 2 &#8211; Lapis Philosophorum (Piano Solo)</em></p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/bir-klasik-kayan-yazi-v2/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/bir-klasik-kayan-yazi-v2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

