Ana içeriğe git
Konu: Dijital Ses Kontrolü (977 Kez okunmuş)

Ynt: Dijital Ses Kontrolü

Yanıt #30
@taydin
Hocam osiloskop için beklemek zorundayım gibi görünüyor.
Ayrıca şekillendirdiğim son kod burada.
Fakat debounce olayını yapamadım. Onu da döngünün sonuna belli bir miktar gecikme ekleyerek halletmeyi düşünüyorum. Sizce olur mu?
Kod: [Seç]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

byte volume = 30;
byte leftmute = 128;
byte rightmute = 160;
byte loud = 68;
byte bass = 111;
byte treble = 127;

int VolumeUp = 2;
int VolumeDown = 3;
int Mute = 4;
int Loudness = 5;
int BassUp = 6;
int BassDown = 7;
int TrebleUp = 8;
int TrebleDown = 9;
void SendData(unsigned char data) {
  Wire.beginTransmission(128);
  Wire.write(data);
  Wire.endTransmission();
}
void setup() {

  pinMode(VolumeUp, INPUT);
  pinMode(VolumeDown, INPUT);
  pinMode(Mute, INPUT);
  pinMode(Loudness, INPUT);
  pinMode(BassUp, INPUT);
  pinMode(BassDown, INPUT);
  pinMode(TrebleUp, INPUT);
  pinMode(TrebleDown, INPUT);
  Wire.begin();
  Wire.setClock(100000);
  Wire.beginTransmission(128);
  Wire.write(volume);
  Wire.write(leftmute);
  Wire.write(rightmute);
  Wire.write(loud);
  Wire.write(bass);
  Wire.write(treble);
  Wire.endTransmission();
  lcd.begin();
  lcd.setCursor(0,0);
  lcd.print("H_SerhatY DSP v1.0");
  lcd.setCursor(0,1);
  lcd.print("Volume, Mute, Bass,");
  lcd.setCursor(0,2);
  lcd.print("Treble and Loudness");
  lcd.setCursor(5,3);
  lcd.print("Controller");
  delay(1000);
}

