Atmega kitlenme problemi

Başlatan bahdiyarusta, 10 Kasım 2025, 17:15:35

bahdiyarusta

Arkadaşlar selamlar,

Arduino ide üzeründen derlediğim bu kodlar ile bir kart tasarladım. Atmega entegresi söküp takıyorum karta.
Proje bir tip sayıcı önünden geçen ürünleri ittiren bir motor var bir de düşen malzemeleri sayan bir sensör var .
Sistem çalışıyor sorun yok 120 yi geçtikten sonra rastgele bir sayıda kitleniyor tuşlar basmıyor sayaç saymıyor.
Enerjiyi kesip vermeme rağmen sistem eskisi gibi çalışmıyor.
Atmegaya yeniden kod yüklüyorum sorunsuz çalışmaya devam ediyor. Ancak bir yerde kitleniyor nerede kitleneceği hiç belli olmuyor.
Çıkışta 1amper çeken bir DC motor var RC filtre devresi var . 100R+100nF Besleme devresi uydu alıcısı adaptörü
Reset voltajı 2.7v olarak sigorta ayarlı
dahili 8mhz krsital


#include <EEPROM.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(6, 7, 2, 3, 4, 5); // bk

int ntc = A0;
//*************************************************************
const int ileri = 12;
const int geri = 11;
const int isitici_1 = 10;
const int isitici_2 = 9;
const int fan = 8;
//*************************************************************
const int menu = A3;
const int yukari = A4;
const int asagi = A5;
const int hasat = 13;
//************************************************************
word sayac = 0;
word sayac_set = 0;
byte ileri_set = 0;
byte men = 0;
byte sensay=0;
//***************************************************

