CCS-C ile PIC Programlama, Portlar Led Buton ve Röle Kullanımı

Her ne kadar daha önceki yazılarımızda kısmen anlatmış olsakda PORT’lar ve kullanımı konusunu daha ayrıntılı olarak bu yazımıda ele alacağız.

PORTLAR

Portlar PIC denetleyicilerinde giriş/çıkış işlemleri için kullanılan yapılardır. Örneğin bir anahtarın açık/kapalı durumunu belirlemek, LED yakmak, Röle açıp kapamak, veya bir LCD ekranı sürmek için PORT’ları kullanırız. Her PIC modelinde farklı sayıda port bulunur ve bu portlar farklı büyüklüklerde olabilir. Büyüklükten kastımız PORT’un kaç bit olduğudur.

Kullandığınız denetleyicinin teknik dökümanına bakarak kaç porta sahip olduğunu öğrenebilirisiniz. Portlar A,B,C….F gibi harflerle isimlendirilir, PORTA, PORTB, PORTC gibi. Aşağıdaki resim 16f628A Denetleyicisinin pin bağlantılarını göstermektedir.

Resimde de görüldüğü gibi PIC 16F628A Denetleyicisi PORTA, ve PORTB olmak üzere iki adet porta sahiptir. PORTB RB0…..RB7 olmak üzere 8 Bit, PORTA ise RA0….RA5 olmak üzere 6 Bit’tir.

RB0….RB7, RA0….RA5 PORT’ları oluşturan PIN’lerdir. Bir PIN önündeki <—-> simgesi, o PIN’in hem giriş hem de çıkış olarak kullanılabileceğini —-> simgesi ise sadece giriş olarak kullanılabileceğini gösterir.

CCS-C derleyicisinin kullanımını öğrenmek kadar PIC Donanımlarını da çok iyi öğrenmek gerekir. Donanım tecrübesi olmadan bilgisayarda simulasyonla PIC programlama öğrenmek iyi birşey değildir. Bu yüzden en temel seviyede donanımların ne iş yaptıklarını ve nasıl bağlanacaklarını elimden geldiğince anlatmaya çalışacağım.

Yukarıdaki resimde gördüğünüz gibi PORT PIN’lerinin yanında başka şeylerde yazmakta. RB3/CCP1 ve RB0/INT gibi. Bu ifadeler bu pinlerin alternatif kullanımlarını göstermektedir RB3/CCP1 ifadesi 9 nolu bacaktan PWM sinyali üretebileceğimizi, RB0/INT ifadesi ise 6 nolu bacağın Harici Kesme girişi olduğu belirtir.

Demekki PIC denetleyicilerinde bazı PIN’leri farklı farklı amaçlar için kullanabiliriz. Bu tamamen bizim ihtiyacımıza ve tercihimize kalmış.

GİRİŞ ÇIKIŞ AYARLAMALARI

Bir portun istediğiniz PIN’ini giriş istediğinizi de çıkış yapabilirsiniz. Bu işlemi gerçekleştirmek için ilgili portun TRIS Register’ini ayarlamanız gerekir.

16f628A TRIS Register adresleri TRISA = 0×85 TRISB = 0×86

Bir pini giriş yapmak için ilgili TRIS biti 1 yapılır
Bir pini çıkış yapmak için ilgili TRIS biti 0 yapılır

Şimdi B portunun tüm PIN’lerini giriş yapmak istersek TRISB = 0xff yapmamız gerekir. Bunu gerçekleştirmek için set_tris_x() fonksiyonunu kullanabiliriz

#include <16f628a.h>
main()
{
set_tris_b(0xff); // B portu komple giriş
}

Bu ayarlamayı hazır fonksiyon kullanmadan da yapabiliriz. Bunun için öncelikle TRISB Register’ını programımızda tanımlayıp daha sonra değer atamamız gerekir

#include <16f628a.h>
#byte TRISB = 0x86  // TRISB 0x86 adresindedir

main()
{
TRISB = 0xff;  // B portu komple giriş
}

Başka örnekler

set_tris_a(0b00001010);  // A1,A3 giriş diğerleri çıkış
set_tris_b(0xf0); //B0...B3 Çıkış, B4...B7 giriş
set_tris_c(0x55); //C0,C2,C4,C6 giriş C1,C3,C5,C7 Çıkış

