Şimdi Ara

i2c modüllü LCD ekranda external interrupt

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
5
Cevap
0
Favori
780
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • kulandığım Ekran 16x2 (0x27) dış kesme ile ekrana yazı yazdırmak istedim ama her zaman yaptığım yöntemi kullanmama rağmen olmadı. Kullanılan modülün bunda etkisi var mıdır varsa bir yöntemi var mı?


    buton kesme olarak tanımladığım kısmın çalışıp ekrana yazmasını istiyordum proteusta PCF8574 kullandım.


    kodum :

    -------------------------------------------


    #include <ACS712.h>

    #include <LiquidCrystal_I2C.h>


    LiquidCrystal_I2C lcd(0x27,16,2); 


    const int currentSensor = A0;

    float Cdata=0;

    float value;

    float V,I;




    int analogCell_1 = A1; // Hücre_1 okuma pini

    int analogCell_2 = A2;

    int analogCell_3 = A3;


    //float vout = 0.0;

    float vc1 = 0.0, vc2 = 0.0, vc3 = 0.0;

    float R1 = 100000.0;  // 100K ohm direnç

    float R2 = 10000.0;  // 10K ohm direnç

    //int V_data = 0;


    int sn=0; int dk=0; int sa=0; //Zaman göstergesi için tanımlamalar.

     

    void setup()

    pinMode(analogCell_1, INPUT);

    pinMode(analogCell_2, INPUT);

    pinMode(analogCell_3, INPUT);

    attachInterrupt(0, buton_kesme , RISING);



    lcd.init();           // lcd başlatılır,Güç verilir.

    lcd.backlight();         // lcd arka plan ışığı aktif edilir.


    lcd.setCursor(0,0);       // imleç 0. sütun 0. satıra gelir.

    lcd.print("BASLATILIYOR...");  // Ekrana yazdırır.

    delay(300);           // 300 ms süre


    for(int i=16 ; i>=0 ; i--){    // For döngüsü ile sola kayan yazı yapımı.

     lcd.setCursor(i,1);       // imleç i. sütun 0. satıra gelir.

     lcd.print("LI-PO SARJ EDICI");  // Ekranda sola doğru kayacak olan yazı.

    delay(200);         }  // Geçiş için 200 ms süre ayarlandı.


    delay(1000);           // Döngü bittikten sonra ekranda 1000ms bekleme süresi.

    lcd.clear();           // Ekranı temizle


     //TIMER1 KESMESİ AYARLANIYOR

     cli();

     TCNT1 = 0;

     TCCR1A = 0;

     TCCR1B = 0;

     OCR1A = 15624; // 1 saniye çalışması için gerekli zaman kesmesi frekansı

     TCCR1B |= (1 << WGM12);

     TCCR1B |= (1 << CS12) | (1 << CS10);

     TIMSK1 |= (1 << OCIE1A);

     sei();


    }


    void buton_kesme()

    {

       float C1=0.0, C2=0.0, C3=0.0;

      C1 = vc1;

      C2 = vc2 - vc1;

      C3 = vc3 - vc2;


      lcd.clear(); 

      lcd.setCursor(0,0);

      lcd.print("C1:"); lcd.print(vc1,3); //lcd.print("V");

      lcd.print(" C2:"); lcd.print(C2,3); //lcd.print("V");

      lcd.setCursor(0,1);

      lcd.print("C3:"); lcd.print(C3,3); lcd.print("     ");

      attachInterrupt(0, degil_buton, FALLING); 

     

    }


    void degil_buton()

    {

    attachInterrupt(0, buton_kesme, RISING);

    }



    void Current() // Çekilen akım fonksiyonu

    {


      for (int i = 0; i < 300; i++)   // Daha kararlı sonuç için 300 kere okuma yapılıyor.

      {

       Cdata = Cdata + analogRead(currentSensor);

       delay(1);

      }

     Cdata=Cdata/300; 


      V=(Cdata/1023.0)* 4995;            

      I=((V - 2500)/ 96);

      //delay(10);

     return I; 

    }



    void V_cell_1 () // Hücre 1 gerilim fonksiyonu

    {

     float vout = 0.0;

     int V_data = 0;

      

      V_data = analogRead(analogCell_1);

      vout = (V_data * 5.0) / 1023.0; 

      vc1 = vout / (R2/(R1+R2)); 

      delay(300);

              

      return vc1;  // vc1 değerini döndür.

    }



    void V_cell_2 () // Hücre 2 gerilim fonksiyonu

    {


      float vout = 0.0;

     float V_data = 0;

       V_data = analogRead(analogCell_2);

      vout = (V_data * 5.0) / 1023.0; 

      vc2 = vout / (R2/(R1+R2)); 

      delay(300);

       return vc2;

    }



    void V_cell_3 () // Hücre 3 gerilim fonksiyonu

    {

     float vout = 0.0;

     float V_data = 0;

       V_data = analogRead(analogCell_3);

      vout = (V_data * 5.0) / 1023.0; 

      vc3 = vout / (R2/(R1+R2)); 

      delay(300);

      return vc3;

    }



    ISR(TIMER1_COMPA_vect){   //Her kesmeye girildiğinde otomatik çalıştırılacak fonksiyon.


      sn++;

       if(sn==60)

            {

             ++dk;

             sn=0;  

            }

       if(dk==60)

           {         

            ++sa;

            dk=0;

           }


    }



    void loop()

    {

    Current(); // Akım fonksiyonunu çağır.

    V_cell_1();

    V_cell_2(); 

    V_cell_3(); 


      float C1=0.0, C2=0.0, C3=0.0;

      C1 = vc1;

      C2 = vc2 - vc1;

      C3 = vc3 - vc2;


      lcd.setCursor(0,0); // 0.sütun 0. satırdan başla.

      lcd.print("ZAMAN : "); lcd.print(sa); lcd.print(":"); lcd.print(dk); lcd.print(":"); lcd.print(sn); // Geçen süreyi ekrana sa,dk,sn olarak yaz.


      lcd.setCursor(0,1);

      lcd.print("AKIM : "); lcd.print(I,3); lcd.print("A   ");

       




    }








  • Kesme ile olmaz. Kesme işlemleri arduino içinde çok kısa, basit olmalı. LCD iletişim süreci kesme içinden yönetilebilecek kadar basit değildir.


    Kesme işlemlerini bir kesme geldi diye işaret edecek bir değişkeni tetikle. Ana döngü içinde bu kesme geldi değişkenine bakarak işlemleri yaptır.

  • Kesme içinden LCD'ye pekala yazdırılabilir. Ancak kesme anında normal döngüde LCD'ye gönderilen bir komutun yarım kalması ve bu yüzden kesme içinde LCD'ye göndereceğiniz kodun tutarsız sonuçlar vermesine neden olacaktır. Ayrıca ve kesmeden çıkıp döngüye dönüldüğünde, yarıda kesilen LCD veri transferine devam edilecek ve yine tutarsız ve beklenmeyen sonuçlar ortaya çıkacaktır. LCD ile iletişim yavaş olduğundan kesme içinde içinde LCD'ye yazmak normal döngünün işleyişinde gecikmelere sebep olacaktır. Kesme değişken atamaları yapıp ana döngüde bu değişkenleri kullan. 1 aylık başlıkmış sorunu çoktan çözmüşsündür...

  • Evet, sizin de belirttiğiniz üzere değişken atamasıyla sorunu çözmüş bulunmaktayım. Teşekkürler

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.