Uzunca bir aradan sonra yeniden sizlerle birlikteyiz. Robot yarışmaları, iş güç, hastalık derken yeni yazılarımı hazırlamaya ancak fırsat bulabildim. Geç oldu biraz ama umarım güç olmaz diyerek yazıma giriş yapıyorum. Kesme kavramını not 13 ve not 14’de yeteri kadar anlattığımı düşünüyorum. Şu anda bu kavramın üzerinde durmaktan ziyade Timer0 kesmesi üzerinde durmaya karar verdim. Timer0 adından da anlaşılacağı üzere bir zamanlayıcı modülüdür. Bu modül 16f628a içerisine yerleştirilmiş olan 3 adet timerdan sadece birtanesidir.

Timer0, iki şekilde kullanılabilir;

1- Dahili saat kaynağı ile;

2- Harici saat kaynağı ile.

Aslında timer0’ın yaptığı iş kendisine gelen sinyal darbelerini saymaktır. Timer0 ‘ın çalışırken kullandığı 3 adet register vardır. Bunlar;TMR0, OPTION ve INTCON registerlarıdır.

TMRO: Timer0’ın saydığı değerleri hafızasında tuttuğu registerdır. Bu register 8 bitliktir. Yani maksimum tutabileceği sayı değeri 255’tir. Timer, belirlenen sürede TMR0 içerisindeki sayıdan başlayarak ve birer birer artarak saymaya başlar. Eğer TMR0 içerisindeki değer 255 iken bir sinyal darbesi daha gelir ise TMR0’ın içerisi 0’a döner ve tam bu sırada Timer0 kesmesi oluşur. Biz TMR0 registerının içeriğini istediğimiz gibi kaydedebiliriz. Yani 200 değerini TMR0 içerisine kaydedersek yalnızca 56. sinyal darbesinde Timer0 kesmesi oluşur. Timer0’ın kesme oluşturacağı süreyi hesaplamak için şu formülü kullanırız;

OPTION_REG: Seçenek registerıdır. burada yapacağımız bir kaç ayarlama ile Timer0 kesmesini kurabiliriz.

INTCON: Kesme kontrol registerı. Bütün kesmeleri açıp kapatmaya ve birtakım ayarlamalar yapmaya yarayan registerdır.

Şimdi isterseniz Timer0’ı kurmak için gerekli ayarlamaları öğrenelim.

  1. OPTION REGISTER-TMR0 Clock Source Select biti ayarlanır(0 ise osilatör frekansı, 1 ise harici saat sinyali(RA4 pininden verilecek olan) Timer0 için kaynak olarak belirlenir.)
  2. OPTION REGISTER-TMR0 Source Edge Select biti ayarlanır( eğer kaynak olarak harici, seçili ise düşen kenar veya yükselen kenar tetiklemesi belirlemek için kullanılır)
  3. OPTION REGISTER-Prescaler Assignment biti ayarlanır. Timer0 için 0, Watch dog timer için 1 seçilir. Biz 0 seçiyoruz. (watchdog timer daha sonra anlatılacak).
  4. OPTION REGISTER-PS2-PS1-PS0 bitleri. İte bu bitler Timer0’ın en can alıcı ayarını oluşturur. Timer0’ın kesme oluşturacağı süreyi hesaplayabilmek için bu bitlerin değerleri ile oynarız ve bize en iyi sonucu verecek değeri seçeriz.
  5. TMR0 registerına gerekli değer yüklenmelidir.
  6. INTCON – INTERRUPT CONTROL REGISTER’ındaki  GIE: Global Interrupt Enable bit’i  “1″ yapılmalıdır.
  7. INTCON – INTERRUPT CONTROL REGISTER’ındaki   T0IF: TMR0 Overflow Interrupt Flag bit’i “0″ yapılmalıdır.
  8. INTCON – INTERRUPT CONTROL REGISTER’ındaki  T0IE: TMR0 Overflow Interrupt Enable bit’i “1″ yapılmalıdır