Portlarla ilgili bazı önemli bilgiler.

  • Her bir Giriş/Çıkış PIN’inden çekilebilecek veya bu PIN’e akabilecek maksimum akım 25mA’dir
  • RA4 TOCKI PIN’i Open Collector Output olduğundan, bu pini çıkış olarak kullanmak istediğinizde bir direnç ile beslemeye pull-up yapmanız gerekir.
  • PORTB Dahili pull-up dirençlerine sahiptir ve bu dirençler yazılım ile devreye sokulabilir.
  • Kullanılmayan pin’lerin çıkış olarak ayarlanması gerekir

DONANIM BAĞLANTILARI

Ledler

Bir ledi PIC’e iki şekilde bağlayabilirsiniz. Led’lere besleme verirken bu işlemin bir ön direç ile yapılması gerektiğini unutmayınız. Dirençsiz bağlarsanız led aşırı akımdan dolayı kullanılamaz hale gelecektir. Ledlerin büyük çoğunluğu maksimum 20mA akım ile çalışacak şekilde üretilirler. Led öndirencinin nasıl hesaplanacağını bilmiyorsanız buraya bir göz atın

RB0′a bağlanan LED-1′i yakmak için RB0 = “0″ yapılır, söndürmek için “1″ yapılır

RB3′e bağlanan LED-2′yi yakmak için RB3 = “1″ yapılır, söndürmek için “0″ yapılır

Röleler

Aşağıdaki şemada yaygın olarak kullanılan PIC ile röle sürme devresi görülmektedir.

RB7 = “1″ yapıldığında röle çeker, “0″ yapıldığında bırakır.

VCC voltajı rölelin çalışma votajıdır ve röle modeline göre değişir.

Butonlar

Aşağıdaki şemada da görülebileceği gibi butonlar da iki farklı şekilde PIC’re bağlanabilir.

Buton bağlanan bacaklar giriş olarak ayarlanmalıdır. Yukarıdaki şemaya göre, Buton-1 basıldığında RA2 = 0 olur. Buton-2 basıldığında RB2 = 1 olur. Bu değerler yazılım ile okunarak butonun basılıp basılmadığı tespit edilebilir.

TOPLU ÖRNEK – ISIS ÇİZİMİ VE KODLAR

ISIS Proje dosyasını indirmek için tıklayın test_project

LED-1 RB7′de
LED-2 RB6′da
BUTON-1 RA0′a
BUTON-2 RA1′de
RÖLE RB5′te Bağlı

Örnek

Şimdi 1 nolu butona basılı tutulduğu sürece 1 nolu ledi yakan, buton bırakıldığında söndüren. 2 Nolu butona basıldığında ise bırakıldığında 2 Nolu ledin durumunu değiştiren programı yazalım. Devre ilk açıldığında da rölemiz 2 saniye çekip bıraksın.


#include <16f628a.h>
#use delay(clock=4000000)

#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT

void main(void)
{
set_tris_a(0x03);  //A0,A1 giriş diğerleri çıkış
set_tris_b(0x00);  //B portu komple çıkış
output_low(PIN_B7);
output_high(PIN_B6);

output_high(PIN_B5)   //Röle çeksin

delay_ms(2000);  // 2 sn bekle

output_low(PIN_B5)   //Röle bıraksın
while(TRUE) // Sonsuz döngü
{
if(input(PIN_A0)==0 )  //Buton-1 basılımı?
{
output_high(PIN_B7); // Ledi yak
while(input(PIN_A0)==0); // Butonun bırakılmasını bekle
output_low(PIN_B7); // Ledi söndür
delay_ms(25);  //debounce süresi
}

if(input(PIN_A1)==1 )  //Buton-2 basılımı?
{
while(input(PIN_A1)==1); //Butonun bırakılmasını bekle
output_toggle(PIN_B6);  //Led'in durumuu değiştir
}
}
}

Şimdi aynı işi yapan kodu daha profosyonelce yazalım


#include <16f628a.h>
#use delay(clock=4000000)

#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT

#byte PORTA = 0x05
#byte PORTB = 0x06
#byte TRISA = 0x85
#byte TRISB = 0x86

#bit LED1 = PORTB.7
#bit LED2 = PORTB.6
#bit BUTON1 = PORTA.0
#bit BUTON2 = PORTA.1

