This post is also available in: English

forum-banner


Konu ve mesaj oluşturabilmek için giriş yapmanız gerekmektedir.

I2C protokolü ile eeprom dan doğru verileri okuyamıyorum.

Sayfalar:1234

Merhabalar

Biraz baktım mantığı şöyle PCF8754 nin portarında herhangi bir hareket olursa INT ucundan çıkış veriyor bu ucu aynı zamanda sende PIC INT ucuna bağlayacaksın hangi pinde interrupt varsa oraya böylece PCF8754  den gelen kesme PIC e ulaşmış olacak sende bu kesme gelince hemen okuma yapıp kontrol edeceksin. Temel mantığı bu  PCF8754  parçasının portarında bir değişim oldumu seni uyarıyor yeni bir hareket var diye sende bunu alınca hemen I2C ile okuma yapıyorsun ve değişikliği alıyorsun.

INT olmasaydı portlarda olan bir değişiklik anlaşılamazdı sürekli I2C ile taraman gerekirdi bu da mantıksız olurdu bu özellik durmadan tarama yapmana gerek bırakmıyor

İyi Çalışamalar

         void  Interrupt() // kesme alt programı
        {
        int okunan;
          if(INTCON.INTF)  // kesme olmuş mu ?
          {
           I2C1_Start();
                I2C1_Wr(0x41);
                okunan=I2C1_Rd(0);
                I2C1_Stop();
                 PORTD=okunan;
          
            INTCON.INTF=0; // olmuş ise kesmeyi yeniden kur

          }
        }


 

void main(){
  ADCON0=0;
  ADCON1=7;
  cmcon=0x07;
  TRISC=0;
  PORTC=0;
  TRISD=0X00;
  PORTD=0X00;
  TRISB=0XFF;
  PORTB=0X00;
  OPTION_REG.INTEDG=0; // kesme kenarı "düşen kenar"
  INTCON.GIE=1; // bütün kesmelere izin ver
 INTCON.INTE=1; // INT kesmesine izin ver
 INTCON.INTF=0; // INT bayrağını sıfırla
  I2C1_Init(100000);



  while(1) {  


}
}

 

http://hizliresim.com/1EEjgb

 

Ercan hocam okuma işleminide yaptım PCF verdiğim bcd değerleri PORTD cıkışında 7 segmente aldırdım.  I2C kolaymış uygulama yaptıkca daha iyi anlaşılır oluyor biraz daha üstünde uğraşmak istiyorum bir kac başka birşeylede uygulama yapacağım buraya yaptıklarımı koyuyorum ki bakan arkadaşlar olursa uygulasın diye.

Tüm arkadaşlara iyi calışmalar. :)

Merhabalar

Mantığını iyice kavramışsın. Birilerinin bir şeyler yapmaya çalıştığını görmek güzel.

I2C hem kolay hemde çok yaygın. Birçok ram , eeprom , basınç sensörü vb. I2C kullanır.

Elbette paylaşımların faydası olacaktır herkese.

İyi Çalışmalar

Hocam MikroElektronika firmasının CLİCK(modülleri) leri acık kaynak olarak veriliyor. pdf de ben OSD max7456 olan clickin güzelce şemasnı cıkardım hatta elime dün cinden sipariş ettiğim 2 adet max7456 da ulaştı. bunun ares şemasını cizsem burda  yayınlasam olur mu yasakmıdır ? eğer yasak değil ise  en kısa zamanda ares şemasını cizip burada paylaşmak isterim. PAL librarysi ve gerkeli uygulama koduda mevcut.

Niye yasak olsun anlamadım. Kaçıncı yüzyılda yaşıyoruz.

Parçaya özel forumda başlık açıp yayımlayabilirsin bulması daha kolay olur.

Doğru diyorsunuz hocam keşke herkes sizin gibi düşünse :)) var bir kaç forum saçma sapan kısıtlamaları olan. o yüzden bari burada sorayım da başta rezil olmayayım dedim :))

