PIC Buton ile Led Yakma

memince

Üye
Katılım
14 Tem 2019
Mesajlar
10
Puanları
1
Merhabalar PIC proglamaya yeni başladım ve derslerini de yeni görmeye başladım.Şöyle bişey yapmam gerekiyor ccs c ile. Butona 10 kere basınca led yanacak(10 kere basmayınca yanmayacak).yanınca da 100 kere yanacak tekrar başa dönecek. Proteus ta devreyi böyle kurdum.Fakat yeni başladığım için pek beceremedim. Yardımcı olabilecek var mı? Nasıl yapabilirim?(16F877 kullandım)
 
Devre kurulumun doğru bir algoritma tasarlaman gerekecek 10 değilde 5kere bas uzun olmasın ver her bastığında (bir değişken tanımla ) bu değişken bir artsın ve 5. basmanda led yansın. süre koy yandıktan sonra sönsün veya yine yandıktan sonra 3kere basınca veya 5 kere basınca sönsün


-------------------------------------------------------------------------------------------------------------------------
youtube üzerinde pıc ve arduino videolar çekiyorum abone olup göz atabilirsin
 
kodu gönderebilirim
üstünde değişiklik yapıp kullana bilirsin 4 düğme bağlantısı dijital 9 çıkış
Kod:
#include <Arduino.h>

#include <Wire.h>

#include <SoftwareSerial.h>



double angle_rad = PI/180.0;

double angle_deg = 180.0/PI;

double adana;



void setup(){

    adana = 0;

    pinMode(4,INPUT);

    pinMode(9,OUTPUT);

}



void loop(){

    if(((digitalRead(4))==(1))){

        adana += 1;

    }

    if(((adana)==(10))){

        for(int __i__=0;__i__<100;++__i__)

        {

            digitalWrite(9,1);

            _delay(1);

            digitalWrite(9,0);

            _delay(1);

            adana = 0;

        }

    }

    _loop();

}



void _delay(float seconds){

    long endTime = millis() + seconds * 1000;

    while(millis() < endTime)_loop();

}



void _loop(){

}
 
Moderatör tarafında düzenlendi:
namelessubo çok memnum olurum gerçekten
Emirgkts arduino için galiba bu ama yine bana fikir verir çok teşekkürler
Halilgok çok teşekkür ederim

Kod:
#include <16F877.h>



#FUSES NOWDT              //Watch Dog Timer Kullanma

#FUSES RC                 //Resistor/Capacitor Osilatör ile CLKOUT

#FUSES NOPUT              //Power Up Timer Kullanma

#FUSES PROTECT            //Rom'a Yazılan Verilerin Okunamasını Engelle

#FUSES NOBROWNOUT         //Brownout Reset Kullanma

#FUSES NOLVP              //Düşük Gerilimler ile Programlamayı Kapt

#FUSES NOCPD              //Data EEPROM Korumasız

#FUSES NOWRT              //Program Belleği Yazmaya Açık

#FUSES NODEBUG            //ICD için Hata Ayıklama Modu Kapalı

#use delay(clock=4000000)

#use fast_io(a)

#use fast_io(b)

unsigned int8 sayac=0x00;





void main()

{

/*Genel Pic de bölmlerinin ayarlamaları yapılıyor*/

   setup_adc_ports(NO_ANALOGS);

   setup_adc(ADC_OFF);

   setup_spi(SPI_SS_DISABLED);

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

   setup_timer_1(T1_DISABLED);

   setup_timer_2(T2_DISABLED,0,1);



/* A pinleri a0 giriş hariç lojik-0 çıkış  yapılıyor*/

set_tris_a(0b00000001);



/* B pinleri komle lojik-0 çıkış  yapılıyor */

set_tris_b(0x00);



output_b(0x00);



if (input(pin_a0)==1) //a0 pini 5 v olursa



sayac++;  // sayac değişkenini 1 arttır



if (sayac==10)  // sayac değişkeni 5 olursa



output_high(pin_b0); // b0 çıkışını 5 V yap

delay_ms(5000);

}
Kodu bu şekle getirebildim ancak
 