void ayarlar() { // ayarlar
  while (true) {
    digitalWrite(fan, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("iLERi SET");
    lcd.setCursor(0, 1);
    lcd.print(ileri_set);

    if ((ileri_set < 250) & (digitalRead(yukari)) == LOW) {
      ileri_set++;
    }
    if ((ileri_set > 0) & (digitalRead(asagi)) == LOW) {
      ileri_set--;
    }

    if (men == 1) {
      men = 0;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SAYAC:");
      lcd.print(sayac);
      lcd.setCursor(0, 1);
      lcd.print("SET  :");
      lcd.print(sayac_set);
      return;
    }

    if (digitalRead(menu) == LOW) {
      delay(500);
      EEPROM.put(4, ileri_set);
      delay(20);
      sayac_ayar();
    }
    delay(150);
  }

}

void sayac_ayar() { // ayarlar
  while (true) {
    digitalWrite(fan, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SAYAC SET");
    lcd.setCursor(0, 1);
    lcd.print(sayac_set);

    if ((sayac_set < 1050) & (digitalRead(yukari)) == LOW) {
      sayac_set=sayac_set+50;
    }
    if ((sayac_set > 0) & (digitalRead(asagi)) == LOW) {
      sayac_set=sayac_set-50;
    }

    if (digitalRead(menu) == LOW) {
      delay(500);
      EEPROM.put(2, sayac_set);
      delay(20);
      men = 1;
      return;
    }
    delay(120);
  }
}


void setup() {
  pinMode(ileri, OUTPUT);
  pinMode(geri, OUTPUT);
  pinMode(isitici_1, OUTPUT);
  pinMode(isitici_2, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(menu, INPUT);
  pinMode(yukari, INPUT);
  pinMode(asagi, INPUT);
  pinMode(hasat, INPUT);
  pinMode(ntc, INPUT);

  lcd.begin(16, 2);   // 16x2 LCD başlat
  lcd.print("Panotim Otomasyn");
  delay(1500);
  lcd.clear();
  EEPROM.get(2, sayac_set);
  delay(20);
  EEPROM.get(4, ileri_set);
  delay(20);

  if (sayac > 1010) {
    sayac = 0;
  }
  if (sayac_set > 1010) {
    sayac_set = 0;
  }
  if (ileri_set > 250) {
    ileri_set = 0;
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SAYAC:");
  lcd.print(sayac);
  lcd.setCursor(0, 1);
  lcd.print("SET  :");
  lcd.print(sayac_set);

  delay(1000);
}

void loop() {
  if (digitalRead(hasat) == HIGH) { // ayrım motoru kontrol
    sensay++;
      if (sensay>=22){
        sensay=0;
        digitalWrite(fan, HIGH);
      }
  }
  if (digitalRead(hasat) == LOW) {
    digitalWrite(fan, LOW);
  }

  if (digitalRead(ntc) == HIGH) {
    delay(7);
    while (digitalRead(ntc) == HIGH) {
      delay(7);
    }
    sayac++;
    //lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SAYAC:");
    lcd.print(sayac);
    //lcd.setCursor(0, 1);
    //lcd.print("SET  :");
    //lcd.print(sayac_set);

    if ( sayac >= sayac_set) { // bant kontrol
      digitalWrite(fan, LOW);
      delay(250);
      digitalWrite(ileri, HIGH);
      delay(1200);
      digitalWrite(ileri, LOW);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("HEDEFE ULASTI");
      lcd.setCursor(0, 1);
      lcd.print("YENiDEN BASLIYOR");
      sayac = 0;
      delay(1000);
      digitalWrite(ileri, HIGH);
      delay(ileri_set * 50);
      digitalWrite(ileri, LOW);
      delay(1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SAYAC:");
      lcd.print(sayac);
      lcd.setCursor(0, 1);
      lcd.print("SET  :");
      lcd.print(sayac_set);
      delay(100);

    }
  }

  if (digitalRead(asagi) == LOW) {
    sayac = 0;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SAYAC:");
    lcd.print(sayac);
    lcd.setCursor(0, 1);
    lcd.print("SET  :");
    lcd.print(sayac_set);
  }

  if (digitalRead(menu) == LOW) {
    delay(500);
    ayarlar();
  }

  delay(10);

}

parametre

Alıntı yapılan: bahdiyarusta - 10 Kasım 2025, 17:15:35Arkadaşlar selamlar,

Arduino ide üzeründen derlediğim bu kodlar ile bir kart tasarladım. Atmega entegresi söküp takıyorum karta.
Proje bir tip sayıcı önünden geçen ürünleri ittiren bir motor var bir de düşen malzemeleri sayan bir sensör var .
Sistem çalışıyor sorun yok 120 yi geçtikten sonra rastgele bir sayıda kitleniyor tuşlar basmıyor sayaç saymıyor.
Enerjiyi kesip vermeme rağmen sistem eskisi gibi çalışmıyor.
Atmegaya yeniden kod yüklüyorum sorunsuz çalışmaya devam ediyor. Ancak bir yerde kitleniyor nerede kitleneceği hiç belli olmuyor.
Çıkışta 1amper çeken bir DC motor var RC filtre devresi var . 100R+100nF Besleme devresi uydu alıcısı adaptörü
Reset voltajı 2.7v olarak sigorta ayarlı
dahili 8mhz krsital


#include <EEPROM.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(6, 7, 2, 3, 4, 5); // bk

int ntc = A0;
//*************************************************************
const int ileri = 12;
const int geri = 11;
const int isitici_1 = 10;
const int isitici_2 = 9;
const int fan = 8;
//*************************************************************
const int menu = A3;
const int yukari = A4;
const int asagi = A5;
const int hasat = 13;
//************************************************************
word sayac = 0;
word sayac_set = 0;
byte ileri_set = 0;
byte men = 0;
byte sensay=0;
//***************************************************

void ayarlar() { // ayarlar
  while (true) {
    digitalWrite(fan, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("iLERi SET");
    lcd.setCursor(0, 1);
    lcd.print(ileri_set);

    if ((ileri_set < 250) & (digitalRead(yukari)) == LOW) {
      ileri_set++;
    }
    if ((ileri_set > 0) & (digitalRead(asagi)) == LOW) {
      ileri_set--;
    }

    if (men == 1) {
      men = 0;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SAYAC:");
      lcd.print(sayac);
      lcd.setCursor(0, 1);
      lcd.print("SET  :");
      lcd.print(sayac_set);
      return;
    }

    if (digitalRead(menu) == LOW) {
      delay(500);
      EEPROM.put(4, ileri_set);
      delay(20);
      sayac_ayar();
    }
    delay(150);
  }

}

void sayac_ayar() { // ayarlar
  while (true) {
    digitalWrite(fan, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SAYAC SET");
    lcd.setCursor(0, 1);
    lcd.print(sayac_set);

    if ((sayac_set < 1050) & (digitalRead(yukari)) == LOW) {
      sayac_set=sayac_set+50;
    }
    if ((sayac_set > 0) & (digitalRead(asagi)) == LOW) {
      sayac_set=sayac_set-50;
    }

    if (digitalRead(menu) == LOW) {
      delay(500);
      EEPROM.put(2, sayac_set);
      delay(20);
      men = 1;
      return;
    }
    delay(120);
  }
}


void setup() {
  pinMode(ileri, OUTPUT);
  pinMode(geri, OUTPUT);
  pinMode(isitici_1, OUTPUT);
  pinMode(isitici_2, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(menu, INPUT);
  pinMode(yukari, INPUT);
  pinMode(asagi, INPUT);
  pinMode(hasat, INPUT);
  pinMode(ntc, INPUT);

  lcd.begin(16, 2);   // 16x2 LCD başlat
  lcd.print("Panotim Otomasyn");
  delay(1500);
  lcd.clear();
  EEPROM.get(2, sayac_set);
  delay(20);
  EEPROM.get(4, ileri_set);
  delay(20);

  if (sayac > 1010) {
    sayac = 0;
  }
  if (sayac_set > 1010) {
    sayac_set = 0;
  }
  if (ileri_set > 250) {
    ileri_set = 0;
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SAYAC:");
  lcd.print(sayac);
  lcd.setCursor(0, 1);
  lcd.print("SET  :");
  lcd.print(sayac_set);

  delay(1000);
}

void loop() {
  if (digitalRead(hasat) == HIGH) { // ayrım motoru kontrol
    sensay++;
      if (sensay>=22){
        sensay=0;
        digitalWrite(fan, HIGH);
      }
  }
  if (digitalRead(hasat) == LOW) {
    digitalWrite(fan, LOW);
  }

  if (digitalRead(ntc) == HIGH) {
    delay(7);
    while (digitalRead(ntc) == HIGH) {
      delay(7);
    }
    sayac++;
    //lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SAYAC:");
    lcd.print(sayac);
    //lcd.setCursor(0, 1);
    //lcd.print("SET  :");
    //lcd.print(sayac_set);

    if ( sayac >= sayac_set) { // bant kontrol
      digitalWrite(fan, LOW);
      delay(250);
      digitalWrite(ileri, HIGH);
      delay(1200);
      digitalWrite(ileri, LOW);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("HEDEFE ULASTI");
      lcd.setCursor(0, 1);
      lcd.print("YENiDEN BASLIYOR");
      sayac = 0;
      delay(1000);
      digitalWrite(ileri, HIGH);
      delay(ileri_set * 50);
      digitalWrite(ileri, LOW);
      delay(1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SAYAC:");
      lcd.print(sayac);
      lcd.setCursor(0, 1);
      lcd.print("SET  :");
      lcd.print(sayac_set);
      delay(100);

    }
  }

  if (digitalRead(asagi) == LOW) {
    sayac = 0;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SAYAC:");
    lcd.print(sayac);
    lcd.setCursor(0, 1);
    lcd.print("SET  :");
    lcd.print(sayac_set);
  }

  if (digitalRead(menu) == LOW) {
    delay(500);
    ayarlar();
  }

  delay(10);

}
Kodların hepsi bu sanırım Semada eklense iyi olur devrede farkedılmeyen hata olabılır eklenirse eger  arkadaslarımız daha iyi çözumler sunacaktır iyi çalışmalar

elektronikhobi

Alıntı yapılan: bahdiyarusta - 10 Kasım 2025, 17:15:35if ( sayac >= sayac_set) { // bant kontrol

İlk göze çarpan nokta burada iki adet sayaç kullanılmış.

İkisini takip etmek zor olabilir.

Hata ayıklama ile değerleri yazılabiliyor mu?

Alıntı yapılan: bahdiyarusta - 10 Kasım 2025, 17:15:35delay(ileri_set * 50);

Tercihen bekleme süresini sabit yapmak düşünülebilir.
Dört teker ATMega328P mikro denetleyicisi kullanan uzaktan kumandalı bir arabadır.

Elektronik

computerboy

vcc ve gnd arasına büyük bir kapasitör yada seramik kapasitör koy hocam voltaj çökmesi gibi duruyor.

elektronikhobi

Hata yakalamak için sayaç değişkenlerini seri porta yazmak düşünülebilir.

Fiziksel dünya ile iletişim kuran bir yazılımı, sahada görmeden hata tespiti güç olabilir.

Geçenlerde bir araba geliştirdik.

Saatlerce sürdük.

Sonradan motorların bir tanesinin dişlilerinin aşındığını farkettik.

Motor ilk kalkışta yüksek torkla kalktığı için muhtemelen aşınmış olabilir.

Araba ilk kez harekete geçiyorsa daha yavaş, seyir halinde ise normal hızla devam etmesi için ufak bir ekleme yaptık.

Bana kalsa oturur sil baştan yazılımı tekrar yazarım.

Yazılım geliştirirken, Git gibi sürüm denetimi yazılımlarının yanı sıra elle sürüm denetimi de yapıyorum.

Yazılımı ufak parçalara bölüyorum. Örneğin radyo, servo gibi.

Sonra bu ufak parçaların doğru çalıştığına emin oldukça ana yazılıma ekliyorum.

Ana yazılım toslarsa her zaman Git ile geri alma şansım var.

Bazen ufak parçalar da doğru çalışmıyor. Doğru çalışmayanları sürüm denetimi dışına, yani çöpe gönderiyorum.

Dikkat ederseniz iki kütük için ne kadar ön çalışma yapılmış.
Dört teker ATMega328P mikro denetleyicisi kullanan uzaktan kumandalı bir arabadır.

Elektronik

Brdk Khn

#5
"int" değişkenleri "unsigned int" yapıp bir dene. Bir değişme oluyor mu?

Brdk Khn

Tekrar merhaba. Karşılaştığımız sorunlara çözüm bulabildiysek bunların yöntemini ve çözüm yolunu tekrar foruma yazalım ki insanlar bundan faydalanabilsin.

EGE

Motor enerji kablolarını çıkartıp sistemi çalıştırın ve takip edin kitlenme olacak mı?

M.Salim GÜLLÜCE

#8
Lojik devrelerde rastgelelik olmaz.
Çevre şartları değişmedikçe davranışı değişmez.

MCU larda PC (ProgramCounter) register ı wardır.
Eğer elektiriksel parazit alırsa bu sayaçlar sapıtır. Rastgele değer alırlar.
Tabii yazılan kodun neresine zıplayacağı bilnmediğinden kendi içindeki programıda bozacak okuma yazma oluşması mümkün.
ROM üzerinde yazılı olsa program resetleyince yeniden çalışır.
Ancak RAM, EPROM yada FLUSH hafıza üzerinde olunca datalar silinebilir yada yazılabilir hale gelir.

Bundan kurtulmanın yolu besleme hatlarını parazitlerden koruyacak filtrelerle devrenizi tasarlamak.
LC Filtrelerle parazitlerin NCU tarafına sirayetinin engellenmesi gerekir.

bahdiyarusta

Selamlar,

İşlemcinin sahte olduğunu düşünerek farklı bir yerden sipariş verdim ve aynı yazılımı yükledim.
Problem çözüldü.

ibrahim96

2 cipide nereden sipariş etmiştiniz alırken bizde dikkat edelim

elektronikhobi

Hakiki olanların üzerinde 1223 yazıyor. Diğerlerinin üzerinde 1409 yazıyor.

Hepsinde ATMEGA328P-PU yazıyor.

Sigorta bitleri bozulmuş olabilir.

Arduino geliştirme ortamı ile çekirdek yüklediğinizde sadece yazılımı atmakla kalmıyor sigortaları da ayarlıyor.
Dört teker ATMega328P mikro denetleyicisi kullanan uzaktan kumandalı bir arabadır.

Elektronik

Benzer Konular (5)