Ahmet
S38>S85
- Katılım
- 31 Mayıs 2021
- Mesajlar
- 6,094
dirençleri 1k yapsak daha temiz bir pull-up alırız galiba abiBenim enkoder üzerinde pullup dirençleri ve 100nF smd kondansatörler var. Onları söküp piconun pullup olayını yapmayı deneyeceğim.
dirençleri 1k yapsak daha temiz bir pull-up alırız galiba abiBenim enkoder üzerinde pullup dirençleri ve 100nF smd kondansatörler var. Onları söküp piconun pullup olayını yapmayı deneyeceğim.
Bende pico olmadığı için ben deneyemiyorum, gönderdiğim kodları kopyalayıp dener misiniz, pico üzerinde nasıl çalışacağını görelim...Benim enkoder üzerinde pullup dirençleri ve 100nF smd kondansatörler var. Onları söküp piconun pullup olayını yapmayı deneyeceğim.
Sizin kodları hiç bir şekilde çalıştıramıyorum. Serial monitöre tek satır yazmıyor.Bende pico olmadığı için ben deneyemiyorum, gönderdiğim kodları kopyalayıp dener misiniz, pico üzerinde nasıl çalışacağını görelim...
Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
void encoder() {
boolean PinDT = digitalRead(PinDt);
boolean PinCLK = digitalRead(PinClk);
if (millis() - oncekiZaman > 1) {
if (PinCLK != oncekiDurum) {
if (PinCLK == LOW) {
if (PinDT == HIGH) {
sayac++;
Serial.print(sayac);
Serial.println(" : sag");
} else {
sayac--;
Serial.print(sayac);
Serial.println(" : sol");
}
}
}
oncekiDurum = PinCLK;
oncekiZaman = millis();
}
}
Evet benim de şimdiki sıkıntım kesmelerin çakışması.Son durumlar üzerine bazı sınamalar yaptım ve aşağıdaki durumları gördüm:
1- noInterrupt() komutu yerine detachInterrupt(digitalPinToInterrupt(Pin)) komutu kullanıldığında interrupt devre dışı kalıyor. Yeniden devreye almak için attachInterrupt() komutu ile yapılandırılması gerekiyor.
2- Kesme ile çağrılan fonksiyonda interrupt devredışı bırakılsa bile ardı ardına birkaç interrupt oluşmuş oluyor ve pals kaçırma olarak adlandırdığımız atlama meydana geliyor.
3- Interrupt kesmesi süresince, çalıştırılan fonksiyon içerisinde de delay(), delayMicroseconds() gibi komutlar işlemiyor.
SONUÇ olarak:
Paylaştığım kodların aslında hayalet bir biçimde çalıştığı... Her nasılsa encoder palslerini kaçırmadan yakalayabiliyordum. Ancak debounce süresi, delay() üzerinde değişiklikler yaptığımda bunların hiçbir etkisi olmadığını gördüm.
Bu noktada pals kaçırmanın en kesin çözümü sizin de kullandığınız şekilde interrupt zamanını millis() fonksiyonu ile kaydederek if-else bloğu içinde kontrol etmek ve uygun olmayan kesmeyi yok saymak.
Sizin kodları kullanarak birkaç deneme daha yaptıktan sonra son sonuçları paylaşacağım...
void Encoding() {
PinDT=digitalRead(7);
if (millis() - sonTik > DebounceSuresi) {
if (PinDT==HIGH) {
Sayac++;
Serial.print(Sayac);
Serial.println(" : sag");
} else {
Sayac--;
Serial.print(Sayac);
Serial.println(" : sol");
}
sonTik = millis();
}
}
void Bt_Pushed(){
if (millis() - sonButton > (DebounceSuresi*2)) {
Sayac1+=1;
Serial.println(Sayac1);
sonButton = millis();
}
}
void Encoding() {
PinDT=digitalRead(7);
detachInterrupt(digitalPinToInterrupt(2));
detachInterrupt(digitalPinToInterrupt(3));
if (millis() - sonTik > DebounceSuresi) {
if (PinDT==HIGH) {
Sayac++;
Serial.print(Sayac);
Serial.println(" : sag");
} else {
Sayac--;
Serial.print(Sayac);
Serial.println(" : sol");
}
sonTik = millis();
}
attachInterrupt(digitalPinToInterrupt(2), Encoding, FALLING);
attachInterrupt(digitalPinToInterrupt(3), Bt_Pushed, FALLING);
}
void Bt_Pushed(){
detachInterrupt(digitalPinToInterrupt(3));
detachInterrupt(digitalPinToInterrupt(2));
if (millis() - sonButton > (DebounceSuresi*2)) {
Sayac1+=1;
Serial.println(Sayac1);
sonButton = millis();
}
attachInterrupt(digitalPinToInterrupt(2), Encoding, FALLING);
attachInterrupt(digitalPinToInterrupt(3), Bt_Pushed, FALLING);
}
Yarın bakayım bu kodlara. Geç oldu benim için. Yarın evdeyim, kurcalarım bayağı.Bu şekilde detachInterrupt() ve attachInterrupt() kullanarak kesmeleri durdurunca geri sayım ile de karşılaşmadım.
Hayırlı geceler...Yarın bakayım bu kodlara. Geç oldu benim için. Yarın evdeyim, kurcalarım bayağı.
Hayırlı geceler.Hayırlı geceler...
Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Günaydın.Arduino IDE 1.8.13 Üzerinde Arduino UNO İçin Yazıldı:
Kod:void Encoding() { PinDT=digitalRead(7); detachInterrupt(digitalPinToInterrupt(2)); detachInterrupt(digitalPinToInterrupt(3)); if (millis() - sonTik > DebounceSuresi) { if (PinDT==HIGH) { Sayac++; Serial.print(Sayac); Serial.println(" : sag"); } else { Sayac--; Serial.print(Sayac); Serial.println(" : sol"); } sonTik = millis(); } attachInterrupt(digitalPinToInterrupt(2), Encoding, FALLING); attachInterrupt(digitalPinToInterrupt(3), Bt_Pushed, FALLING); } void Bt_Pushed(){ detachInterrupt(digitalPinToInterrupt(3)); detachInterrupt(digitalPinToInterrupt(2)); if (millis() - sonButton > (DebounceSuresi*2)) { Sayac1+=1; Serial.println(Sayac1); sonButton = millis(); } attachInterrupt(digitalPinToInterrupt(2), Encoding, FALLING); attachInterrupt(digitalPinToInterrupt(3), Bt_Pushed, FALLING); }
attachInterrupt(digitalPinToInterrupt(2)
buradaki "2" neyi ifade ediyor?328'deki 2 numaralı interruptu ifade ediyor abiGünaydın.
Burada anlamadığım bir durum var.
1-attachInterrupt(digitalPinToInterrupt(2)
buradaki "2" neyi ifade ediyor?
abi bir karışıklık var sanırım burda 0 yazınca d2 oluyorduArduino UNO'da iki adet external interrupt pini mevcut. Bu pinler 2 ve 3 nolu dijital pinler. 2 nolu pin 0 nolu interrupt, 3 nolu pin ise 1 nolu interrupt'a bağlı.
attachInterrupt(PinNumber, ISR, TRIGGER) yapılandırması esnasında interrupta atanacak pin numarasının digitalPinToInterrupt(2) şeklinde belirtilmesi öneriliyor. İlgili sayfanın linki burada...
Öyle de oluyordu, ancak önerilen sözdizimi bu şekilde...abi bir karışıklık var sanırım burda 0 yazınca d2 oluyordu
page = 'a';
olarak akımın set edileceği sayfaya yönlendiriyorum. Bu işlemi yaptıktan sonra encoder 50 çevirmede 1 pals atlayacak gibi çalışıyor. (50 sayısı örnektir. bolca çevirmek gerekiyor).page = 'i';
yaptığımda ise (index) anasayfaya yönleniyor ve burada encoder sorunsuz çalışıyor.if (page == 'a') {
u8g2.clearBuffer();
if (digitalRead(right_btn) == 1) {
if (kursor_konum == 0) {
kursor_konum = 1;
} else if (kursor_konum == 1) {
kursor_konum = 2;
} else if (kursor_konum == 2) {
kursor_konum = 3;
} else {
kursor_konum = 0;
}
}
if (digitalRead(left_btn) == 1) {
if (kursor_konum == 0) {
kursor_konum = 3;
} else if (kursor_konum == 3) {
kursor_konum = 2;
} else if (kursor_konum == 2) {
kursor_konum = 1;
} else {
kursor_konum = 0;
}
}
if (kursor_konum == 0) {
u8g2.drawLine(52, 41, 59, 41);
u8g2.drawLine(52, 42, 59, 42);
sayi1 = sayac;
} else if (kursor_konum == 1) {
u8g2.drawLine(64, 41, 71, 41);
u8g2.drawLine(64, 42, 71, 42);
sayi2 = sayac;
} else if (kursor_konum == 2) {
u8g2.drawLine(88, 41, 95, 41);
u8g2.drawLine(88, 42, 95, 42);
sayi3 = sayac;
} else if (kursor_konum == 3) {
u8g2.drawLine(100, 41, 107, 41);
u8g2.drawLine(100, 42, 107, 42);
sayi4 = sayac;
}
voltaj_akim = sayi1 * 10.0 + sayi2 * 1.0 + sayi3 * 0.1 + sayi4 * 0.01;
//// Akım değerini ekrana yazdırma /////
drawF(0, 0, 128, 64, 1, 1, 126, 62);
u8g2.drawLine(5, 18, 122, 18);
u8g2.drawLine(5, 46, 122, 46);
u8g2.setFont(u8g2_font_VCR_OSD_tr);
u8g2.setCursor(4, 40);
u8g2.print("SET:");
ival = voltaj_akim * 100;
sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
u8g2.setCursor(50, 40);
u8g2.print(buffer);
u8g2.setCursor(112, 40);
u8g2.print(F("A"));
u8g2.sendBuffer();
}