void loop() {
  if (VolumeUp == HIGH && volume < 0) {
    volume--;
  } else if (VolumeUp == HIGH && volume == 0) {
    volume = 0;
  }
  if (VolumeDown == HIGH && volume > 60) {
    volume++;
  } else if (VolumeDown == HIGH && volume == 60) {
    volume = 60;
  }
   
  if (Mute == HIGH) {
    leftmute = 159;
    rightmute = 191;
  } else {
    leftmute = 128;
    rightmute = 160;
  }
 
  if (Loudness == HIGH) {
    loud = 64;
  } else {
    loud = 68;
  }
 
  if (BassUp == HIGH && bass == 104) {
    bass = 104;
  } else if (BassUp == HIGH && bass <= 111 && bass >= 104) {
    bass--;
  } else if (BassUp == HIGH && bass == 102) {
    bass + 9;
  } else if (BassUp == HIGH && bass <= 102 && bass >= 96) {
    bass++;
  }
  if (BassDown == HIGH && bass == 96) {
    bass = 96;
  } else if (BassDown == HIGH && bass > 96 && bass <= 102) {
    bass--;
  } else if (BassDown == HIGH && bass == 111) {
    bass - 9;
  } else if (BassDown == HIGH && bass <= 111 && bass >= 104) {
    bass++;
  }
 
 
 
  if (TrebleUp == HIGH && treble == 120) {
    treble = 120;
  } else if (TrebleUp == HIGH && treble <= 127 && treble >= 120) {
    treble--;
  } else if (TrebleUp == HIGH && treble == 118) {
    treble + 9;
  } else if (TrebleUp == HIGH && treble <= 118 && treble >= 112) {
    treble++;
  }
  if (TrebleDown == HIGH && treble == 112) {
    treble = 112;
  } else if (TrebleDown == HIGH && treble > 112 && treble <= 127) {
    treble--;
  } else if (TrebleDown == HIGH && treble == 127) {
    treble - 9;
  } else if (TrebleDown == HIGH && treble <= 127 && treble >= 120) {
    treble++;
  }
 
  SendData(volume);
  SendData(leftmute);
  SendData(rightmute);
  SendData(loud);
  SendData(bass);
  SendData(treble);
 
  if (volume == 60) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 0");
  } else if (volume == 59) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 1");
  } else if (volume == 58) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 2");
  } else if (volume == 57) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 3");
  } else if (volume == 56) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 4");
  } else if (volume == 55) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 5");
  } else if (volume == 54) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 6");
  } else if (volume == 53) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 7");
  } else if (volume == 52) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 8");
  } else if (volume == 51) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 9");
  } else if (volume == 50) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 10");
  } else if (volume == 49) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 11");
  } else if (volume == 48) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 12");
  } else if (volume == 47) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 13");
  } else if (volume == 46) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 14");
  } else if (volume == 45) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 15");
  } else if (volume == 44) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 16");
  } else if (volume == 43) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 17");
  } else if (volume == 42) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 18");
  } else if (volume == 41) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 19");
  } else if (volume == 40) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 20");
  } else if (volume == 39) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 21");
  } else if (volume == 38) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 22");
  } else if (volume == 37) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 23");
  } else if (volume == 36) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 24");
  } else if (volume == 35) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 25");
  } else if (volume == 34) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 26");
  } else if (volume == 33) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 27");
  } else if (volume == 32) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 28");
  } else if (volume == 31) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 29");
  } else if (volume == 30) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 30");
  } else if (volume == 29) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 31");
  } else if (volume == 28) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 32");
  } else if (volume == 27) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 33");
  } else if (volume == 26) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 34");
  } else if (volume == 25) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 35");
  } else if (volume == 24) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 36");
  } else if (volume == 23) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 37");
  } else if (volume == 22) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 38");
  } else if (volume == 21) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 39");
  } else if (volume == 20) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 40");
  } else if (volume == 19) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 41");
  } else if (volume == 18) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 42");
  } else if (volume == 17) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 43");
  } else if (volume == 16) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 44");
  } else if (volume == 15) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 45");
  } else if (volume == 14) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 46");
  } else if (volume == 13) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 47");
  } else if (volume == 12) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 48");
  } else if (volume == 11) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 49");
  } else if (volume == 10) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 50");
  } else if (volume == 9) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 51");
  } else if (volume == 8) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 52");
  } else if (volume == 7) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 53");
  } else if (volume == 6) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 54");
  } else if (volume == 5) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 55");
  } else if (volume == 4) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 56");
  } else if (volume == 3) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 57");
  } else if (volume == 2) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 58");
  } else if (volume == 1) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 59");
  } else if (volume == 0) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 60");
  }
 
  if (leftmute == 128 && rightmute == 160) {
    lcd.setCursor(0,3);
    lcd.print("Mute:0");
  } else if (leftmute == 159 && rightmute == 191) {
    lcd.setCursor(0,3);
    lcd.print("Mute:1");
  }
 
  if (loud == 64) {
    lcd.setCursor(10,3);
    lcd.print("Loudness:0");
  } else if (loud == 68) {
    lcd.setCursor(10,3);
    lcd.print("Loudness:1");
  }
 
  if (bass == 104) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +7");
  } else if (bass == 105) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +6");
  } else if (bass == 106) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +5");
  } else if (bass == 107) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +4");
  } else if (bass == 108) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +3");
  } else if (bass == 109) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +2");
  } else if (bass == 110) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +1");
  } else if (bass == 111) {
    lcd.setCursor(0,1);
    lcd.print("Bass = 0");
  } else if (bass == 102) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -1");
  } else if (bass == 101) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -2");
  } else if (bass == 100) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -3");
  } else if (bass == 99) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -4");
  } else if (bass == 98) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -5");
  } else if (bass == 97) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -6");
  } else if (bass == 96) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -7");
  }
 
  if (treble == 120) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +7");
  } else if (treble == 121) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +6");
  } else if (treble == 122) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +5");
  } else if (treble == 123) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +4");
  } else if (treble == 124) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +3");
  } else if (treble == 125) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +2");
  } else if (treble == 126) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +1");
  } else if (treble == 127) {
    lcd.setCursor(0,2);
    lcd.print("Treble = 0");
  } else if (treble == 118) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -1");
  } else if (treble == 117) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -2");
  } else if (treble == 116) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -3");
  } else if (treble == 115) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -4");
  } else if (treble == 114) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -5");
  } else if (treble == 113) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -6");
  } else if (treble == 112) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -7");
  }
 
}
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #31
Öncelikle volüm ile ilgili şunları düzelt:

TDA7315 datasheet'te volüm registerine 63 yazıldığında minimum volüm (-70dB zayıflatma) ve 0 yazıldığında maksimum volüm (hiç zayıflatma yok) elde ediliyor. O halde volüm değeri 0 - 63 arasında olmalı. Ama sen volümü negatif sayı olarak kullanıyorsun. Bu doğru değil (ayrıca negatif kullandığın halde de değişkeni işaretsiz tanımlamışsın (byte). Ama pozitif olarak kullanacağımız için byte kalacak. Bir de volüm tuşunu kontrolde gereksiz bir işlem yapıyorsun, onu kaldır.

