Arduino pin low süresi okuma ve dallanma?

.... evet.. bakıyorum bakıyorum hata yok :)
iki yükselen kenar süresini ölçmeye çalışıyorum..
ledler hep sönük..noktalı virgül e bir bakayım..

..çalışır gibi gözüküyor ama yine çalışmadı. birşeyler eksik mutlaka..
 
Moderatör tarafında düzenlendi:
Bunu söylesen ya bana. Ben senin o elindeki aletin kitabını yazarım evellah. Boş yere kendini yordun. Devre şemanın böyle olduğunu düşünerek.

Untitled.png


Aşağıdaki kodu çalıştırabilirsin. Anahtar yerine sensör bağla. Gecikmeler 10ms formatında yani 130 yazarsan 1300ms olarak çalışır. Harici kitaplık yüklememen için register işlemi uyguladım anlaması biraz zor olacaktır. Loop fonksiyonun içini boş bıraktım istediğin gibi ekran sürebilirsin veya seri haberleşebilirsin. Sensör sana engel olmaz.

C++:
volatile unsigned int sayac = 0;
const uint8_t kirmizi = PD2,sari = PD3, yesil = PD4,mavi = PD5,sensor = PD7;

const int kirmizi_alt_limit = 100,kirmizi_ust_limit = 130;
const int sari_alt_limit = 130,sari_ust_limit = 150;
//Alt limit ve üst limitler buraya eklenecek

void setup() {
  DDRD = (1<<kirmizi)|(1<<sari)|(1<<yesil)|(1<<mavi);
  TCCR1A = 0;    
  TCCR1B = 0x0C;
  TCNT1 = 0;    
  OCR1A = 625;  
  TIMSK1 = 0x02;
  sei();          
}

void loop() {

}

ISR(TIMER1_COMPA_vect){
  //digitalWrite fonksiyonu çok fazla işlemci cycle i tükettiği içi
  // doğrudan portd registerina yazmak gerekli
  //timer kesmeleri mümkün olduğunca kısa olmalıdır

  if(PIND & (1<<sensor)){
    sayac++;
    if(sayac >= kirmizi_alt_limit && sayac <= kirmizi_ust_limit)
      PORTD = (1<<kirmizi);
    if(sayac >= sari_alt_limit && sayac <= sari_ust_limit)
      PORTD = (1<<sari);
    //Diğer ledler için aynıları eklenecek
  }
  else{
    PORTD = 0;
    sayac = 0;
  }
}
 
..eyvallah sağol..
en son şu aşağıdaki kodu denedim..elimle ışığı belli sürelerde kesip açıyorum...kırmızı ve yeşil led yanıyor sönüyor..bazen ikisi yazıp sönüyor vs..yani istenen şekilde değilde saçma sapan çalışıyor..
şimdi gönderdiğin kodu ve devreyi deneyeceğim..


Kod:
unsigned long zamanBas = 0;
unsigned long zamanSon= 0;
unsigned long sure = 0;
int inputpin= 3;// sensör çıkış,engel yoksa sıfır.
int Kirmizi= 4;
int Yesil= 5;

void setup() {
    pinMode(inputpin,INPUT);
    pinMode(Kirmizi,OUTPUT);
    pinMode(Yesil,OUTPUT);
    zamanBas=0;
    zamanSon=0;
    sure=0;
  }
void loop()
{
kontrol:
  
    if (digitalRead(inputpin)==1)
    goto basla;
    goto kontrol;

basla:
    zamanSon = millis();
    sure = (zamanSon-zamanBas);
    zamanBas = zamanSon;

//***********1. kontrol
    if (sure<3000){
        digitalWrite(Kirmizi, 1);
        goto altprog;
    }
    else
    {
        digitalWrite(Kirmizi, 0);
    }
    
//**********2. kontrol
    if (sure<10000){
        digitalWrite(Yesil, 1);
        goto altprog;
    }
        else
    {
        digitalWrite(Yesil, 0);
    }
altprog:
  
    if (digitalRead(inputpin) == 0)
    {
        goto kontrol;
    }
        goto altprog;
}
 
Kardeş goto komutu geçen yüzyılda kaldı. Onun yerine fonksiyonları kullanıyoruz. Boş yere kafanı karıştırıyorsun. Ayrıca senin gönderdiğin işlemciye sürekli bir iş yaptırıyor ki sensör işinin yanına yeni bir iş ekleyecek olsan herşeyi baştan yazman gerek. Benim gönderdiğimi kullan.
 
..programını denedim..çalıştı..şöyle çalışıyor;
kırmızı için belirlenen aralıkta ışığı kesince kırmızı yanıyor ..elimi kaldırınca sönüyor...
ışığı kesme süresini yeşil led için tanımlanan süreye uzatınca ;
ilk başta kırmızı yanıyor ..kırmızının süresini geçince kırmızı sönüp yeşil yanıyor..elime çekersem yeşilde sönüyor...
ben şöyle düşünmüştüm..periyodik olarak ölçüm yapsın..aralığın süresine göre ilgili ledi devamlı yaksın..
en son yazdığım programı bunu düşünerek yazdım ama dediğim gibi saçma sapan çalıştı..
 
Sen başta engel varken ledler engelin sensörün önünde durma süresine göre yansın dedin. Periyodik ölçüm yapacak demedin. Benim yazdığım tam da senin anlattığını yapıyor. Periyodik ölçüm derken neyi kastediyorsun eğer ledin yanık kalmasını istiyorsan en alttaki PORTD = 0 kısmını sil.
 
..periyodik ölçüm derken sensörün ışığının devamlı kesilip açıldığını kasdediyorum ..ama kesilip açılma süresi değişebilir.. programda bunu takip ederek o anki süreye göre ilgili ledi yakacak..ve yanık kalacak..
programın çok kısa ve iş görüyor..hakikaten geçen yüzyılda kaldım galiba :) ve ilginç tanımlamalar var setup da..pic deki hex kodlarına benziyor..
 
Onlar register isimleri herbirisi işlemcinin içinde bir birimin adresi. Sen PIND = 0 kısmını sil o zaman ne kadar süre kalırsa o led yanık kalacaktır geri sönmeyecektir.
 

Forum istatistikleri

Konular
128,123
Mesajlar
915,199
Kullanıcılar
449,830
Son üye
xkullanıcı45

Yeni konular

Geri
Üst