Dün Gece PCF8591 İLE DAC(dijital analog cevirici) uygulaması yaptım I2C üzerinden ve calıştı güzel de oldu şimdi birde Analog okuma yapıp Dijitale cevireceğim Data katoloğuna ilk baktığımda biraz farklı geldi bir kaç araştırmadan sonra dahada hakim oldum konuya.

Sonuç ise Başaralı :D

  sbit LCD_RS at RB4_bit;
  sbit LCD_EN at RB5_bit;
  sbit LCD_D4 at RB0_bit;
  sbit LCD_D5 at RB1_bit;
  sbit LCD_D6 at RB2_bit;
  sbit LCD_D7 at RB3_bit;

  sbit LCD_RS_Direction at TRISB4_bit;
  sbit LCD_EN_Direction at TRISB5_bit;
  sbit LCD_D4_Direction at TRISB0_bit;
  sbit LCD_D5_Direction at TRISB1_bit;
  sbit LCD_D6_Direction at TRISB2_bit;
  sbit LCD_D7_Direction at TRISB3_bit;


char ekranabas[15];
int degisken;
unsigned int olc;
float tut,degerkat=0.0048875855327468;  //   5/1024 ADC cevrimi 1 bit başına düşen değer


         void yap(int deger)     // PCF VERIYI BASMA FONKSİYONU GERI DEGER DONDURMUYCEK.
              {
                I2C1_Start();  //SLAVELER UYANDIRILDI.
                I2C1_Wr(0x90); //PCF Yİ CAĞIRDIK VE YAZMA YAPICAĞIMIZI BELİRTTİK
                I2C1_Wr(0x40); //PCF NİN REGİSTERİNDEKİ DAC BİRİMİ SECİLDİ.
                I2C1_Wr(deger); //DAC BİRİMİNİN İCİNDE DEGER DEĞİŞKENİ YÜKLENDİ.
                I2C1_Stop();    // I2C HATTINDAKİ İLETİŞİMİ DURDURDUK.
                }
void main(){
  ADCON0=0X00;
  ADCON1=0x00;
  cmcon=0x07; 
  TRISC=0;
  PORTC=0;
  TRISA=0XFF;
  PORTA=0X00;
  TRISB=0X00;
  PORTB=0X00;
  TRISD=0XFF;
  PORTD=0X00;
  Lcd_Init(); // lcd başlat
  ADC_Init(); //adc başlat
  I2C1_Init(100000);   // ı2c 100khz olarak başlat
  Lcd_Cmd(_LCD_CURSOR_OFF); //kursörü kapat
  Lcd_Cmd(_LCD_CLEAR);      // lcd ekranı temizle
  delay_ms(200);






  while(1) {  
           if(PORTD.RD0==1) // EĞER D PORTUNUN 0 BİTİ 1 OLMUŞ İSE
                          {
                          degisken=++degisken; //degiskeni 1 arttır.
                          yap(degisken); //  degısken degerını yap fonksiyonuna yolla
                          while(PORTD.RD0==1){} // BUTON ARKINI ÖNLE
                          }
           else if(PORTD.RD1==1) //EĞER D PORTUNUN 1. BİTİ 1 OLMUŞ İSE
                          {
                          degisken=--degisken; //degıskeni 1 eksilt
                          yap(degisken);    // degısken degerını yap fonksiyonuna yolla
                          while(PORTD.RD1==1){} // BUTON ARKINI ÖNLE
                          }
           olc=ADC_Read(2);
           tut=olc*degerkat;
           FloatToStr(tut,ekranabas);
           Lcd_Out(1,1,"  CIKIS DEGERI");
           Lcd_Out(2,1,"Voltaj = ");
           Lcd_OUT(2,10,ekranabas);
           

}
}

http://hizliresim.com/lZZ0nJ

Fotoğrafta Led tam ışıma veremese de voltaja göre gayet güzel calıştığını gösteriyor ayrıca I2C DEBUGGER ekranını da kullanmak isteyen arkadaşlar icin neyin ne olduğunu belirtmek icin ayrietten belirttim.

Tüm arkadaşlara iyi calışmalar :)

Sayfalar:1234