Şimdi Ara

PİC Delaysız Bekletme Nasıl Yapılır?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
5
Cevap
0
Favori
634
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Pic bilen arkadaşlar picte delay komutu kullanmadan pici istediğimiz süre bekleyebilir miyiz. Böyle bir imkan var mı. Ccs c kullanıyorum. Ben araştırdım ama bulamadım o tarz birşey mesela led yakıp söndürcez ama arada delay olmucak ?



  • Bu iş için iki tane dosya oluşturmalısın (gecikme kütüpnesi) delay.h ve delay.c adlarında ve projende kullanmak için delay.h dosyasını #include delay.h yaparak çağırmalısın.


    delay.h kodları

    quote:


    #ifndef XTAL_FREQ
    #define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */
    #endif

    #define MHZ *1000L /* number of kHz in a MHz */
    #define KHZ *1 /* number of kHz in a kHz */

    #if XTAL_FREQ >= 12MHZ

    #define DelayUs(x) { unsigned char _dcnt; \
    _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
    while(--_dcnt != 0) \
    continue; }
    #else

    #define DelayUs(x) { unsigned char _dcnt; \
    _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
    while(--_dcnt != 0) \
    continue; }
    #endif

    extern void DelayMs(unsigned char);




    delay.c kodları

    quote:



    #include "delay.h"

    void
    DelayMs(unsigned char cnt)
    {
    #if XTAL_FREQ <= 2MHZ
    do {
    DelayUs(996);
    } while(--cnt);
    #endif

    #if XTAL_FREQ > 2MHZ
    unsigned char i;
    do {
    i = 4;
    do {
    DelayUs(250);
    } while(--i);
    } while(--cnt);
    #endif
    }




    örnek kullanımı



    quote:



    #include <htc.h>
    #include "delay.h" // Gecikme kütüphanesi
    void main(void) // Ana fonksiyon alanı
    {
    char led=1; // led Ģeklinde bir sabit tanımlanıyor
    TRISB=0x00; // PORTB çıkıĢ olarak yönlendiriliyor
    PORTB=0x00; // PORTB'nin tüm çıkıĢları sıfırlanıyor
    for(;;) // Sonsuz döngüye giriliyor
    {
    PORTB=led; // PORTB led değiĢkenine eĢitleniyor
    led=led<<1; // led birimi bir sola kaydırılıyor
    DelayMs(100); // 100ms bekleniyor
    if(led==0x80) // Eğer PORTB=0x80 olursa alt iĢlemlere
    geçiliyor
    {
    for(;;) // Tekrar sonsuz döngüye giriliyor
    {
    PORTB=led; // PORTB led değiĢkenine eĢitleniyor
    led=led>>1; // led birimi bir sağa kaydırılıyor
    DelayMs(100); // 100ms bekleniyor
    if(led==0x01) // Eğer PORTB=0x01 olursa ikinci
    sonsuz döngüden
    break; // birinci sonsuz döngüye giriliyor
    }
    }
    }
    }





  • Öyle şeyler Ccs c' de değil datasheet te yazar. Sorunun yanıtı kesme (interrupt). Delay olmadan led yakıp söndürmek için önce timer kurarsın istediğin zamana göre ve timer kesmesini aktif edersin. Zaman dolunca kesmeye gider, sen de ledi yakıp söndürürsün. Program kesmeye gidene kadar yazdığın diğer kodlar çalışmaya devam eder.
  • Arkadaşında dediği gibi timer kesmelerini kullanmalısın. CCS C den ziyade MPLAB ile yapman sana MCU üzerinde daha çok hakimiyet sağlamana yardımcı olacaktır.
  • Cevap veren arkadaşlara çok teşekkür ediyorum. Okulda MPLAB ile göstermediklerinden dolayı bir fikrim yok, kodlama dilinde galiba çok az farklılıklar var. Şuan kesmeleri araştırıyorum. Umarım istediğim sonuca ulaşırım.



    < Bu mesaj bu kişi tarafından değiştirildi ogzcndyr -- 20 Aralık 2014; 22:05:49 >
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.