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 ");
} |
i2c modüllü LCD ekranda external interrupt
-
-
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
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X