<?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; adc</title>
	<atom:link href="http://www.fxdev.org/etiket/adc/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>Teoriden Gerçeğe: Goertzel Algoritması (Vol. I)</title>
		<link>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/</link>
		<comments>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 01:39:35 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[algoritma]]></category>
		<category><![CDATA[algoritması]]></category>
		<category><![CDATA[ansi]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[dtmf]]></category>
		<category><![CDATA[fft]]></category>
		<category><![CDATA[frekans]]></category>
		<category><![CDATA[genlik]]></category>
		<category><![CDATA[goertzel]]></category>
		<category><![CDATA[matematik]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[modülasyon]]></category>
		<category><![CDATA[örnekleme]]></category>
		<category><![CDATA[teori]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=893</guid>
		<description><![CDATA[Ülkemizde özellikle &#8216;kopyala-yapıştır programcılık&#8217; mantığıyla çalışan kişi sayısının artmasından bıkan biri olarak, özellikle bir işin nasıl olması gerektiğine kendimce bir yanıt vermeyi amaçladığım bu yazı dizimde, final döneminde rastladığım, kısa notlar ve örneklerle pekiştirdiğim Goertzel algoritmasına değineceğim. Kısaca değinmek gerekirse, Dr. Gerald Goertzel’in 1958 yılında yayınladığı Goertzel algoritması sinyalin içerisindeki frekans bileşenlerini çözen dijital sinyal [...]]]></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>Ülkemizde özellikle &#8216;kopyala-yapıştır programcılık&#8217; mantığıyla çalışan kişi sayısının artmasından bıkan biri olarak, özellikle bir işin nasıl olması gerektiğine kendimce bir yanıt vermeyi amaçladığım bu yazı dizimde, final döneminde rastladığım, kısa notlar ve örneklerle pekiştirdiğim Goertzel algoritmasına değineceğim.</p>
<p>Kısaca değinmek gerekirse, Dr. Gerald Goertzel’in 1958 yılında yayınladığı Goertzel algoritması sinyalin içerisindeki frekans bileşenlerini çözen dijital sinyal işleme tekniğidir. Temel FFT algoritması tanımlı bir bant aralığındaki frekans bileşenlerini bizlere sunarken Goertzel algoritması sadece belirlenen, spesifik frekans bileşenlerini bizlere sunmaktadır.<span id="more-893"></span></p>
<p>Algoritmanın matematiksel ifadesi aşağıdadır:</p>
<p><a class="lightbox"  title ="Goertzel Algoritması Teorik" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik.jpg" alt="" title="Goertzel Algoritması Teorik" width="300" height="129" class="aligncenter size-full wp-image-895" /></a><br />
Durum diyagramı:<a class="lightbox"  title ="Goertzel Algoritması Durum Diyagramı" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-2.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-2.png" alt="" title="Goertzel Algoritması Durum Diyagramı" width="380" height="329" class="aligncenter size-full wp-image-896" /></a><br />
<strong>a) Örnekleme Oranı</strong><br />
Goertzel algoritmasında, aynen FFT’de olduğu gibi, örnekleme frekansı, belirlenmesi istenen frekansların en büyüğünün en az iki katı olmalıdır.<br />
<a class="lightbox"  title ="Goertzel Algoritması Örnekleme Frekansı" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-3.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-3.jpg" alt="" title="Goertzel Algoritması Örnekleme Frekansı" width="122" height="29" class="aligncenter size-full wp-image-897" /></a></p>
<p><strong>b) Blok Boyutu</strong><br />
Goertzel blok boyutu N aynı FFT’de olduğu gibi filtre sonucunda çıkacak frekans çözünürlüğüne etki eder. Blok boyutunu N ile temsil edersek frekans çözünürlüğü aralığı fs/N olacaktır. Örneğin örnekleme frekansı fs=8kHz, filtre uzunluğu N=100 seçilirse sonuçta çıkacak frekans çözünürlüğü 80Hz olacaktır.<br />
Blok boyutunu büyük seçmek, özellikle düşük frekans bileşenlerinin daha iyi kararlılıkla belirlenmesine yol açsa da büyük seçilen blok boyutu Goertzel algoritması hesaplamasını bir o kadar uzatacaktır. Dolayısıyla blok boyutu seçiminde bu iki kriter göz önüne alınarak optimum seçimin yapılması gerekmektedir. Son olarak seçilecek olan N değeri, FFT’nin aksine, 2’nin katları olmak zorunda değildir.</p>
<p><strong>c) Sabitler</strong><br />
Goertzel algoritmasını hesaplamadan önce Goertzel algoritmasının kullanacağı katsayıları hesaplamak işlemler sırasında algoritma çözümüne hız kazandıracaktır.<br />
<a class="lightbox"  title ="Goertzel Algoritması Katsayılar" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-4.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-4.jpg" alt="" title="Goertzel Algoritması Katsayılar" width="233" height="89" class="aligncenter size-full wp-image-898" /></a>Yukarıdaki katsayılar her bir tespit edilecek frekans için ayrı ayrı bulunur. Yukarıdaki N sayısı blok boyutunu temsil etmektedir.</p>
<p><strong>d) Temel Goertzel</strong><br />
Temel Goertzel algoritması DFT ve FFT’de olduğu gibi geriye sanal frekans bileşenlerini sunar. Genlik ve faz bilgileri geriye dönen bu sanal bileşenlerden yola çıkılarak hesaplanabilir.<br />
Geortzel algoritması hesabında Q0, Q1 ve Q2’den oluşan 3 değişken sürekli hesaplanmak zorundadır.<br />
Bu değişkenlerin başlangıç değerleri sıfır olmak koşuluyla Goertzel algoritması aşağıdaki gibi yazılabilir.<br />
<a class="lightbox"  title ="Q0,Q1 ve Q2 Değişken Hesaplamaları" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-5.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-5.jpg" alt="" title="Goertzel Algoritması Teorik-5" width="278" height="68" class="aligncenter size-full wp-image-899" /></a>                                                   </p>
<p>Yukarıdaki denklemler N kez tekrarlanır.<br />
Daha sonra ortaya çıkan Q0, Q1 ve Q2 sayıları aşağıdaki denklemlerde kullanılır.<br />
<a class="lightbox"  title ="Temel Goertzel Algoritması" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-6.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-6.png" alt="" title="Temel Goertzel Algoritması" width="314" height="130" class="aligncenter size-full wp-image-900" /></a>                             Yine bu denklemler belirlenecek frekans sayısı kadar tekrarlanarak her bir frekans için genlik değeri bulunmuş olur.</p>
<p><strong>e) Optimize Edilmiş Goertzel</strong><br />
Optimize edilmiş Goertzel algoritması faz açıları yerine sadece genliklere odaklanır ve temel Goertzel algoritmasından daha az işlem yapılmasını sağlar.<br />
Q0, Q1 ve Q2 katsayıları hesaplandıktan sonra temel Goertzel’den farklı olarak yapılması gereken tek işlem;<br />
<a class="lightbox"  title ="Genlik Hesabı I" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-7.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-7.png" alt="" title="Goertzel Algoritması Teorik-7" width="323" height="41" class="aligncenter size-full wp-image-901" /></a>Mikrodenetleyiciler ile bu işlem yapılırken genliği büyük olan işleme alınacaksa karekök alma işlemine gerek yoktur. Dolayısıyla buradan denklem aşağıdaki forma dönüşür.<a class="lightbox"  title ="Genlik Hesabı II" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-8.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-8.jpg" alt="" title="Goertzel Algoritması Teorik-8" width="313" height="29" class="aligncenter size-full wp-image-902" /></a></p>
<p><strong>f) FFT ve Goertzel Algoritmasının Karşılaştırılması</strong><br />
Yüksek sayıda örnek için FFT her ne kadar avantajlı gözükse de Goertzel düşük sayıda frekansı çözümlemek için FFT’den daha hızlıdır. Genel anlamda N blok boyutu için FFT <em>N(log2)N</em> Goertzel <em>(5/6)(log2)N</em> kadar işlem yapmaktadır.</p>
<p><strong>g) Matlab Uygulaması</strong><br />
Goertzel algoritması için her ne kadar Matlab kendi fonksiyonunu barındırsa da yukarıdaki denklemleri kullanarak yazdığımız .m kodlarını aşağıda görebilirsiniz. Aşağıdaki kodlardan da görülebileceği üzere DTMF keypad tuşlarından 3 örneklenmiştir.</p>
<pre class="brush: c; highlight: [9,31,35];">% Yazar: Fırat DEVECİ
% Konu : Goertzel Algoritması

