<?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; mikroişlemci</title>
	<atom:link href="http://www.fxdev.org/etiket/mikroislemci/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>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>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>