Şimdi dilerseniz bir örnek yapalım. Bu örnekte Timer0’ı PIC’e bağlı osilatör ile kullanacağız. Harici kaynaktan kullanmak genellikle bir sinyali saydırmak veya hassas saat ayarı yapmak için kullanılır. Biz bu örnekte PIC saat kaynağını kullanacağız ve 4ms’lik bir kesme oluşturacağız.  Dahili osilatörün frekansı 4MHZ. Fakat PIC işlem yaparken bunun 1/4’ünü kullanır. Bu yüzden benim frekansım 1Mhz oluyor. Yani mikrodenetleyici her 1 mikrosaniyede bir işlem yapmaktadır. Prescaler değerini 32 seçiyorum. Buradan 32*1us =32uS çıkıyor. Yani Timer0 32 mikrosaniyede bir sayacak. Bizim istediğimiz süre 4 ms olduğuna göre Timer’ın kaç kez saydıktan sonra kesme oluşturacağını bulalım. 4000/32=125 kez sayması gerekiyor. Timer255’ten 256’ya geçerken kesme oluşturduğundan 256-125=131 çıkar. Yani biz TMR0 registerına 131 değerini yükleyeceğiz. Böylece TMR0, 131den saymaya başlayacak ve 256’ya gelince kesme oluşacak. Kesme oluştuğunda TMR0 içeriği 0 olur ve Timer0 Kesme bayrağı 1 olur(T0IF=1). Bizim tekrar kesme oluşturabimemiz için, kesme altprogramı içinde bu bayrağı sıfırlamamız ve TMR0 içerisine tekrardan 131 değerini girmemiz gerekir.  Dikkatle kodu takip etmenizi öneriyorum.

char i=0;
void interrupt()//kesme alt programı
{
if (INTCON.T0IF)//Timer0 Kesme bayrağı kontrol ediliyor.
{
i++;
TMR0=131;//Timer0 registerına 4 ms'de bir kesme oluşturacak değer yükleniyor.
INTCON.T0IF=0;// Kesme bayrağı sıfırlanıyor.
}
}
//*****************************************************************************
void kurulum()
{
trisb=0;//PORTB çıkış
portb=0;//PORTB'nin tüm pinleri 0 seviyesinde.
OPTION_REG.T0CS=0;// Clock palsi kaynağı olarak dahili osilatör seçildi.
OPTION_REG.T0SE=0;
OPTION_REG.PSA=0;//Prescaler değeri Timer0 için kullanılacak.
OPTION_REG.PS2=1;//Prescaler değeri 1:32 olarak seçildi.
OPTION_REG.PS1=0;
OPTION_REG.PS0=0;
INTCON.GIE=1;// tüm kesmelere izin verdik.
INTCON.T0IF=0;//Kesme bayrağını her ihtimale karşı sıfırladık
TMR0=131 ;//Timer0 registerına 4 ms'de bir kesme oluşturacak değer yükleniyor.
INTCON.T0IE=1;//Timer0 kesmesini aktif ettik.
}
//*****************************************************************************
void main()
{
kurulum();
while(1)
{
if(i==5)  // Eğer i=5 ise yani 5 kesme oluşmuşsa(5 x 4ms = 20 ms)
{
portb=~portb;//portb tersleniyor
i=0;//i değişkeni sıfırlanıyor.
}
}
}

Büyütmek için tıklayın…

Yukarıdaki koddan görebileceğiniz üzere kesme altprogramında “i” değişkeni her kesme olduğunda 1 arttırılmıştır. Bunun sebebi 4ms’lik timer0 kesmesi kullanarak PORTB’nin 20 ms’de bir durum değiştirmesini sağlamaktır. Anlamadığınız noktaları sorabilirsiniz çekinmeden.

Buraya yukarıdaki yazı ile ilgili gerekli kodları ve simülasyon dosyalarını indirebilirsiniz. Bonus olarak da timer hesaplama programcığı (birkaç ufak hatası var programın) ekliyorum.

Görüşmek üzere…