clear all;
Fs   = 4000;           % Örnekleme frekansı
n=0:1/Fs:0.1;           % Örnek
Goertzel_N=length(n);   % Goertzel örnek sayısı

freq=[697, 770, 852, 941, 1209, 1336, 1477, 1633];  % Bulmak istediğimiz frekans bileşenleri
Bins=length(freq);                                  % Kaç adet frekans bulacağımız bilgisi
samples=sin(2*pi*697*n)+sin(2*pi*1477*n);           % Örneklediğimiz sinyal
sound(samples);                                     % Ses çalınıyor

for i=1:Bins                            % Goertzel katsayıları hesaplanıyor
    k(i)=(0.5+(Goertzel_N*freq(i))/Fs);
    coeffs(i)=2*cos(2*pi*k(i)/Goertzel_N)
end

prev1=[zeros(Bins)];
prev2=[zeros(Bins)];

for i=1:Goertzel_N                      % Hangi frekansın baskın olduğu bulunuyor
    for j=1:Bins                        % Goertzel algoritması
        val=coeffs(j)*prev1(j)-prev2(j)+samples(i);
        prev2(j)=prev1(j);
        prev1(j)=val;
    end
end

for i=1:Bins                            % Genlikler bulunuyor
    magnitude(i)=sqrt((prev1(i)*prev1(i)+prev2(i)^2)-(coeffs(i)*prev1(i)*prev2(i)));
end

freq_indices = round(freq/Fs*Goertzel_N)+1;
dft_data = goertzel(samples,freq_indices);

subplot(3,1,1);
plot(n,samples);
title('Sinyal Şekli');
subplot(3,1,2);
stem(freq,abs(magnitude));              % Ekrana basılıyor
set(gca,'xtick',freq);
xlabel('Hz');
ylabel('Magnitude');
title('Kendi Goertzel Algoritmamızın Yanıtı');
subplot(3,1,3);
stem(freq,abs(dft_data));
set(gca,'xtick',freq);
xlabel('Hz');
ylabel('Magnitude');
title('Matlab Goertzel Algoritmasının Yanıtı');</pre>
<p>Yukarıdaki kod işletildiğinde ekrana aşağıdaki şekil (üzerine tıklarsanız büyür) ortaya çıkmaktadır. Görüldüğü üzere kendi yazdığımız optimum Goertzel algoritması oldukça sağlıklı sonuç vermektedir.<a class="lightbox"  title ="Goertzel Algoritması Matlab Çıktısı" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Matlab.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Matlab.jpg" alt="" title="Goertzel Algoritması Matlab Çıktısı" width="600" height="310" class="aligncenter size-full wp-image-903" /></a><br />
<strong>h) ANSI C Uygulaması</strong><br />
Yukarıda Matlab için yaptığımız uygulamayı ANSI C ortamına taşırsak aşağıdaki kod öbeğine ulaşmış oluruz.</p>
<pre class="brush: c; highlight: [16,95];">/*
Yazar: Fırat DEVECİ
Konu : Goerzel Algoritması
*/

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

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

const int   freqs    [BINS] = {697, 770, 852, 941, 1209, 1336, 1477, 1633};
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;