void main(void)
{
PORTA = 0;
PORTB = 0;
TRISA = 0x03;  // A0, A1 girişi
TRISB = 0x00;  // Komple Çıkış

LED1 = 0;  // LED1 söndür
LED2 = 1;  // LED2 Söndür

while(TRUE) // Sonsuz döngü
{
if(!BUTON1)  //Buton-1 basılımı?
{
LED1 = 1; // Ledi yak
while(!BUTON1); // Butonun bırakılmasını bekle
LED1 = 0;       // Ledi söndür
delay_ms(25);  //debounce süresi
}

if(BUTON2)  //Buton-2 basılımı?
{
while(BUTON2); //Butonun bırakılmasını bekle
LED2 = !LED2;  //Led'in durumunu değiştir
delay_ms(25);  //debounce süresi
}

}

}

Buton kullanımıyla ilgili ipuçları

  • Gerçek devrelerinizde asla butonları bir kez okuyarak durumları değişmiş kabul etmeyin. En az 100 defa basılmışmı veya bırakılmış mı diye kontrol ettirin. Bu şekilde yapmazsanız dışarıdan gelebilecek parazitler olumsuz etki yapar.
  • Elinizi butondan çekerken bounce (zıplama) denilen hadise nedeniyle ikinci bir basış gerçekleşebilir. Buda bozuk çalışmaya neden olabilir. Bu durumun önüne geçmek için buton bırakılması tespit edildiğinde belirli bir gecikme süresi konur. Yukarıdaki kodlarda 25ms gecikmeler bu amaçla konmuştur.

Yazımızı burada noktalıyoruz. Anlamadığınız yerler olursa sormaktan çekinmeyin