Moderatör tarafında düzenlendi:
Kod paylaşırken kod tag ını kullanın, okumamız kolay olur.
[*code] buraya paylaşılacak kodlar yazılacak köşeli parantez içindeki "*" lar olmayacak [/*code]
Örnek:
Kod:
 buraya paylaşılacak kodlar yazılacak köşeli parantez içindeki "*" lar olmayacak

Senin kodu yükle, butona 50 saniyeden fazla basılı tut,
5 saniye kadar led yanar.

Kod:
if (sayac==10) // sayac değişkeni 5 olursa

output_high(pin_b0); // b0 çıkışını 5 V yap
delay_ms(5000);
kısmını
Kod:
if (sayac==10) // sayac değişkeni 5 olursa
{
output_high(pin_b0); // b0 çıkışını 5 V yap
delay_ms(5000);
}
süslü parantezleri kullanarak yazmalısın.
Bu parantezler arası eğer "if" içi doğru ise çalışacak kodlar oluyor,
if karşılaştırmasında sonra parantez kullanmadan komut yazılırsa;
"if" karşılaştırması doğru olduğunda
sadece "if" karşılaşmasından sonra yazılan ilk komut işlenir,
senin yazımında sayac 10 olursa B0 pini High olsun,
sayac 10 olmadığı müddetçe "output_high(pin_b0); " komutu atlansın
devamında her halükarda 5 saniye delay verilsin demiş oluyorsun.

Ayrıca void main kısmından sonra,
mcu enerjilendikten sonra sadece bir defa işlenecek
pin giriş çıkış kurulumu, timer, adc vs. gibi modül ayarları, yani
"init" işlemleri yapıldıktan sonra
Kod:
while(1)
{
sürekli işlenecek kodlar
}
şu şekilde bir while döngüsü içerisine
sürekli işlenecek kodlar yazılır.




Kodunun geleceği son hali:
Kod:
#include <16F877.h>

#FUSES NOWDT //Watch Dog Timer Kullanma
#FUSES RC //Resistor/Capacitor Osilatör ile CLKOUT
#FUSES NOPUT //Power Up Timer Kullanma
#FUSES PROTECT //Rom'a Yazılan Verilerin Okunamasını Engelle
#FUSES NOBROWNOUT //Brownout Reset Kullanma
#FUSES NOLVP //Düşük Gerilimler ile Programlamayı Kapt
#FUSES NOCPD //Data EEPROM Korumasız
#FUSES NOWRT //Program Belleği Yazmaya Açık
#FUSES NODEBUG //ICD için Hata Ayıklama Modu Kapalı
#use delay(clock=4MHz)
#use fast_io(a)
#use fast_io(b)
unsigned int8 sayac=0x00;


void main()
{
/*Genel Pic de bölmlerinin ayarlamaları yapılıyor*/
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

/* A pinleri a0 giriş hariç lojik-0 çıkış yapılıyor*/
set_tris_a(0b00000001);

/* B pinleri komle lojik-0 çıkış yapılıyor */
set_tris_b(0x00);

output_b(0x00);

   while(1)
   {
      if (input(pin_a0)==1)      //a0 pini 5 v olursa
      {
      delay_ms(20);              //buton debounce - buton arkı için bekle
      while(input(pin_a0)==1);   //buton bırakılana kadar bekle
      delay_ms(20);              //buton debounce - buton arkı için bekle
      sayac++;                   // sayac değişkenini 1 arttır
      }

  
      if (sayac==10)             // sayac değişkeni 5 olursa
      {
      output_high(pin_b0);       // b0 çıkışını 5 V yap
      delay_ms(5000);            //butona 10 defa basıldı, led 5 saniye boyunca yansın
      output_low(pin_b0);        // b0 çıkışını 0 V yap
      sayac = 0;                 //sayac ı sıfırla
      }
   
   }//while 1 sonu
}//void main sonu

ilk istediğin gibi olması içinde
if sayac 10 kısmını
şu şekilde değiştirebilirsin:
Kod:
      if (sayac==10)             // sayac değişkeni 5 olursa
      {
         for(unsigned int8 i=1;i<100;i++) //butona 10 defa basıldı, led 100 defa  50ms aralıklarla yansın sönsün
         {  
         output_high(pin_b0);    // b0 çıkışını 5 V yap
         delay_ms(50);          //led 50ms yanık
         output_low(pin_b0);     // b0 çıkışını 0 V yap
         delay_ms(50);          //led 50ms sönük
         }
      sayac = 0;                 //sayac ı sıfırla
      }
 
Son düzenleme:
karaapak
size ne kadar teşekkür etsem azdır şuan çok iyi anladım çok sağolun
 
Bunu zaten ben sana fikir versin diye yazdım ufak kırpmalarla pic e uygun hale geliyor
 
Kod:
#include <16F877.h>



#fuses XT

#use delay(clock=4MHz)





int i=0;

int a=0;





void main()

{

set_tris_a(0b00000001);

set_tris_b(0b00000000);

while(1)

{



output_b(0x00);



if (input(pin_a0)==1) //a0 pini 5 v olursa

{

while(input(pin_a0)==1);



i++; // sayac değişkenini 1 arttır



}

if (i==10) // sayac değişkeni 10 olursa

{



for(a=0;a<=100;a++)

{

delay_ms(100);

output_high(pin_b0); // b0 çıkışını 5 V yap

delay_ms(1000);

output_low(pin_b0);

}

}

}

}
@memince delay değerlerini oynayarak istediğin aralığı verebilirsin umarım işini görür programın devamına dair bir senaryo yazmadığın için resete basmadıkça sıfırlanmıyor veya ring yapmıyor devamı için birşey söylersen ona da bakarız
Kod:
#include <16F877a.h>

#fuses xt, nowdt

#use delay(clock=4000000)

fast_io(b);

fast_io(a);

unsigned int i=0;

unsigned int a=0;

void main()

{

set_tris_a(0b00000001);

set_tris_b(0b00000001);

while(1)

{

if (input(pin_a0)==1) //a0 pini 5 v olursa

{

while(input(pin_a0)==1);

i++; // sayac değişkenini 1 arttır }

if (i==10) // sayac değişkeni 10 olursa

{

a++;

delay_ms(100);

output_high(pin_b0);// b0 çıkışını 5 V yap

delay_ms(100);

output_low(pin_b0);

if(a==100)

{

output_low(pin_b0);

i=0;

a=0;

}

}

}

}
bu da arkadaşın kodu bir farklı versiyonu kolay gelsin
 
Moderatör tarafında düzenlendi:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…