Kod: [Seç]

byte volume = 0;

if (VolumeUp == HIGH) {
   if (volume > 0) {
      volume--;
   }
}

if (VolumeDown == HIGH) {
   if (volume < 63) {
      volume++;
   }
}
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #32
Öncelikle volüm ile ilgili şunları düzelt:

TDA7315 datasheet'te volüm registerine 63 yazıldığında minimum volüm (-70dB zayıflatma) ve 0 yazıldığında maksimum volüm (hiç zayıflatma yok) elde ediliyor. O halde volüm değeri 0 - 63 arasında olmalı. Ama sen volümü negatif sayı olarak kullanıyorsun. Bu doğru değil (ayrıca negatif kullandığın halde de değişkeni işaretsiz tanımlamışsın (byte). Ama pozitif olarak kullanacağımız için byte kalacak. Bir de volüm tuşunu kontrolde gereksiz bir işlem yapıyorsun, onu kaldır.

Kod: [Seç]

byte volume = 0;

if (VolumeUp == HIGH) {
   if (volume > 0) {
      volume--;
   }
}

if (VolumeDown == HIGH) {
   if (volume < 63) {
      volume++;
   }
}
Hocam normalde 63'e kadar olabiliyor ancak ben 60'a sınırladım. Ayrıca ses seviyesini ilk açıldığında bilerek 30'a getirdim.
Kodu düzenledim. Başka hata var mı?
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #33
Bir de volümü ekrana yazdırırken her değer için ayrı bir kod eklemişsin, bu da kod boyutunu neredeyse 10 misli artırmış :)

Onun yerine ekrana volümü yazdıran bir fonksiyon kullan

Kod: [Seç]
void write_volume(int volume) {
   lcd.print("Volume: ");
   lcd.setCursor(8, 0);
   lcd.print(volume);
}

Benzer bir fonksiyonu bass, treble, mute için de yaz ve kullan.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #34
Bir de volümü ekrana yazdırırken her değer için ayrı bir kod eklemişsin, bu da kod boyutunu neredeyse 10 misli artırmış :)

Onun yerine ekrana volümü yazdıran bir fonksiyon kullan

Kod: [Seç]
void write_volume(int volume) {
   lcd.print("Volume: ");
   lcd.setCursor(8, 0);
   lcd.print(volume);
}

Benzer bir fonksiyonu bass, treble, mute için de yaz ve kullan.
Fonksiyonu kullanayım kullanmasına da, volume artırdıkça ekranda değer azalacak, azalttıkça artacak. Çünkü entegrede volume sistemi ters.
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #35
Kodun mevcut yapısında zaten loop sonuna mutlaka bir delay koyman lazım. Yoksa "volume up" butonuna bastığın anda volume çok hızlı bir şekilde maksimuma çıkar, "volume down" a basınca da hemen minimuma iner.

Ama sonraları daha ileri seviyede kod yazmaya başlayınca öyle sağa sola delay koymanın hiç de iyi bir fikir olmadığını göreceksin, çünkü işlemcinin eti ne budu ne, bir de sürekli sağda solda delay yapıyorsa, vaktinin çoğunu aylak geçiriyor olacak. O yüzden güzel bir debounce kodu koyup, hem butonun basıldığını hem de bırakıldığını algılamak ve ona göre işlem yapmak lazım.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #36
Kodun mevcut yapısında zaten loop sonuna mutlaka bir delay koyman lazım. Yoksa "volume up" butonuna bastığın anda volume çok hızlı bir şekilde maksimuma çıkar, "volume down" a basınca da hemen minimuma iner.

Ama sonraları daha ileri seviyede kod yazmaya başlayınca öyle sağa sola delay koymanın hiç de iyi bir fikir olmadığını göreceksin, çünkü işlemcinin eti ne budu ne, bir de sürekli sağda solda delay yapıyorsa, vaktinin çoğunu aylak geçiriyor olacak. O yüzden güzel bir debounce kodu koyup, hem butonun basıldığını hem de bırakıldığını algılamak ve ona göre işlem yapmak lazım.
Volume kodu için önerinizi uyguladım, loop sonuna delay koydum, ancak LCD için verdiğiniz fonksiyonu eklemedim, çünkü entegrenin volume sistemi ters olduğu için volume artırdığım zaman ekranda azalıyormuş gibi görünecek, volume azaltınca da tam tersi olacak.
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #37
O zaman fonksiyon, kullanıcının hoşuna gidecek şekilde görüntülesin. Mesela 0 - 10 arası volüm görmesini istiyorsan:

Kod: [Seç]
void display_volume(int volume) {
   int dvol = map(volume, 63, 0, 0, 10);
   lcd.print("Volume: ");
   lcd.setCursor(8, 0);
   lcd.print(dvol);
}

Buradaki map fonksiyonu ile ilgili ve diğer bütün arduino kütüphaneleri ile ilgili dokümanları şuradan oku:

https://www.arduino.cc/reference/en/
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #38
Şu şekilde yazdım.
Kod: [Seç]
void display_volume(int volume) {
  int lcdvolume = map(volume, 60, 0, 0, 60);
  lcd.setCursor(0,0);
  lcd.print("Volume: ");
  lcd.setCursor(8,0);
  lcd.print(lcdvolume);
}
0'dan 60'a kadar detaylı bir biçimde görüntülesin istiyordum :)
Bu arada 426 satır kod 249 satıra düştü :D
Ama diğer değişkenler için bunu yapamam gibi duruyor.
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #39
Ama diğer değişkenler için bunu yapamam gibi duruyor.

Yapaman diye birşey yok :) Bu kadar ipucu yeter. Geri kalanını artık kendin araştırman lazım. Dediğim kütüphane dokümanlarını oku. O kodun 50 satırdan çok daha aza inmesi lazım, indirene kadar uğraş  :P
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #40
@taydin
Hocam baskı devrenin üstünde pull-up direnci olmasına gerek var mı? Değeri 5.6K olsa olur mu?
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #41
Nerede? Hangi sinyalden bahsediyorsun? Bazı yerlerde pull up mutlaka gereklidir, bazı yerlerde gerekli değildir.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #42
Nerede? Hangi sinyalden bahsediyorsun? Bazı yerlerde pull up mutlaka gereklidir, bazı yerlerde gerekli değildir.
I2C bağlantısından bahsediyorum :)
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #43
I2C sinyallerinin tamamının pull up yapılması lazım. Ama arduino'daki işlemci at328p nin içinde yazılımla yapılandırılabilen pull up lar var zaten, ve kullandığın lcd kütüphanesi de bunları yapılandırıyordur. O yüzden birşey bağlamana gerek yok.

Ama arduino I2C sinyallerini standard 5V ile çalışan arduino shield yerine başka voltajla çalışan bir dijital devreye bağlıyorsan o zaman sorun çıkar. Bu durumda kütüphanenin kaynak kodunu değiştirmen lazım. Dahili pull up ları devre dışı bırakıp harici pull up direnç bağlaman lazım.

Değer olarak 2.2 KΩ ile başlayabilirsin, ama uygun değer belirlemek için osiloskop ile kare dalganın yükselme zamanına bakman lazım (rise time). Standardın öngördüğü yükselme zamanını elde edene kadar direncin değeri ile oynaman lazım. 100 KHz'de çok sorun çıkmaz, ama I2C nin bir de 400 KHz modu var, onda timing'ler daha kritik.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #44
I2C sinyallerinin tamamının pull up yapılması lazım. Ama arduino'daki işlemci at328p nin içinde yazılımla yapılandırılabilen pull up lar var zaten, ve kullandığın lcd kütüphanesi de bunları yapılandırıyordur. O yüzden birşey bağlamana gerek yok.

Ama arduino I2C sinyallerini standard 5V ile çalışan arduino shield yerine başka voltajla çalışan bir dijital devreye bağlıyorsan o zaman sorun çıkar. Bu durumda kütüphanenin kaynak kodunu değiştirmen lazım. Dahili pull up ları devre dışı bırakıp harici pull up direnç bağlaman lazım.

Değer olarak 2.2 KΩ ile başlayabilirsin, ama uygun değer belirlemek için osiloskop ile kare dalganın yükselme zamanına bakman lazım (rise time). Standardın öngördüğü yükselme zamanını elde edene kadar direncin değeri ile oynaman lazım. 100 KHz'de çok sorun çıkmaz, ama I2C nin bir de 400 KHz modu var, onda timing'ler daha kritik.
Hocam TDA7315 devresi 9V ile çalışıyor, bu durumda direnç bağlamam lazım değil mi?
Bir de, direnci hem SDA hem de SCL pinlerine bağlıyorum, değil mi?
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli