Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: bahdiyarusta - 10 Kasım 2025, 17:15:35

Başlık: Atmega kitlenme problemi
Gönderen: bahdiyarusta - 10 Kasım 2025, 17:15:35
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);

}
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: parametre - 10 Kasım 2025, 19:06:13
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
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: elektronikhobi - 11 Kasım 2025, 06:07:58
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.
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: computerboy - 11 Kasım 2025, 08:54:24
vcc ve gnd arasına büyük bir kapasitör yada seramik kapasitör koy hocam voltaj çökmesi gibi duruyor.
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: elektronikhobi - 11 Kasım 2025, 21:30:31
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 (https://codeberg.org/erdem/araba/src/branch/master/yazilim/araba/araba.ino#L37-L44) 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 (https://codeberg.org/erdem/araba/src/branch/master/kaynak) yapılmış.
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: Brdk Khn - 11 Kasım 2025, 22:17:11
"int" değişkenleri "unsigned int" yapıp bir dene. Bir değişme oluyor mu?
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: Brdk Khn - 24 Kasım 2025, 00:43:50
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.
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: EGE - 24 Kasım 2025, 09:12:36
Motor enerji kablolarını çıkartıp sistemi çalıştırın ve takip edin kitlenme olacak mı?
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: M.Salim GÜLLÜCE - 24 Kasım 2025, 17:26:09
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.
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: bahdiyarusta - 27 Kasım 2025, 19:02:07
Selamlar,

İşlemcinin sahte olduğunu düşünerek farklı bir yerden sipariş verdim ve aynı yazılımı yükledim.
Problem çözüldü.
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: ibrahim96 - 09 Aralık 2025, 10:30:07
2 cipide nereden sipariş etmiştiniz alırken bizde dikkat edelim
Başlık: Ynt: Atmega kitlenme problemi
Gönderen: elektronikhobi - 09 Aralık 2025, 11:07:30
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.