yorum
  1. Fatih ASLAN dedi ki:

    Hocam paylaşım için teşekkürler.Benim Timer0 kesmesinde anlamadığım tek şey TMR0 önceden yüklenecek olan değerin hesaplanması o kadar.Birde kod optimasyonu açısından programda OPTİON ve INTCON değerlerini bir komut ile çıkarsak daha stabil olmaz mı hocam program şöyle ki;
    OPTİON=0xC0;
    INTCON=0xC7;
    INTCON.T0IE=1..

    *değerler rastgele yazıldı.

  2. Fatih ASLAN dedi ki:

    Hocam 0.5 sn bir kesme yapmak için süreyi nasıl hesaplarız sadece bu TMR0 öndeğerinde tıkandım kaldım..

  3. erdinc dedi ki:

    hocam merhaba sizin verdiğiniz kod üzerinde değişiklik yaparak 1 sn gecikme için “i ” değerini 250 yaparak 4ms x 250 şeklinde yaptım fakat outputum değişmiyor sebebi nedir? bu konuda yardımcı olursanız çok mutlu olurum

  4. Mehmet Y dedi ki:

    Acaba Timer0’ın her 100ms de bir kesme oluşturması için timer0’a kaç değeri yüklenmeli ve prescaler değeri ne seçilmeli? Teşekkürler..

  5. Mehmet Y dedi ki:

    Hocam çok teşekkür ederim. Dediğiniz gibi calculator’ı indirdim ama bir problem ile karşılaştım. Bayağıda bir uğraştım beceremeyince buraya yazdım.. Şöyle ki benim amacım devir ayarlı bir motora kasnak ile bağlı bir rotary encoderdan (100 pulse’lik) pulse okuyup dakikadaki devir sayısını hesap ettirmem. Bunun için senaryoyu şu şekilde kurduk: Timer1 ile donanım kesmesi oluşturup her 100 pulse de bir devir attığını anlayıp devir değişkenini 1 artırmak ve Timer0’ı da 100ms’ye set edip her 100ms de bu devir değişkenini kullanarak dakikada ki devir değerini deneyler sonucu bulmayı planlıyordum.
    Bu bağlamda ilk önce sizin harici Timer1 kesmesi konulu yazınızı uyguladım sonuç harikaydı. Ben motoru elimle 1 tur döndürdüğümde display de de 100 değerini kadar adım adım değerleri görebildim. Ardında size yukarıda ki soruyu yönettim ve bu calculator sayesinde de Timer0 ile 100ms lik kesmenin olmayacağını gördüm. (8 bitlik timer olunca) bende bu defa donanım kesmelerini timer0 ile yapayım timer1 ile de (16 bit olduğu için) 100ms zaman kesmelerini oluşturayım dedim. Bunun içinde yine sizin Timer0’ı donanım kesmesi olarak kurabilme yazınızı uyguladım sonuç yine mükemmeldi. Motorun bir turunda gelen 100 pulse’i alabiliyordum. Ama Timer 1’i bir türlü 100ms ye set edemedim. (Timer0 da programda olduğundan)

    Hocam ben gerek kurulum fonksiyonumu gerekse de interrup fonksiyonuma aşağıda yer veriyorum. Bir yol gösterirseniz çok sevinirim..

    İyi çalışmalar!

    void kurulum()
    {
    CMCON=7; //Bu register’a 7 de.erini
    TRISA.F0=0; TRISA.F1=0; TRISA.F2=0; TRISA.F3=0; //TRISA.F4=1;
    TRISB.F0=0; TRISB.F1=0; TRISB.F2=0; TRISB.F3=0; TRISB.F7=1;

    TRISB.F5=0; PORTB.F5=0;

    //####
    TRISB.F6=0; PORTB.F6=0;
    //###

    disp1=0; disp2=0; disp3=0; disp4=0;

    INTCON.GIE=1;// tüm kesmelere izin verdik.

    OPTION_REG.T0CS=1;// Clock palsi kaynağı olarak dahili osilatör seçildi.
    OPTION_REG.T0SE=0;// Butona basıldığında RA4 high seviyeye çekilecek.(yükselen kenar tetiklemesi)
    OPTION_REG.PSA=0;//Prescaler değeri Timer0 için kullanılacak.
    OPTION_REG.PS2=0;//Prescaler değeri 1:1 olarak seçildi.
    OPTION_REG.PS1=0;
    OPTION_REG.PS0=0;
    INTCON.T0IF=0;//Kesme bayrağını her ihtimale karşı sıfırladık
    TMR0=255 ;//Timer0 registerına butona basışta bir kez kesme oluşturacak değer yükleniyor.
    INTCON.T0IE=1;//Timer0 kesmesini aktif ettik.

    INTCON = 0xD0;
    INTCON.PEIE=1; //Çevresel kesmeler aktif.
    PIE1.TMR1IE=1;//Timer 1 kesmesi aktif.
    T1CON|=0b00110000; //Timer1 prescaler değeri 1:8 olarak seçildi.
    T1CON.T1OSCEN=0; //dahili osilatör kullanılacağı için bu bitin önemi yok
    T1CON.NOT_T1SYNC=0;// dahili osilatör kullanılacağı için bu bitin önemi yok, 0 yükleyip geçtim.
    T1CON.TMR1CS=0;// dahili osilatör kullanılacak
    TMR1IF_bit = 0;//Kesme bayrağını her ihtimale karşı sıfırladık
    T1CON.TMR1ON=1;//Timer1 çalıştırılıyor.
    TMR1H = 0x3C;
    TMR1L = 0xAD;

    }

    void interrupt()
    {
    if(INTCON.T0IF)//Timer0 kesmesi ise yani motor bir Devir atmış ise
    {
    TMR0=255;
    s_Pulse++; //devir değişkeninin içeriğini 1 arttır.
    INTCON.T0IF=0;// Kesme bayrağı sıfırlanıyor.

    Devir=s_Pulse;

    }
    else if(TMR1IF_bit) //Timer1 kesmesi ise yani 100ms geçmiş ise
    {
    Devir = s_Pulse*6;

    TMR1IF_bit = 0; // Kesme bayrağı sıfırlanıyor.
    TMR1H = 0x3C; //Bu değer calculator dan elde edildi 100ms için
    TMR1L = 0xAD; //Bu değer calculator dan elde edildi 100ms için

    s_Pulse=0;

    PortB.F5=~Portb.F5; //PortB’nin 5.Bitini tersle..
    }
    }

  6. Mehmet Y dedi ki:

    Osilatör frekansımı 20MHz de yapsam calculator izin vermiyor. Bende denemedim hocam.. Bu yüzden timer0 ile donanım kesmesi timer1 ile de 100ms zamanlama kesmesi kullanmayı tercih ettim ama sıkıntım timer0 için register bitlerini yazarken timer1 için olması gereken ayarların önünü kapatıyorum ve nerde hata yaptığımı bulamıyorum. Yani sizin iki makalenizi harmanlayamadım. Bu registerlara çok iyi hakimiyet sağlayamamış olmamdan ileri geliyor sanırım 😦
    Aynı programda iki register ı da set edebilmenin yolunu belirtseniz çok sevinirim..
    Kolay gelsin Hocam..

    • mikrodunya dedi ki:


      //Timer0
      //Prescaler 1:1; TMR0 Preload = 55; Actual Interrupt Time : 200 us

      //Place/Copy this part in declaration section
      void InitTimer0(){
      OPTION_REG = 0x88;
      TMR0 = 55;
      INTCON = 0xA0;
      }

      void Interrupt(){
      if (TMR0IF_bit){
      TMR0IF_bit = 0;
      TMR0 = 55;
      //Enter your code here
      }
      }

      Osilatörünüz 4MHz ise Timer calculatorden 1MHZ’i seçmeniz lazım. Çünkü PIC frekansı 4’e bölüp kullanır. Yukarıdaki kod 200uS için yazılmıştır. 500 kez tekrarlanırsa 100ms geçmiş demektir.

      • Mehmet Y dedi ki:

        Hocam peki iki Timer’ı da (Timer0 ve Timer1) bir programda kullanabilmenin yolu var mı? Bunun için hangi register bitlerine ne atamam gerekir açıkcası bunu bilmiyorum.

        Şöyle ki ben Timer 0 ile RB4’den donanım kesmesi alırken Timer1 ile de 100ms lik bir interrupt oluşturmak istiyorum..

  7. Mehmet Y dedi ki:

    sanırım bu durum mümkün değil, değil mi?

  8. Mehmet Y dedi ki:

    Hocam oldu, böylelikle her iki timer da set edildi. Çok teşekkür ederim. Sizin makaleleriniz sayesinde gerçekleşti:

    void kurulum()
    {
    CMCON=7; //Bu register’a 7 de.erini
    TRISA.F0=0; TRISA.F1=0; TRISA.F2=0; TRISA.F3=0; //TRISA.F4=1;
    TRISB.F0=0; TRISB.F1=0; TRISB.F2=0; TRISB.F3=0; TRISB.F7=1;

    //####
    TRISB.F6=0; PORTB.F6=0;
    //###

    disp1=0; disp2=0; disp3=0; disp4=0;

    INTCON.GIE=1;// tüm kesmelere izin verdik.

    OPTION_REG.T0CS=1;// Clock palsi kaynağı olarak harici osilatör seçildi.
    OPTION_REG.T0SE=0;// Butona basıldığında RA4 high seviyeye çekilecek.(yükselen kenar tetiklemesi)
    INTCON.T0IF=0;//Kesme bayrağını her ihtimale karşı sıfırladık
    TMR0=255 ;//Timer0 registerına Motor’un her devrinde bir kez kesme oluşturacak değer yükleniyor.
    INTCON.T0IE=1;//Timer0 kesmesini aktif ettik.
    //OPTION_REG.PSA=0;//Prescaler değeri Timer0 için kullanılacak.
    //OPTION_REG.PS2=0;//Prescaler değeri 1:1 olarak seçildi.
    //OPTION_REG.PS1=0;
    //OPTION_REG.PS0=0;

    //INTCON = 0xD0;
    //Timer1
    //Prescaler 1:2; TMR1 Preload = 15533; Actual Interrupt Time : 100 ms
    INTCON.PEIE=1; //Çevresel kesmeler aktif.
    PIE1.TMR1IE=1;//Timer 1 kesmesi aktif.
    T1CON = 0x11; //Timer1 prescaler değeri 1:2 olarak seçildi.
    T1CON.T1OSCEN=0; //dahili osilatör kullanılacağı için bu bitin önemi yok
    T1CON.NOT_T1SYNC=0;// dahili osilatör kullanılacağı için bu bitin önemi yok, 0 yükleyip geçtim.
    T1CON.TMR1CS=0;// dahili osilatör kullanılacak
    TMR1IF_bit = 0;//Kesme bayrağını her ihtimale karşı sıfırladık
    T1CON.TMR1ON=1;//Timer1 çalıştırılıyor.
    TMR1H = 0x3C;
    TMR1L = 0xAD;

    }

  9. hüseyin dedi ki:

    TMR0 kesme ile ilgili assembly dilinde bir soru sormak istiyorum. Programı kısaca sorunun olduğu kısmı göz önünde bulundurarak yazıyorum,

    —————————————
    kontrol equ 0x30

    ORG 0x000

    goto main

    ORG 0x004

    bsf kontrol,0
    retfie

    main

    bsf status,rp0
    movlw b’10000010′ ; prescaler’i 8’e ayarladım
    movwf option_reg
    bcf status,rp0

    bcf kontrol
    movlw b’10100000′
    movwf intcon
    movlw d’94’ ; 1296 mikro saniye sonra kesme gelmesini istiyorum
    movwf tmr0

    a3
    btfss kontrol,0 ; kesmeden geri dönüşte buradan çıkmıyor
    goto a3

    —————————————————-

    Sorun kesmeden geri dönüşte a3 döngüsünden çıkmaması, acaba sıkıntı ne olabilir. Kesme vektöründe kontrol dosyası setlenemiyormu.

    • hüseyin dedi ki:

      Yardımcı olmaya çalışacak arkadaşlara şimdiden teşekkür ederim.

    • mikrodunya dedi ki:

      btfss kontrol,0
      satırı “kontrol” değişkeninin 0. bitini kontrol et ,eğer 1 ise bir satır atla anlamına gelir.
      btfss kontrol,0 ; kesmeden geri dönüşte buradan çıkmıyor
      goto a3

      Sizin kodunuzda bir satır atladığında hiç bir şey yok. Sebep bu.
      Şöyle yapın.
      btfss kontrol,0 ; kesmeden geri dönüşte buradan çıkmıyor
      nop
      goto a3

  10. Mehmet Y dedi ki:

    Hocam tekrar merhabalar. Bir konuda yol gösteriminize ihtiyacım var. Şimdi bir bus hattındaki lojik değişimleri takip edip ona göre mikro denetleyiciye farklı işler yaptırmak istiyorum.

    Saleae Logic Analyzer ile hattı dinledim ve bana lazım olan komutları capture ettim. Örneğin bana gerekli olan komutlardan bir tanesinin görüntüsü şu şekilde: http://i.hizliresim.com/yMml50.jpg

    Komutun toplam uzunluğu göründüğü üzere 1,988ms (Diğer komutlar da 1,597ms civarı 2ms üzeri yok yani)

    Yine fotoda da görüldüğü üzere hat normalde lojik 1 (5V) seviyesinde. Komut ilk düşen kenar ile başlamakta ve benim gördüğüm kadarı ile en kısa lojik 0 seviyesinin süresi, sinyale zoom yaparak çektiğim şu foto da görüldüğü üzere: http://i.hizliresim.com/62QkPN.jpg 7,083us

    Ancak yakalamak istediğim tüm siyalleri teker teker saydım ve hepsinde 81 adet düşen kenar var. (lojik 0) Sizin önceki yazınızdaki gibi Timer 1 ile sinyale değişikliklerini mi saydırsam dedim ama maalesef tüm komutlarda ki lojik 0 sayıları aynı.

    Sizce nasıl bir yol izlemeliyim Hocam? Bu konuda ki ciddi yol gösterimlerinize ihtiyacım var.

    Şimdiden teşekkür ederim..

    • mikrodunya dedi ki:

      Sinyal bana sanki uart iletişim gibi geldi. İşlemcinin usart iletişimini 115200 baud olacak şekilde ayarlayıp gelen komutları okuyabilirsiniz.

  11. Mehmet Y dedi ki:

    Teşekkür ederim Hocam. Uart iletişimi sizin dediğiniz gibi kurayım ancak gelen verileri lcd ekrana mı aktarayım görmek için. Yani şunu merak ediyorum elimde analyzer ile yakalamış olduğum bu sinyalleri analyzer otomatik anlamlandırmıyor. Yani protokolü çözümleyemiyor. Fakat ben doğru seçimi yaparsam anlamlandırıyor. Direktifiniz üzere “Analyzers” kısmından haberleşme protokolleri listesine eriştim. “Async Serial” seçeneği ile ilgili ayar ekranına geldim ve dediğiniz gibi 115200 değerini girdiğimde veya default değer olan 9600 girdiğimde protokolün çözümlenmediğini gördüm. Fotolarda göreceğiniz üzere otomatik seçimi işaretlediğim de ise 14176 olarak değerin değiştiğini görmekteyim. İlgili fotoğrafların linkeri şu şekilde Hocam:






    Hocam dilerseniz ölçüm dosyalarımı size gönderebilirim. Analizör yazılımı ise https://www.saleae.com/downloads adresinde.

    • mikrodunya dedi ki:

      Demekki standart bir baud seçilmemiş. Zaten analizör gelen verileri çıkartmış. Ben analizörün otomatik çözümleme seçeneği olmadığını varsayarak mcu kullanın demiştim. Artık gelen verileri aldığınıza göre problem kalmamış olması lazım. Usart fifo olarak çalıştığı için “least significant bit first” seçeneğini kullanmanız gerekir.

  12. Mehmet Y dedi ki:

    Hocam çok teşekkür ederim. Sayenizde sinyalleri anlamlandırabildim. (Ben o listedeki Async Serial haricindekileri denemiştim ama bu seçeneği hiç denememiştim. ) Bu protokol RS485 mi yoksa RS 232 mi oluyor? (Otomobilden okudum bu verileri. Bus- Bus+ ve ground olan bir haberleşme kablosunun ( http://i.hizliresim.com/XBmn7j.jpg ) ground ve bus- uçlarından bu verileri aldım. Can değilmiş zaten. Can kablo büklümlü oluyormuş, sonradan öğrendim.)

    Yada şöyle sorayım kullanacağım pic ile max232 mi kullanmam gerek yoksa 485 ise başka birşey mi? (mcu olarak 16f628a kullanabilir miyim?)

    Son olarak hattan gelen verileri uart ile okurken bu makalenin konusu olan Timer0 veya Timer1’i interrupt olarak kullanmam gerekiyor mu? Gerekiyorsa yazmam gereken programın kısaca algoritmasından bahsedebilir misiniz? Yani gelen verileri sıra ile analizörden elde ettiğim veriler ile nasıl karşılaştıracağım. Kafam çok karışmış durumda, sizin gibi birinin yol gösterimine gerçekten çok ihtiyacım var.

    Umarım sizi de bu karışık sorumlarımla sıkmamışımdır. Gerçekten çok ama çok net bilgiler veriyorsunuz. Geçen yılda Timer0 ve Timer1 kesmeleri ile ilgili içinden çıkamadığım durumu bu makaleniz üzere aşabilmiştim. Her şey için teşekkürler..

    • mikrodunya dedi ki:

      Voltaj seviyelerine bakarak rs485 veya rs232 olup olmadığına karar verebilirsiniz. 0-5V veya 0-3.3V ise max232 kullanabilirsiniz.
      Usart kullanırken timer kullanmanıza gerek yok. İstediğiniz mcu^’yu kullanabilirsiniz. 16F628A’da dahili usart modülü bulunmaktadır (donanımsal usart modülü)
      Siz verileri alırken bu verileri bir dizi içerisine kaydedeceksiniz.
      Daha sonra veri alma işlemi tamamlanınca (10 adet veri alacaksanız eğer 10. gelen verinin sonunda) elinizde bulunan verilerle tek tek karşılaştırma yapacaksınız. Eğer istediğiniz veriler sırasıyla gelmişse ona göre işlem yaptıracaksınız.

  13. Mehmet Y dedi ki:

    Hocam gelen verileri elimdeki hazır veri dizisi ile karşılaştırma yaptığım fonksiyonda veriler istediğim sırada gelmediğinde fonksiyonu (yada döngüyü) break ile mi yoksa return ile mi kesip geri göndereceğim? (daha fazla devam etmesine izin vermeden)

    Kodlarımı yorumlayabilirseniz çok sevinirim..

    char Gelen_Komut_Seti_Klima_Mi(unsigned char dizi[]) // gelen komut setini önceden tanımlı dizi ile karşılaştıran fonksiyon
    {
    char sonuc = 0;
    i=0;

    while(i<23)
    {
    if(dizi[i] == Klima_Komut_Dizisi[i]) i++;
    else
    {
    sonuc=0;
    return sonuc; //break mı olacak acaba?
    }
    return sonuc=1;
    }
    }

  14. emin dedi ki:

    Saklayıcı adreslerini de yazınıza ekleyebilir misiniz. CCS C kullanıyorum ve saklayıcı adreslerine ihtiyacım var.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s