CCS-C ile PIC Programlama, Portlar Led Buton ve Röle Kullanımı yazısı için 73 yorum yapıldı

  1. [...] 01- CCS-C ile PIC Programlama Dersleri – Giriş 02- PIC Mikro Denetleyicilerini Tanıyalım 03- CCS-C Derleyicisi Resimli Anlatımı 04- Genel C Dili Anlatımı Ders – 1 05- Genel C Dili Anlatımı Ders – 2 06- Genel C Dili Anlatımı Ders – 3 07- CCS-C’nin Dahili Fonksiyonları PIC Portlarının Kullanımı 08- Bit ve Byte Seviyesi İşlemler İçin Kullanılan Dahili Fonksiyonlar 09- Derleyici Önişlemci Direktifleri – 1 10- Derleyici Önişlemci Direktifleri – 2 11- Derleyici Önişlemci Direktifleri – 3 12- Gecikme (Delay) Fonksiyonları ve Kullanımı 13- PIC çalıştırılırken yapılması gereken bağlantılar 14- PORTLAR, Led, Röle ve Buton kullanımı [...]

  2. ahmed says:

    merhaba, bir sorum olacaktı.

    #byte PORTC=0×07 diye tanımladığımızda, hangi banktaysa onun 7.register ini mı tanımlıyor? Ya ben 0.değil de 1.banktaysam o zaman PORTC yi aslında TRISC olarak tanımlamış olmam mı? CCS de bank kontrolü var mı? teşekkürler. (pic16 serisi)

  3. Emrah AYDIN says:

    Merhaba
    CCS de bank kontrolü otomatik olarak yapılmaktadır.
    #byte PORTC = 0×07 // portc tanımlaması için
    #byte TRISC = 0×87 // TRISC tanımlaması için

    aşağıdaki örneğe bakalım

    TRISC = 0×03
    PORTC = 0;

    Bu iki satır koda karşılık ccs nin ürettiği asm koduna bakarsak bank kontrolünü görürüz

    ……………….. TRISC = 0×03;
    *
    0103: MOVLW 03
    0104: BSF 03.5 // bank 1 seçiliyor
    0105: MOVWF 07
    ……………….. PORTC = 0;
    0106: BCF 03.5 // bank 0 seçiliyor
    0107: CLRF 07

    Kolay gelsin

  4. elseus says:

    Hocam dersler super gidiyor.Bir sonraki dersi beklerken vakit geçmek bilmiyor :)
    Birde konu dışı olacak ama benim acil olarak 2 adet 16f877 yi gps lerde kullanılan NMEA formatında haberleştirmem gerekiyor.İnternette o kadar aramama rağmen ccs c olarak kaynak bulamadım sıkıştım kaldım.Bu konuda yardımcı olursanız çok müteşekkir olacağım.Konuyu takip eden arkadaşlardanda yardımcı olabiecekler varsa süper olur.Buradan veya mailimden cevabınızı sürekli takipte olacağım.İlgilenirseniz çok makbule geçecek.Teşekkürler iyi çalışmalar…

  5. Emrah AYDIN says:

    @elseus
    Benim bu konuda herhangi bir projem olmadı. Ama internette yok değil. Şu sayfada var mesela nmea haberlşmesi örneği. Kod ccs-c de yazılmış
    http://www.vermontficks.org/pic.htm

  6. elseus says:

    Hocam ilgine tesekkurler fakat oraya baktım forumlarınıda okudum ama benim işimi görecek birşey bulamadım.pic basic te serin – serout komutlarıyla bu iş yapılıyormuş.bu komutların ccs c de karşılığı varmıdır.yani değerleri ben zaten kendim sabit olarak gireceğim,bana bir nmea cumlesini
    (örnek: $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A)
    diğer pic e gonderme metodu gerekiyor.string olarak yollamaya çalışıyorum ama bir yerlerde yanlış yapıyorum anlaşılan :( string ve stream konularında zayıfım malesef :(

  7. Emrah AYDIN says:

    @elseus
    RS-232 haberleşmesi lazım sana anladığım kadarıyla. Derslerde o konuyu ele almadık daha :) . Yine interneti önereceğim sana. CCS-C ile rs232 haberleşme konusunu ara. Yaptığın örnek kodu bana gönderirsen kodu inceleyip yardım ederim. admin@teknobakis.com

  8. elseus says:

    hocam kodları ve proteus smilasyonunu mailinize yolladım.fırsat bulup bakabilirseniz vatana milletede hayırlı bir işte kullanılacak :)
    sadece lcd ye yazdırdığımız nmea stream ini diger picin lcd sine de yazdırabilirseniz gerisini halledeceğim inşallah…teşekkur ediyorum.

  9. Emrah AYDIN says:

    en kısa zamanda bakmaya çalışacağım elseus.

  10. rukneddin says:

    s.a.

    arkadaşım bir sorum olacaktı.

    TIMER0 ve TIMER1 kesmelerini aynı anda eşzamanlı olarak başlatmak mümkün müdür? elki 1-2 saykıl tolere edebiliriz. ?

  11. Emrah AYDIN says:

    Her iki kesmeyi aynı anda kullanabilirsin. Ama ikisi de aynı anda kesme verirse ilk olarak biri değerlendirilecektir. Bu önceliği sen belirleyebilirsin. Kodun başına
    #priority timer0,timer1
    satırını yazarsan timer0 ve timer1 aynı anda kesme oluşturduğunda ilk önce timer0 değerlendirilir.
    Bu belirtmeyi yapmazsan CCS-C kendi sırasına göre değerlendirir.

    İki kesme kodu aynı anda çalışmaz. Gerek mikro denetleyicilerde olsun gerekse Pc işlemcilerinde; aynı anda sadece bi komut işletilir.

    Eğer kesmelerin devreye alınmasını kastetdiysen

    enable_interrupts(INT_TIMER0);
    enable_interrupts(INT_TIMER1);
    disable_interrupts_global(); // tüm kesmeler kapalı

    set_timer0(10); // timer0 istenilen değere ayarlanıyor
    set_timer1(2000); //timer1 istenilen değere ayarlanıyor
    enable_interrupts(GLOBAL); // tüm kesmeler dolayısıyla timer0 ve 1 dedahil kesme enable ediliyor.

    Kolay gelsin

  12. rukneddin says:

    s.a. sağol cevap için. iki sorum daha olacaktı.

    1.
    yazdığımız komutların belli bir kısmının ya da tamamımın ne kadar zamanda icra edildiğini (kaç komut çevrim süresinde) compiler bize söyleyebiliyor mu? yoksa assemblysinden biz mi hesaplarız. 2. proje oluştururken “multiple complation units” olayı nedir? teşekkürler…

  13. Emrah AYDIN says:

    @rukneddin
    1- Bildiğim kadrıyla böyle bir imkan yok, C/ASM list dosyasından asm kodlarına bakarak hesaplamak gerekiyor.
    2- Multiple compilation units windowstaki dll olayı gibi birşey. Projedeki tüm unit’ler ayrı ayrı compile edilerek object file (*.o) dosyaları oluşturulur. Projede kaynak olarak bu object dosyaları kullanılarak oluşturulur.
    CCS-C’nin examples klasöründe mcu.zip diye bir dosya var. içerisinde Multiple Complation Unit örneğini içeren bir proje ve pdf dosyası bulacaksın.

    Kolay gelsin..

  14. elseus says:

    Hocam bir umut saat başı mail kontrolu yapıyorum:)
    hala cozemedim :(
    yardımınızı bekliyorum.

  15. Emrah AYDIN says:

    @elseus
    mail attım tekrar

  16. Hüseyin says:

    Merhabalar hoca step motor ile ilgili mailime cevap yazdıgınız için teşekkurler ben sorunu hallettim tmr0 kesmesi kullanarak hallettim kolay gelsin

  17. Emrah AYDIN says:

    @huseyin
    Eyvallah, zaten senin sorununu tam olarka anlamamıştım öyle gördüğüm kadarıyla yazdım. Sorunu halletmene sevindim. Yardım edebileceğim bir nokta olursa çekinme.
    Kolay Gelsin…

  18. Nytrogeen says:

    Merhaba, iki sorum olacaktı:
    1)ben CCS de pic wizard ı kullanarak timer_0 için bir gecikme süresi belirleyebiliyorum ama bunu daha sonra nasıl değiştirebilirim?
    2) Daha önce assembler da yazıyordum ve MPLAB kullanarak ICD kullanmadan yazdığım programın adım adım simulasyonunu yapabiliyordum. CCS de böyle bir imkanım varmı? Ayrıca microchip firmasının ICD-2 kiti olmasına rağmen bir türlü bağlantı yapamıyorum programla. Ben hata mı yapıyorum bilmiyorum kendi üretimleri olan ICD ile mi çalışıyor sadece?
    Şimdiden teşekkür ederim, ayrıca dersler çok faydalı olmuş ben C diline sizin sayenizde geçtim.

  19. Emrah AYDIN says:

    @nytrogeen
    timer0 a ait süreyle oynamak istiyorsan
    setup_tiemer0() fonksiyonunu kullanman gerekir.
    Örneğin
    setup_timer0(RTCC_INTERNAL@RTCC_DIV_2);
    Bildiğin gibi timer sürelerini çalışma frekansın etkiliyor. Zaten pic wizard kısmında bunu gorebiliyorsundur. setup_timer0() fonksiyonuyla prescalar değerini belirleyebiliyorsun.

    Örnek:
    clock sinyalimiz 20 Mhz olsun

    setup_timer0(RTCC_INTERNAL,RTCC_DIV_1) // timer 51.2 us
    setup_timer0(RTCC_INTERNAL,RTCC_DIV_4) // timer 204 us
    setup_timer0(RTCC_INTERNAL,RTCC_DIV_256) // timer 13.1 ms

    ICD için kodun başına şu satırı ekle
    #device ICD = TRUE

    Kolay Gelsin

  20. Hüseyin says:

    Merhaba teşekkur ederim hocam ccs c yi sizinle takip etmeye devam edecegim yardımlarınız için sagolun size de kolay gelsin

  21. Hüseyin says:

    Merhaba hocam yine ben bir sorum olacaktı ben PIC12C508 ile step motor ileri geri programını yazmak istiyorum giriş – çıkış işlemlerinin nasıl yapılacagını bilmiyorum yardım ederseniz memnun olacağım teşekkurler

  22. Emrah AYDIN says:

    @huseyin
    Bu yazıda giriş çıkış işlemlerinin nasıl yapılacağı anlatılıyor. 12c508 gibi tek portu olan denetleyicilerde port adı GPIO olarak geçiyor. Bu portun giriş çıkış ayarlarını set_tris_b() fonksiyonu ile yapabilirsin.
    Kolay gelsin

  23. nuray says:

    Merhabalar bu projenin yazılımını mikro ci yapıldı acaba….

  24. Emrah AYDIN says:

    @nuray tam olarak ne sorduğunuzu anlayamadım, mikro c için herhangi bir bilgi yok sitemizde maalesef

  25. Ahmet KUYSAL says:

    assembly dilinde kronometreyi nasil gerçekleyebiliriz yardım edebilir misiniz??

  26. Emrah AYDIN says:

    assembly için yardımcı olamayacağım maalesef

  27. yaren says:

    hocam ne hoş bir site hazırlamışsını allah razı olsun. ben ilk olarak asembly de pic simülasyonu ile uğraşıyordum fakat uygulamada sıkıntı oluşturdu bu yüzden ccs ‘e geçtim. karşılaştığım problem de yukarıdaki profosyenel olan programda hex ‘i oluşturuyor fakat diğer amatör olanda delay_ms(2000) ve while(TRUE) komutlarında hata vermekte. yardımınıza ihtiyacım var şimdiden çok teşekkür ederim.

  28. Emrah AYDIN says:

    Sağol yaren
    while ve delay’ın üstündeki
    output_low(PIN_B5) ve output_high(PIN_B5) komutlarında sonuna ; (noktalı virgül) koymayı unutmuşum sorun oradan kaynaklanıyor. noktalı virgülleri ekle hata vermez, şuradakş yazıya da göz atmanı tavsiye ederim http://www.teknobakis.com/ccs-c-ile-pic-programlama-temel-c-bilgisi-1
    kolay gelsin

  29. yaren says:

    sa. hocam portların tümünü nasıl kontrol edebilirim. yani toggle uygulaması için ben tüm b portunu terslemek istiyorum örneklere baktım hep tek tek pinleri ele alıyor. ayrıca geçenki cevabınız için teşekkürler.

  30. yaren says:

    aryıca başka bir sorumda 877 kullanırken config ayarları ve
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T1_DISABLED,0,1);
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_CCP1(CCP_OFF);
    setup_CCP2(CCP_OFF);
    komutlarını yazıyoruz bunları
    16f84a da yazdım hata verdi bende yazmadan hex oluşturdum pic e yüklerken bir sıkıntı oluşturmaz değilmi ?

  31. Emrah AYDIN says:

    a.s yaren
    output_b( ~(input_b()) ); // b’den okunan değerin terslenmişini tekrar b’ye yazar… yani b portunun pinlerinin durumunu toggle yapar. Sitedeki temel c bilgisi yazılarını okumanı tavsiye ederim.
    yukarıda yazdığın kodun 16f84 te sorun yapması normal, çünkü onda olmayan donanımları ayarlamaya çalışıyorsun. bunları boşver kodunu yazıp derlediysen sorun yok..

    kolay gelsin…

  32. yaren says:

    void main(){ //giriş çıkış belirlendi…
    etiket:
    int i=255;
    devam:
    while(i!=0)
    {
    output_high(pin_b0);
    i–;
    }
    if(i==0){goto etiket;}
    goto devam;
    }
    hocam böyle bir satırda i 8 bitlik bir veri tanımlıyorum fakat hata veriyor. PWM uygulaması için
    tahmin edersin diğer bir 8 bitlik veri kadar da
    output_low(pin_b0); yapacaktım hatam nedendir teşekkürler.

  33. Emrah AYDIN says:

    @yaren
    i-; burası yanlış i’yi bir azaltmak istiyorsan i–; yada –i; demelisin.

    maalesef uzunca bir zamandır siteye vakit ayıramıyorum, dersleri tamamlasaydım pwm konusunuda işlemiş olacaktık

  34. Fatih says:

    WordPress yorumlarında iki tane “-” bir “-” olarak mı görünüyor yoksa!

    i değişkenini bir azaltmak için –i veya i– kullanılabilir.

  35. Fatih says:

    Evet, wp nin işgüzarlığı, iki tane eksi işaretini bir tane yapıyor. Yorum kirliliği için özür.

    Yaren, pwm için donanım pwm modülünü neden kullanmıyorsun? Kullanmak istemiyorsanız for döngüleriyle daha kolay olur, şöyle mesela:

    while(1){

    output_high(pin_b0);
    for(i=0;i<=ON_TIME,i=i+1){
    delay_x
    }

    output_low(pin_b0);
    for(i=0;i<=OFF_TIME,i=i+1){
    delay_x
    }

    }

    delay miktarını istediğiniz pwm frekansına göre ayarlamılısınız, 10us uygun olabilecek ortalama bir değer. ON_TIME, OFF_TIME degiskenleri yerine “duty” ve “100-duty” gibi birbirine bağlı degerler de kullanabilirsiniz. İyi çalışmalar.

  36. yaren says:

    hocam teşekkürler bende bunu yapmaya çalışıyordum farklı bir alt programlarda bekletme yapıyorum fakat değişkenleri ortak olarak tanıtma da sıkıntı oluşturuyordu. yorum kalabalığı için özür diliyorum. bilgi paylaşıldıkça değerlidir.

  37. bubble says:

    merhaba;

    basicte oldugu gibi ccs te de seri haberleşme komutu varmıdır. ornek vereyım.
    2 pic var a picinden b picine tek pin üzerinden veri aktaricam fakat b picinin tx rx ucunu kullanarak pc ye veri gönderiyorum şimdi soruma gelınce a dan b ye tek pin uzerinden hangi komutla veri gönderebilirm.

  38. dadaş says:

    Bir pini giriş yapmak için ilgili TRIS biti 1 yapılır
    Bir pini giriş yapmak için ilgili TRIS biti 0 yapılır
    sanırım gözününden kaçmış yada ben de bi sorun var
    Bir pini çıkış yapmak için ilgili TRIS biti 0 yapılır

  39. dadaş says:

    slm emrah kardeş çapımca bişeyler yapmaya çalışırken tıkandım kaldım yardım edersen sevinirim.problem şu 16f628a ile iki buton ile iki röle sürme.birinci butona basıldığında röle kontaklarını çekecek tekrar basıldığında bırakacak.ikinci butona basıldığı sürece röle kontaklarını çekecek bırakıldığında bırakacak.(bu devrenın röle yerine ledlerle yapılmışı var yalnız röle bağlayınca çıkışlara proteusta hata veriyor)

  40. Emrah AYDIN says:

    Merhaba dadaş

    #define ROLE1 PIN_A0
    #define ROLE2 PIN_A1
    #define BUTON1 PIN_B0
    #define BUTON2 PIN_B1

    while(true)
    {
    if(input(BUTON1)) // buton1 basıldıysa
    {
    output_toggle(ROLE1); // role1'in durumunu değiştir
    while(input(BUTON1)); // butonun bırakılmasını bekle
    }
    if(input(BUTON2)) // buton2 basıldıysa
    {
    output_high(ROLE2); // role2 aktif et
    while(input(BUTON2); // butonun bırakılmasını bekle
    output_low(BUTON2); // buton bırakıldığında roleyi kapat
    }

    }

  41. dadaş says:

    emrah kardeş ilgine ve yardımına çok tsk ederim.okulda sıkıcı gelen bu kodlarla şimdi birşeyler yapmam oldukça zevkli gelior tıkanana kadar sayenisde bu sorunlarıda aşınca ilgim dahada artıyor takrar tsk

  42. dadaş says:

    kardeş sanırım kodlarda bir sorun var yada ben anlatamadım tam anlamıyla iki buton ile iki röle yada led farketmes sürmek istiorum
    şart 1-)buton 1 e birkes basıp bıraktığımısda röle1 kontaklarını çekecek ve öyle kalacak
    şart 2-)buton 1 e tekrar basıp bıraktığımısda röle kontaklarını bırakacak
    şart 3-)buton2 ye basılı olduğu sürece röle kontaklarını çekecek.
    yukarıdaki kodda butonlardan birine bastığımısda röle kontaklarını çekiyor fakat tekrar bastığımısda bırakmıyor umarım derdimi anlatabilmişimdir

  43. Emrah AYDIN says:

    imkanı yok, her defasında toggle fonksiyonu çalışacağından dolayı port 1 ise 0, 0 ise 1 olacak. eğer gerçek devre üzerinde deniyorsan buton basmalarını bu şekilde kontrol ettirmek çok sağlıklı olmaz. Devreni yada kodunu paylaşırsan daha iyi yardımcı oluruz. Belki kodunda bir sıkıntı vardır.

  44. dadaş says:

    #include “C:\Documents and Settings\dadas\Desktop\Yeni Klasör (7)\Yeni Klasör (2)\Yeni Klasör\askım4.h”

    void main()
    {

    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    //Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

    // TODO: USER CODE!!
    #define ROLE1 PIN_A0
    #define ROLE2 PIN_A1
    #define BUTON1 PIN_B0
    #define BUTON2 PIN_B1

    while(true)
    {
    if(input(BUTON1)) // buton1 basıldıysa
    {
    output_toggle(ROLE1); // role1′in durumunu değiştir
    while(input(BUTON1)); // butonun bırakılmasını bekle
    }
    if(input(BUTON2)) // buton2 basıldıysa
    {
    output_high(ROLE2); // role2 aktif et
    while(input(BUTON2)); // butonun bırakılmasını bekle
    output_low(BUTON2); // buton bırakıldığında roleyi kapat
    }

    }
    }

    #include

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES INTRC //Internal RC Osc
    #FUSES PUT //Power Up Timer
    #FUSES PROTECT //Code protected from reads
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOMCLR //Master Clear pin used for I/O
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection

    #use delay(clock=1000000,RESTART_WDT)
    #use rs232(baud=9600,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8)

  45. dadaş says:

    resmi paylaşmayı bilmediğim için gönderemedim bu devrenin assembly dilinde hazır kodları var ısıste denedim çalışıyor fakat bisim yasdığımıs kodlarla denediğimde buton basılı kaldığı sürece çıkış almak istediğis pın sürekli çıkış verio devreye ilk voltaj anında led sönük birkes bastığımısda led yanıyor bir daha sönmüyor yani buton tek seferlik işlem yapıor kafayı yiycem nerde yanlış yapıorum die

  46. dadaş says:

    ve bu compile programında bir iki anlamadığım şeyde var onlarıda sormak istiyorum
    #use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=8)
    bu nedir neyin ayarıdır sürekli derleme anında hata veriyor ayarıyla oynanmadığı sürece. ben seri porttan programlıyorum pıc leri kendi yaptığım bir devre(multı pıc program 5v2)

  47. dadaş says:

    slm.emrah kardeş daha önceden yayınlamış olduğunus bir örnekten yola çıkarak yazdığım aşağıdaki kodlar işimi gördü ama hala daha merak ediyorum bilgilerine güvenerek senin verdiğin kodlarla neden yapamadım.amacım nerde yanlış yaptığımı öğrenmek bir sonraki yanlışlarıma çözüm yolu açmak allaha emanet ol

    #include “C:\Documents and Settings\dadas\Belgelerim\Yeni Klasör\mhm1.h”

    void main()
    {

    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    //Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

    // TODO: USER CODE!!

    while(TRUE) // Sonsuz döngü
    {
    if(input(PIN_A0)==1 ) //Buton-1 basılımı?
    {
    output_high(PIN_B0); // Ledi yak
    while(input(PIN_A0)==1); // Butonun bırakılmasını bekle
    output_low(PIN_B0); // Ledi söndür
    delay_ms(25); //debounce süresi
    }

    if(input(PIN_A1)==1 ) //Buton-2 basılımı?
    {
    while(input(PIN_A1)==1); //Butonun bırakılmasını bekle
    output_toggle(PIN_B1); //Led’in durumuu değiştir
    }
    }
    }

  48. Emrah AYDIN says:

    @dadas

    #define ile baslayan kısımları main programının dışına yaz
    #fuse ‘larıda main’in dışında yukarıda belirt.

    #use rs232(……) bu direktif RS232 haberleşmesi yapmak için kullanılır CCS-C de. RS232 kullanmayacaksan o satırı kapat veya hiç yazma.

  49. dadaş says:

    tsk emrah.aklıma gelmişti ama pıc wizord sihirbasında bu mümkünmü değilmi bilmediğim için öyle yapmıştım fuse ayarlarını zaten main üstünde belirtiyorum.rs232 direktifini sanırım programda birden fasla pıc kullanacaksak bu iki pıc arasında haberleşmeyi veri giriş çıkışı yapmak için kullanılıo hangi pinler arasında haberleşme sağlayacaksak onuda bu direktifte yine ayarlıyoruz bir nevi postacı gibi birşey anladığım kadarıyla.(pc hariç bazı elektronik cihazların arkasında neden rs232 vardır merakımıda gidermiş oldum bu arada.çok yeniyim daha basını çok ağrıtıyorum biliyorum yorum kalabalığı için özr allaha emanet ol

  50. ahmet says:

    hocam kolay gelsin bir
    sorum olacaktı yardımcı olursanız sevinirim… pic ile lcd de menü oluşturmak istiyorum menüde
    4 adet seçenek olacak ve her seçenekte de iki tane alt seçenek olacak
    örneğin: anahtar 1 için A’ya basın anahtar 2 için B ye basın gibi…(bu bir kumanda olacak)
    alt seçenekte de 1-anahtarı aç,2-anahtarı kapa gibi…bunu pic ile yapmam mümkün mü?kontrolünü yapacağım yükleri ve lcd yi aynı anda tek bir pic ile
    kontrol ede bilir miyim???yani kumanda kısmı ve lcd kısmı aynı picte yapılabilir mi
    örneğin pic 16f877 ile…lcd kısmı kumanda kısmında olacak ve yapabileceğim fonksiyonları lcd de menü halinde göreceğim bu mümkün mü???kumanda için keypad mi kullanmalıyım???
    yardımcı olursanız çok sevinirim teşekkürler iyi çalışmalar…

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>