// 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ı iş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()
{
    int i,buyuk;
    float a;
    coefficient();

    for(i=0;i < GOERTZEL_N;i++)
        samples[i]=sin(2*Pi*697*i/4000)+sin(2*Pi*1477*i/4000);

    buyuk=goertzel();

    printf("Yazar: Firat DEVECI\n");
    printf("Konu : Goertzel Algoritmasi\n\n");
    printf("En Buyuk Genlik: %d\n\n",buyuk);
    printf("Frekanslar      Katsayilar      Goertzel Sonucu\n");

    for(i=0;i < BINS;i++)
    {
        if(i==buyuk)
            printf("%d\tHz -    %f\t -  %d*\n",freqs[i],coeffs[i],levels[i]);
        else
            printf("%d\tHz -    %f\t -  %d\n",freqs[i],coeffs[i],levels[i]);

    }

        getch();
}</pre>
<p>Yukarıdaki kodlar herhangi bir C (Code Blocks vb.) derleyicide derlendiğinde aşağıdaki çıktı ekranı ile karşılaşılır.<a class="lightbox"  title ="Goertzel Algoritması ANSI-C" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-ANSI-C.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-ANSI-C.jpg" alt="" title="Goertzel Algoritması ANSI-C" width="394" height="193" class="aligncenter size-full wp-image-904" /></a><strong>Sonuç</strong><br />
Goertzel algoritması yukarıdaki örneklerden de görüleceği üzere anlaşılması kolay, FFT'ye göre oldukça hızlı ve özellikle düşük güçteki mikrodenetleyiciler ile kolaylıkla kullanılabilecek yapıdadır. Özellikle DTMF kod çözümleme uygulamalarında tercih edilmesinin altında bu yatmaktadır.</p>
<p>Gelecek bölüm: <em>Goertzel algoritmasının mikrodenetleyici ile gerçeklenmesi.</em></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-i/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>ARM: DAC</title>
		<link>http://www.fxdev.org/arm-dac/</link>
		<comments>http://www.fxdev.org/arm-dac/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 15:00:56 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[binary]]></category>
		<category><![CDATA[dac]]></category>
		<category><![CDATA[keil]]></category>
		<category><![CDATA[pulse]]></category>
		<category><![CDATA[sine]]></category>
		<category><![CDATA[sinüs]]></category>
		<category><![CDATA[vref]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=885</guid>
		<description><![CDATA[DAC (Digital to analog converter) herkesin bildiği üzere ADC&#8217;nin yaptığı işlevin tam tersini yapan, verilen dijital bilgiye göre analog çıkış üreten özel bir birimdir. Pulse, Binary, R2R, Oversampling, Hibrid ve bir çok DAC metodu olmasına rağmen Pulse, Binary ve R2R metotları günümüz uygulamalarında oldukça fazla tercih edilmektedir. Bu yöntemleri çok kısa açıklarsak: Pulse DAC Metodu: [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="ARM" href="http://www.fxdev.org/wp-content/uploads/2010/09/ARM.png"><img src="http://www.fxdev.org/wp-content/uploads/2010/09/ARM.png" alt="" title="ARM" width="200" height="60" class="alignleft size-full wp-image-823" /></a>DAC (Digital to analog converter) herkesin bildiği üzere ADC&#8217;nin yaptığı işlevin tam tersini yapan, verilen dijital bilgiye göre analog çıkış üreten özel bir birimdir. Pulse, Binary, R2R, Oversampling, Hibrid ve bir çok DAC metodu olmasına rağmen Pulse, Binary ve R2R metotları günümüz uygulamalarında oldukça fazla tercih edilmektedir. <a class="lightbox" title="PWM Sine Wave" href="http://www.fxdev.org/wp-content/uploads/2010/12/PWM-Sine.png"><img class="alignright size-full wp-image-886" title="PWM Sine Wave" src="http://www.fxdev.org/wp-content/uploads/2010/12/PWM-Sine.png" alt="" width="270" height="203" /></a><br />
Bu yöntemleri çok kısa açıklarsak:<br />
<strong>Pulse DAC Metodu:</strong> Günümüzde bir çok mikrodenetleyici içerisinde bulunan PWM birimi kullanılarak DAC yapmak mümkündür. Bunun için örneklenen verinin genliği, PWM sinyalinin zamanı ile orantılanır ve dijital çıkış bir filtre kullanılarak (genellikle LP) istenilen analog sinyalin üretilmesi sağlanır. Günümüzde düşük frekanslı sinyal üretmede başarılı olan bu teknik, yüksek çözünürlüklü ve frekanslı sinyal üretmede başarısız kalır.<span id="more-885"></span><br />
<a class="lightbox" title="Binary DAC" href="http://www.fxdev.org/wp-content/uploads/2010/12/Binary.png"><img class="alignleft size-full wp-image-887" title="Binary DAC" src="http://www.fxdev.org/wp-content/uploads/2010/12/Binary.png" alt="" width="270" height="155" /></a><br />
<strong>Binary DAC Metodu:</strong> Verilen herhangi bir binary sayının çözünürlüğe oranıyla çalışan bu metot yüksek frekanslı sinyaller oluşturmak için uygundur. Yalnız bu yöntemde de analog sinyaller merdiven gibi basamaklı bir şekil alacağından bu basamaklı şekli yok etmek için çıkışta yine bir filtre yapısı kullanılır. Bir çok mikrodenetleyici gibi ARM&#8217;ın da DAC birimi bu özellikle çalışmaktadır.<br />
Yaptığım uygulamada kullandığım LPC2368 DAC biriminin aşağıda özellikleri görülebilecek sadece bir adet registeri bulunmaktadır.<a class="lightbox" title="DAC Register" href="http://www.fxdev.org/wp-content/uploads/2010/12/DAC-register.png"><img class="aligncenter size-full wp-image-889" title="DAC Register" src="http://www.fxdev.org/wp-content/uploads/2010/12/DAC-register.png" alt="" width="635" height="217" /></a>Uygulamada öncelikle DAC&#8217;ın hangi hızda çalıştırılacağı belirlenir.<br />
Daha sonra DAC&#8217;ın çıkışı [(V/Vref)x1024] formülü ile bulunabilir. Değerin DAC registerine yazılmasından sonra istenilen sinyal BIAS değerine göre 1us veya 2.5us içerisinde çıkış pinine yansıtılır.<br />
Ben bu uygulamada, DAC çıkış gerilimini ADC0.0 kanalından gelen bilgi değiştirerek, bir ledin kısık ya da parlak yanmasını sağladım. Bu uygulamaya ait kodları aşağıda görebilirsiniz.</p>
<pre class="brush: c; highlight: [7];">/*
 * Yazar                : FxDev - Fırat DEVECİ
 * Konu                 : DAC Uygulaması
 * Yazar WEB Sitesi     : www.fxdev.org
 */

#include "LPC23xx.H"

unsigned int adc_read(unsigned char channel)
{
	unsigned int i;
	// ADC bloğu açılıyor
	PCONP|= (1 &lt;&lt; 12);
	// PCLK=12MHz, kanal seçimi yapılıyor
	AD0CR = 0x00200300 | ((0x01) &lt;&lt; channel); 	// A/D çevrimi başlatılıyor
    AD0CR|= 0x01000000;
    while(!(AD0GDR&amp; 0x80000000));
    i = AD0GDR; // Çevrim bilgisi okunuyor
    return ((i&gt;&gt;6) &amp; 0x03FF); // 15:6 arasındaki 10 bitlik veri ADC data
}

int main(void)
{
	int adc_1=0;
	PINSEL0=0x00000000;	// İlk 16 pin GPIO olarak ayarlanıyor
	PINSEL1=0x00214000;

	IODIR0=0xFFFFFFFF;

	for(;;)
	{
		adc_1=adc_read(0);
		DACR=adc_1&lt;&lt;6;
	}
}</pre>
<p>Uygulamaya ait resim parçalarını aşağıda görebilirsiniz.<a class="lightbox" title="ADC to DAC" href="http://www.fxdev.org/wp-content/uploads/2010/12/ADCtoDAC.png"><img class="aligncenter size-full wp-image-890" title="ADC to DAC" src="http://www.fxdev.org/wp-content/uploads/2010/12/ADCtoDAC.png" alt="" width="309" height="394" /></a>ARM&#8217;ın DAC&#8217;ını kullanmak yukarıdan da görülebileceği gibi oldukça basittir. DAC birimi kullanılarak ses, ve görüntü uygulamalarının yanında özellikle dijital kontrolde de oldukça fazla kullanılabilir.</p>
<h3>2010&#8242;u geride bırakırken&#8230;</h3>
<p><em> Bu yazımı da kapamadan önce herkesin yeni yılını kutlar, sevdikleriyle iyi ve sağlıklı bir yıl geçirmesini dilerim.<br />
2011&#8242;de de FxDev.org&#8217;da buluşmak üzere&#8230;</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/arm-dac/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/arm-dac/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>3-Wire Keypad</title>
		<link>http://www.fxdev.org/3-wire-keypad/</link>
		<comments>http://www.fxdev.org/3-wire-keypad/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 22:09:02 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[3]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[atmega]]></category>
		<category><![CDATA[atmega16]]></category>
		<category><![CDATA[atmega8]]></category>
		<category><![CDATA[debounce]]></category>
		<category><![CDATA[kablo]]></category>
		<category><![CDATA[keypad]]></category>
		<category><![CDATA[lcd]]></category>
		<category><![CDATA[wire]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=813</guid>
		<description><![CDATA[Her gün kullandığımız, fakat hiç bir zaman önemsemediğimiz bir araç keypad. Özellikle telefonlarda ve şu ara moda olan otomatik yiyecek makinelerinde kullanılan bu aracı biz elektronikçiler de oldukça fazla kullanıyoruz, elbette teknik anlamda. Öncelikle 8051 derslerimde kullandığım keypad&#8217;i hep 7 ya da özel entegresiyle birlikte 4-5 kabloyla kullandım. Yaptığım son projede ise debounce ayarını yanlış [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="3-Wire" href="http://www.fxdev.org/wp-content/uploads/2010/09/3-Wire.png"><img src="http://www.fxdev.org/wp-content/uploads/2010/09/3-Wire.png" alt="" title="3-Wire" width="200" height="207" class="alignright size-full wp-image-815" /></a>Her gün kullandığımız, fakat hiç bir zaman önemsemediğimiz bir araç keypad.<br />
Özellikle telefonlarda ve şu ara moda olan otomatik yiyecek makinelerinde kullanılan bu aracı biz elektronikçiler de oldukça fazla kullanıyoruz, elbette teknik anlamda.<br />
Öncelikle 8051 derslerimde kullandığım keypad&#8217;i hep 7 ya da özel entegresiyle birlikte 4-5 kabloyla kullandım. Yaptığım son projede ise debounce ayarını yanlış hesapladığım için işverenden oldukça fazla şikayet alıp, bir daha gerekmedikçe kullanmamaya dikkat ettim. Fakat bugün, hem de picbasic ile ilgili bir sitede, öyle bir şey gördüm ki bununla ilgili bir örnek yapmadan duramadım.<span id="more-813"></span><a class="lightbox"  title ="3-Wire Keypad" href="http://www.fxdev.org/wp-content/uploads/2010/09/3-Wire-Keypad.png"><img src="http://www.fxdev.org/wp-content/uploads/2010/09/3-Wire-Keypad.png" alt="" title="3-Wire Keypad" width="600" height="320" class="aligncenter size-full wp-image-814" /></a>Yukarıdaki şema incelendiğinde (üzerine basarsanız büyür) 5V&#8217;luk gerilim 1kΩ&#8217;luk dirençler sayesinde 1V aralıklarla bölünüp bunlar keypad&#8217;e girilmiş ve 100kΩ&#8217;lık dirençler üzerinden Atmega16&#8242;nın 3 ADC kanalına ulaşılmıştır. Butonlara basıldığında oluşacak gerilim değişimini minimum seviyede tutmak için çıkışlarda 100kΩ&#8217;luk direnç kullanılmıştır. 7 kablo kullanıldığında uyguladığımız tarama mantığının benzerini yazdığım kodlarda görebilirsiniz.</p>
<p><b>3-Wire Keypad Örneğii:</b></p>
<pre class="brush: c">/* **** www.FxDev.org ****
 * 3-Wire Keypad Demo Code
 */
#include "avr/io.h"
#include "lcd.h"
#include "avr/interrupt.h"

#define ADC_REF_AREF 0x00
#define ADC_REF_AVCC 0x40
#define ADC_REF_INT  0xC0

#define dEBOUNCE	50		// dEBOUNCE süresi kaç milisaniye olacak
#define BEKLEME		1200	// Bu sabit tuşlara basılı olduğunda kaç saniye sonra tuşun aktif olacağını belirtir

unsigned char 	ADC_REF_TYPE;
volatile int 	dbtmr=-1,
				menugecis=0;

ISR(TIMER1_OVF_vect)	// Timer1 taşma kesmesi
{
	TCNT1=0xFF83;	// TCNT1, 16 bitlik registerine 64286 yükleniyor

	if(dbtmr>=0) 		dbtmr++;
	if(menugecis>0) 	menugecis--;
}

void adc_init(unsigned char ADC_REF)
{
	ADCSRA = 0x87;
	ADC_REF_TYPE = ADC_REF;
}

unsigned int read_adc(unsigned char adc_channel)
{
	ADMUX = ADC_REF_TYPE | adc_channel;
	ADCSRA |= 0x40;
	while (ADCSRA &#038; 0x40);
	return ADC;
}

unsigned char keypad(void)
{
	unsigned int gerilim=0;
	unsigned char key='\n';

	gerilim=read_adc(0);
	if(gerilim>100 &#038;&#038; gerilim< =256) key= '*';
	if(gerilim>256 &#038;&#038; gerilim< =512) key= '7';
	if(gerilim>512 &#038;&#038; gerilim< =768) key= '4';
	if(gerilim>768) 		 key= '1';

	gerilim=read_adc(1);
	if(gerilim>100 &#038;&#038; gerilim< =256) key= '0';
	if(gerilim>256 &#038;&#038; gerilim< =512) key= '8';
	if(gerilim>512 &#038;&#038; gerilim< =768) key= '5';
	if(gerilim>768) 		 key= '2';

	gerilim=read_adc(2);
	if(gerilim>100 &#038;&#038; gerilim< =256) key= '#';
	if(gerilim>256 &#038;&#038; gerilim< =512) key= '9';
	if(gerilim>512 &#038;&#038; gerilim< =768) key= '6';
	if(gerilim>768) 		 key= '3';

	return key;
}

unsigned char readkeyboard(void)
{
	static char prev=0,prev1=0;
	char        curr=0,returnvalue=0;

	curr=keypad();

	if(curr!=prev1)
	{
	   dbtmr=0;
	   prev1=curr;
	   returnvalue=prev;
	}
	else
	{
		if(dbtmr>=dEBOUNCE)
		{
			prev=curr;
			prev1=curr;
			returnvalue=curr;
			dbtmr=-1;
		}
		else
		{
			returnvalue=prev;
		}
	}
	return returnvalue;
}

int main(void)
{
	PORTC=0x00;
	DDRC=0xFF;

	lcd_init();
	adc_init(ADC_REF_AVCC);

	TCNT1=0xFF83;		// TCNT1, 16 bitlik registerine 65411 yükleniyor
	TCCR1B=0x02;		// Prescaler değeri 1:8
	TIMSK|=0x04;		// Timer1 taşması kesmesi aktif

	sei();			// Genel kesmeler aktif ediliyor

	lcd_gotoxy(1,1);	// LCD'nin ilk karekterine gidiliyor
	menugecis=100;		// 100ms bekleniyor
	for(;;)
	{
		if((readkeyboard()!='\n')&#038;&#038; ( menugecis == 0))	// Tuşa basıldı mı
		{
			menugecis=BEKLEME;
			veri_yolla(readkeyboard());		// Basılan değer LCD'ye gönderiliyor
		}
	}
}</pre>
<p>Kodları, ilk defa debounce sorunu yaşayan kişileri düşünerek, bu sorunu giderip, gerçek hayatta uygulanabilecek yapıda yazdım. Böylece, en azından, bu sorunu yaşayan arkadaşlarımıza yardımcı olacağımı düşünüyorum.<br />
Herkese iyi çalışmalar.</p>
<p><strong>Dip not:</strong> <em><span style="text-decoration: underline;">Okul ve </span></em><em><span style="text-decoration: underline;"> ARM çalışmalarım nedeniyle bu sıralar yazılarım seyrekleşebilir.</span></em></p>
<p><em><strong>Teşekkür:</strong> Debounce konusundaki yardımları için ENKO Elektronik&#8217;ten Hüseyin TUNA&#8217;ya sonsuz 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/3-wire-keypad/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/3-wire-keypad/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WinAVR ile AVR Programlama</title>
		<link>http://www.fxdev.org/winavr-ile-avr-programlama/</link>
		<comments>http://www.fxdev.org/winavr-ile-avr-programlama/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 14:41:43 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[atmega16]]></category>
		<category><![CDATA[atmega8]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[capture]]></category>
		<category><![CDATA[CCP]]></category>
		<category><![CDATA[compare]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[i2c]]></category>
		<category><![CDATA[kitap]]></category>
		<category><![CDATA[programlama]]></category>
		<category><![CDATA[pwm]]></category>
		<category><![CDATA[spi]]></category>
		<category><![CDATA[timer]]></category>
		<category><![CDATA[usart]]></category>
		<category><![CDATA[winavr]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=806</guid>
		<description><![CDATA[Bu yazın başında boş zamanlarımda ilgilendiğim AVR konusu hakkında aldığım notları birleştirerek 25 sayfalık bir kitapçık haline getirdim. Bu 25 sayfalık kitapçıkta Atmega16 ve Atmega8&#8242;in çevresel donanımlarını, özellikle de -bence- Atmega&#8217;nın en karmaşık yapılarından olan Capture, Compare ve PWM işlemlerini anlatmaya çalıştım. İçerisinde Hi-Tech Pic Programlama kitabımda olduğu kadar bolca örnek olmasa da özellikle Timer [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Atmel" href="http://www.fxdev.org/wp-content/uploads/2010/05/Atmel.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2010/05/Atmel.jpg" alt="" title="Atmel" width="248" height="179" class="alignright size-full wp-image-724" /></a>Bu yazın başında boş zamanlarımda ilgilendiğim AVR konusu hakkında aldığım notları birleştirerek 25 sayfalık bir kitapçık haline getirdim. Bu 25 sayfalık kitapçıkta Atmega16 ve Atmega8&#8242;in çevresel donanımlarını, özellikle de -bence- Atmega&#8217;nın en karmaşık yapılarından olan Capture, Compare ve PWM işlemlerini anlatmaya çalıştım. İçerisinde Hi-Tech Pic Programlama kitabımda olduğu kadar bolca örnek olmasa da özellikle Timer konusunda oldukça doyurucu bilgilere sahip olduğunu düşünüyorum.<br />
Kitapçığı yazmamdaki bir diğer amaç da PIC&#8217;den başka mikrodenetleyici görmemiş kişilere, yeni ve özellikle dünya da çok popüler olan AVR&#8217;yi tanıtmak istememdi. Kitapçıkta da görülebileceği üzere Atmega&#8217;yı tanımak için 25 sayfalık not yeterli olabiliyor.<span id="more-806"></span><br />
Bir diğer hususta yazılan kodların tamamının WinAVR ile Eclipse kullanılarak yazılmış olmasıdır.<br />
<a class="lightbox"  title ="WinAVR ile AVR Programlama Kapak Resmi" href="http://www.fxdev.org/wp-content/uploads/2010/08/winavr_ile_avr_programlama.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2010/08/winavr_ile_avr_programlama.jpg" alt="" title="WinAVR ile AVR Programlama Kapak Resmi" width="405" height="525" class="aligncenter size-full wp-image-807" /></a>Bu 25 sayfalık kitapçıkta ele aldığım konular ise şöyle;<br />
- WinAVR ve Eclipse Kurulumu<br />
- AVR Giriş Çıkış Yönlendirmeleri<br />
- Interrupt İşlemleri<br />
- Timer0, Timer1 ve Timer2 Birimleri ve Bu Birimlere Bağlı CCP İşlemleri<br />
- ADC Birimi<br />
- SPI ve I2C İşlemleri<br />
- USART ve<br />
- Dahili EEPROM Birimi</p>
<p>Kitabı <a href="http://www.4shared.com/file/lY1edZFR/WinAVR_ile_AVR_Programlama.html" target="_blank"><b>buradan</b></a> indirebilirsiniz.<br />
Kitap ile ilgili tüm görüşlerinizi, AVR ile ilgili tüm sorularınızı yorum kısmından bana iletebilirsiniz.</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/winavr-ile-avr-programlama/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/winavr-ile-avr-programlama/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Kaptanın AVR Defteri: SPI</title>
		<link>http://www.fxdev.org/kaptanin-avr-defteri-spi/</link>
		<comments>http://www.fxdev.org/kaptanin-avr-defteri-spi/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 00:06:10 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[2x20]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[atmega16]]></category>
		<category><![CDATA[atmel]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[haberleşme]]></category>
		<category><![CDATA[lcd]]></category>
		<category><![CDATA[mcp3204]]></category>
		<category><![CDATA[spi]]></category>
		<category><![CDATA[tc72]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=736</guid>
		<description><![CDATA[Geçen hafta tam finaller arifesinde başladığım AVR macerama bugün ufak bir uygulama ile devam ettim. Bence herhangi bir aracı biliyorum, kullanıyorum demek için hazır kopyala, yapıştırdan ziyade, inceliklerini bilmek şart. Aynı bilgisayar biliyorum demek gibi; biliyorsun tamam ama daha hayatında ctrl+alt+del&#8217;e basmamışsın neye hikmetse. Onun için bugün, biraz da geçen haftadaki sınavlarımın beklediğimden iyi geçmesinden [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Atmega8" href="http://www.fxdev.org/wp-content/uploads/2010/06/Atmega8.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2010/06/Atmega8.jpg" alt="" title="Atmega8" width="269" height="216" class="alignright size-full wp-image-740" /></a>Geçen hafta tam finaller arifesinde başladığım AVR macerama bugün ufak bir uygulama ile devam ettim.<br />
Bence herhangi bir aracı biliyorum, kullanıyorum demek için hazır kopyala, yapıştırdan ziyade, inceliklerini bilmek şart. Aynı bilgisayar biliyorum demek gibi; biliyorsun tamam ama daha hayatında ctrl+alt+del&#8217;e basmamışsın neye hikmetse.<br />
Onun için bugün, biraz da geçen haftadaki sınavlarımın beklediğimden iyi geçmesinden dolayı, açtım Atmega16&#8242;nın datasheetini ve en azından SPI&#8217;yı bir öğreneyim dedim.<br />
Önceki yazımda belirttiğim gibi AVR&#8217;nin datasheetleri muhteşem. Bir birimin nasıl kullanacağını enine boyuna anlatmak ile kalmıyor, kütüphaneyi hazır vererek, kullanmasını bileni büyük bir yükten kurtarıyor. Yalnız benim hazırcılıktan nefret ettiğimi bilenler hemen ne oluyoruz demesinler. AVR, kütüphaneleri sadece örnek olarak veriyor, bazı ince ayarları yine sizin register değerlerine bakıp, ona göre ayarlamanız gerekiyor.<span id="more-736"></span><br />
Gelelim SPI&#8217;ya; SPI, kullanımı açısından çok rahat bir haberleşme çeşidi. Kendinizi master (efendi) ya da slave (köle) olarak belirledikten sonra 3 kablo ile (yardımcı saat sinyali, data ve chip select) bu özelliğe sahip bir çok aleti kontrol edebiliyorsunuz. Örneğin günümüzde gelişmiş bir çok renkli, renksiz GLCD&#8217;ler, telefon ekranları artık bu şekilde çalışmakta.<br />
Ben ise daha önce PIC ile kullandığım, her ikisi de SPI&#8217;dan kontrol edebilen MCP3204, 4 kanal ADC ile Microchip&#8217;in TC72 adlı sıcaklık sensörünü AVR SPI ile kontrol edip, ayrıca bu uygulamlar da normalden farklı olarak 2&#215;20 LCD kullandım.</p>
<p><b>1) TC72 Uygulaması</b></p>
<p>TC72 uygulamasında çok basitçe bir sıcaklık ölçümü yapılmıştır. Ölçülen sıcaklığın ondalık kısmı ekrana basılmış, ayrıca sensörün içinde bulunan ayar registerinin değeri de ekranda gösterilmiştir.<br />
Bu uygulamaya ait tüm dosyaları yazının en altında verilen bağlantıda mevcuttur.<a class="lightbox" title="TC72 Örneği" href="http://www.fxdev.org/wp-content/uploads/2010/06/TC72.png"><img class="aligncenter size-full wp-image-737" title="TC72 Örneği" src="http://www.fxdev.org/wp-content/uploads/2010/06/TC72.png" alt="" width="527" height="308" /></a></p>
<p><b>2 ) MCP3204 Uygulaması</b></p>
<p>MCP3204, daha önce de dediğim gibi 4 kanal 12bit çözünürlüklü bir ADC&#8217;dir. 5V besleme ile iletişim hızı 2MHz hıza kadar çıkabilir. Bu entegrenin, donanımsal SPI ile kullanımında dikkat edilmesi gereken en önemli kısım ise komut gönderimi yapıldığı anda aynı zamanda da okuma işleminin yapılması gerektiğidir.<br />
Bu örnekte ise 0-5V aralığını ölçebilen, 4 kanal bir voltmetre uygulaması yaptım. Verdiğim simülasyon programında potlarla istediğiniz gibi oynayarak sonuçların nasıl değiştiğini görebilirsiniz.<br />
Bu uygulamaya ait kütüphane ve simülasyon dosyalarını yazının en altında verdiğim bağlantıda bulabilirsiniz.<a class="lightbox" title="MCP3204 Uygulaması" href="http://www.fxdev.org/wp-content/uploads/2010/06/MCP3204.png"><img class="aligncenter size-full wp-image-738" title="MCP3204 Uygulaması" src="http://www.fxdev.org/wp-content/uploads/2010/06/MCP3204.png" alt="" width="593" height="312" /></a></p>
<p>Uygulamlarla ilgili detaylı açıklamara ve dosyalara <a href="http://www.4shared.com/file/w3hQ4YOO/SPI_rnei.html" target="_blank"><b>buradan</b></a> veya <a href="http://www.fxdev.org/muhendislik/"><b>Mühendislik</b></a>/<a href="http://www.fxdev.org/muhendislik/atmel_avr/"><b>Atmel AVR</b></a> bölümünden ulaşabilirsiniz.<br />
Konu ile ilgili sorularınızı yorum bölümüne yazabilirsiniz.</p>
<p>Herkese kolay gelsin&#8230;</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/kaptanin-avr-defteri-spi/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/kaptanin-avr-defteri-spi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AVR&#8217;ye Merhaba</title>
		<link>http://www.fxdev.org/avrye-merhaba/</link>
		<comments>http://www.fxdev.org/avrye-merhaba/#comments</comments>
		<pubDate>Thu, 27 May 2010 22:47:37 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[16]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[ansi c]]></category>
		<category><![CDATA[atmega]]></category>
		<category><![CDATA[atmel]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[lm35]]></category>
		<category><![CDATA[sıcaklık]]></category>
		<category><![CDATA[voltage]]></category>
		<category><![CDATA[voltaj]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=722</guid>
		<description><![CDATA[Final sınavları başlayınca insana nereden geldiğini bilmediğim bir sıkıntı basıyor. Geçen senelerde bu sıkıntı anlarında sitemi düzenler ya da photoshop ile header tasarladım fakat bu dönem bir değişiklik yapıp, başka tür bir mikrodenetleyiciye giriş yapmak istedim. 8051 ile başlayan mikrodenetleyici maceram, PIC ile ilerlemiş fakat nedense hiç bir zaman Atmel&#8217;in ürettiği AVR&#8217;ye bulaşmamıştım. Hemen bu [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Atmel" href="http://www.fxdev.org/wp-content/uploads/2010/05/Atmel.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2010/05/Atmel.jpg" alt="" title="Atmel" width="248" height="179" class="alignright size-full wp-image-724" /></a>Final sınavları başlayınca insana nereden geldiğini bilmediğim bir sıkıntı basıyor.<br />
Geçen senelerde bu sıkıntı anlarında sitemi düzenler ya da photoshop ile header tasarladım fakat bu dönem bir değişiklik yapıp, başka tür bir mikrodenetleyiciye giriş yapmak istedim.<br />
8051 ile başlayan mikrodenetleyici maceram, PIC ile ilerlemiş fakat nedense hiç bir zaman Atmel&#8217;in ürettiği AVR&#8217;ye bulaşmamıştım. Hemen bu eksiğimi gidermek, en azından ben buna el attım demek için kolları sıvadım.<br />
Öncelikle PIC&#8217;ten AVR&#8217;ye geçiş yapacaklar için söylemem gereken birinci şey şu: AVR için gerekli derleyiciler <b>bedava</b>!<span id="more-722"></span><br />
Evet yanlış duymadınız, PIC mikrodenetleyicilerde olduğu gibi yok deneme süresiymiş, yok başka bir şeymiş uğraşmıyorsunuz. Bu, eğer bir firma iseniz, çok büyük bir avantaj demek.<br />
Ayrıca belirtmem gerekiyor, Atmega16&#8242;nın datasheet&#8217;i bugüne kadar gördüğüm en güzel, en açıklayıcı datasheetlerden biri. Utanmasa sizin yerinize kodunuzu yazacak.<br />
&#8220;Vay bu çok güzelmiş&#8221; diyorsanız, sırayla yapmanız gerekenler ise şöyle:</p>
<p>- Öncelikle <a href="http://winavr.sourceforge.net/" target="_blank"><b>WinAVR</b></a>&#8216;yi bilgisayarımıza kuruyoruz.<br />
- Daha sonra <a href="http://www.eclipse.org/" target="_blank"><b>Eclipse</b></a> sitesinden Eclipse IDE for C/C++ Developer pakedini indiriyoruz, hemen bir yere dosyaları çıkartıp çalıştırıyoruz.<br />
- Daha sonra ise Eclipse&#8217;in Help sekmesinden Install New Software/Add kısmına basıp Location bölümüne &#8220;http://avr-eclipse.sourceforge.net/updatesite/&#8221; yazarak, eklentiyi yüklüyoruz ve hepsi bu.</p>
<p>Artık yeni proje oluşturup, AVR mikrodenetleyicinizi seçip kullanabilirsiniz.<br />
WinAVR&#8217;de ANSI C kullanıldığı için, daha önce PIC için hazırladığım donanım kütüphanelerimi çok az değiştirip kullanmak gerçekten çok rahat. Buradan hâlâ Pic Basic, CCS C kullananlara duyurulur.</p>
<p>Ben ilk örneğimi, Atmega16&#8242;nın ADC&#8217;lerinden bilgi okuyup, bunu LCD&#8217;de göstermek için uyguladım. Aşağıda uygulamaya ait resmi ve yazdığım basit kodları bulabilirsiniz. Üzerinde herhangi bir değişiklik yapıp kullanabilirsiniz.<br />
Yalnız kodu iyi incelerseniz PIC&#8217;teki TRISx yerine DDRx&#8217;nin geldiğini, PORT&#8217;larn PIC&#8217;teki gibi RB0 gibi bit bit kontrol edilemediğini göreceksiniz. İlk AVR denemelerinizde buna dikkat edip, &#8216;maskeleme&#8217; ne imiş öğrenmeniz gerekiyor. Gerisi yine size kalmış.</p>
<p>Sonuç olarak söylemem gerekirse; AVR ne denli güzelse, finaller de o denli sıkıcı.<br />
Herkese çalışmalarında, bana da finallerde başarılar.<a class="lightbox" title="Atmega16 ADC Uygulaması" href="http://www.fxdev.org/wp-content/uploads/2010/05/ADC.png"><img class="aligncenter size-full wp-image-723" title="Atmega16 ADC Uygulaması" src="http://www.fxdev.org/wp-content/uploads/2010/05/ADC.png" alt="" width="526" height="407" /></a></p>
<p><b>ADC Okuma Örneği:</b></p>
<pre class="brush: c">/* **** www.FxDev.org ****
 * ADC'den Gerilim ve Sıcaklık Ölçen Program
 */

#include "avr/io.h"
#include "util/delay.h"
#include "lcd.h"

#define ADC_REF_AREF 0x00
#define ADC_REF_AVCC 0x40
#define ADC_REF_INT  0xC0

unsigned char ADC_REF_TYPE;

void adc_init(unsigned char ADC_REF)
{
	ADCSRA = 0x87;
	ADC_REF_TYPE = ADC_REF;
}

unsigned int read_adc(unsigned char adc_channel)
{
	ADMUX = ADC_REF_TYPE | adc_channel;
	ADCSRA |= 0x40;
	while (ADCSRA &#038; 0x40);
	return ADC;
}

int main(void)
{
	unsigned int sicaklik,voltaj;
	PORTC=0x00;
	DDRC=0xFF;

	lcd_init();

	adc_init(ADC_REF_AVCC);

	lcd_yaz("FxDev.org Sunar!");
	lcd_gotoxy(2,1);
	lcd_yaz("AVR'ye Merhaba..");
	_delay_ms(1500);
	lcd_clear();

	lcd_gotoxy(1,1);
	veri_yolla('C');
	veri_yolla(0xDF);
	veri_yolla(':');
	lcd_gotoxy(2,1);
	lcd_yaz("V :");

	for(;;)
	{
		lcd_gotoxy(1,4);	// Okunan değer LCD'ye yazılıyor
		sicaklik=read_adc(0)*48; // Hesaplama yapılıyor
		_delay_us(50);
		veri_yolla(sicaklik/1000+48);
		veri_yolla((sicaklik%1000)/100+48);
		veri_yolla('.');
		veri_yolla((sicaklik%100)/10+48);
		veri_yolla(sicaklik%10+48);
		veri_yolla(0xDF);
		veri_yolla('C');
		lcd_gotoxy(2,4);
		voltaj=(int)(read_adc(1)/2.048);
		_delay_us(50);
		veri_yolla(voltaj/1000+48);
		veri_yolla((voltaj%1000)/100+48);
		veri_yolla('.');
		veri_yolla((voltaj%100)/10+48);
		veri_yolla(voltaj%10+48);
		veri_yolla('V');
	}
}</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/avrye-merhaba/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/avrye-merhaba/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>8051: Müzelik Mikrodenetleyici</title>
		<link>http://www.fxdev.org/8051-muzelik-mikrodenetleyici/</link>
		<comments>http://www.fxdev.org/8051-muzelik-mikrodenetleyici/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 19:39:39 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[8051]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[atmel]]></category>
		<category><![CDATA[CCP]]></category>
		<category><![CDATA[deney]]></category>
		<category><![CDATA[ege üniversitesi]]></category>
		<category><![CDATA[laboratuar]]></category>
		<category><![CDATA[mikrodenetleyici]]></category>
		<category><![CDATA[mikroişlemci]]></category>
		<category><![CDATA[pwm]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=704</guid>
		<description><![CDATA[Elektrik Elektronik Mühendisliği ikinci sınıfın, ikinci döneminde gördüğüm 8051, kullanımı da kendi gibi basit bir mikrodenetleyicidir. 1980 yılında üretilen bu mikrodenetleyici, dijital elektronik dersi alanların bileceği CISC mimari yapısına sahip ki bu mikrodenetleyiciyi kontrol eden çok fazla komut demek; 8 bitlik veri işleme özelliğine sahip 8051&#8242;de ise bu sayı 255 komuta kadar çıkabilmekte. Klasik bir [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="8051" href="http://www.fxdev.org/wp-content/uploads/2010/03/8051.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2010/03/8051.jpg" alt="" title="8051" width="259" height="132" class="alignright size-full wp-image-705" /></a>Elektrik Elektronik Mühendisliği ikinci sınıfın, ikinci döneminde gördüğüm 8051, kullanımı da kendi gibi basit bir mikrodenetleyicidir. 1980 yılında üretilen bu mikrodenetleyici, dijital elektronik dersi alanların bileceği CISC mimari yapısına sahip ki bu mikrodenetleyiciyi kontrol eden çok fazla komut demek; 8 bitlik veri işleme özelliğine sahip 8051&#8242;de ise bu sayı 255 komuta kadar çıkabilmekte. </p>
<p>Klasik bir 8051&#8242;in (örneğin AT89C52) iki adet dış kesme, bir adet seri port kesmesi ve iki adet timer kesmesi ile toplam beş kesmeye ve 256 Byte RAM ile 8 kByte ROM&#8217;a sahiptir. Tek ek komponent olarak ise USART birimi ile günümüzün PIC ve ATMEGA gibi popüler mikrodenetleyicilerinin yanında oldukça sönük kalmaktadır. Bir örnekle açıklamak gerekirse, potansiyometre bilgisine göre doluluk oranı değişen bir sinyal yapmaya çalıştığımızda 8051 için ayrı bir ADC entegresi ve içine ise stabil bir kod yazılması gerekmektedir. Oysa bunu Pic ile yapmış olsak sadece ADC&#8217;si olan bir PIC kullanmamız ve doluluk oranı değişecek sinyali ise yine PIC&#8217;in CCP biriminden oluşturmamız yeterli olacaktır.<span id="more-704"></span></p>
<p>Her ne kadar 8051, genç nesil mikrodenetleyicilerinin yanında sönük kalsa da gerek kullanım, gerekse öğretim kolaylığı nedeniyle bir çok okulda, üniversitede hâlen öğrencilere gösterilmektedir. Bunun için ben de mikroişlemciler dersindeki laboratuar notlarımı ve dönem projemi bu konuda çalışmak isteyen arkadaşlar için paylaşma gereği duydum.<br />
Laboratuar konuları aşağıdaki gibidir;<br />
<b>1-</b> (ASM) Keil Programının Kullanımı<br />
<b>2-</b> (ASM) Register Bankı Seçme, Portlardan Değer Okuma, Adres Modları<br />
<b>3-</b> (ASM) 8051 Komutlarının Kullanımı: ADDC, SUBB, MUL, DIV, CPL, XCH, SWAP<br />
<b>4-</b> (ASM) 8051 Uygulaması: Rasgele Verilen Sayıları Tek veya Çift Olarak Yerleştirme<br />
<b>5-</b> (ASM) 8051 Uygulaması: Rasgele Verilen Sayıları Büyükten Küçüğe ve Küçükten Büyüğe Sıralama<br />
<b>6-</b> (ASM) 8051 Uygulaması: Timer&#8217;ların Kullanımı<br />
<b>7-</b> (ASM) 8051 Uygulaması: Seri Port Kullanımı<br />
<b>8-</b> (C) Kronometre Yapımı<br />
<b>9-</b> (C) Bankamatik Yapımı<br />
<b>10-</b> (C) LM35 ve AD0831 ile Klima Yapımı<br />
<b>11-</b> (C) Sinyal Üreteci Yapımı</p>
<p><b>Dönem Projesi:</b> (C) Çok Fonksiyonlu Sıcaklık ve Zaman Uygulaması</p>
<p>Deneylerle ilgili detaylı açıklamara ve dönem projesine <a href="http://www.4shared.com/file/QGjPSDOv/8051.html" target="_blank"><b>buradan</b></a> veya <a href="http://www.fxdev.org/muhendislik/"><b>Mühendislik</b></a>/<a href="http://www.fxdev.org/muhendislik/digerleri/"><b>Diğerleri</b></a> bölümünden ulaşabilirsiniz.<br />
Herkese iyi çalışmalar.</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/8051-muzelik-mikrodenetleyici/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/8051-muzelik-mikrodenetleyici/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

