Sayın
@Gokrtl,
Bahsettiğiniz problemleri sırasıyla değerlendirerek neden kaynaklandığını anlamalıyız.
1- "Bazen elimi değmeden atlıyor" dediğinize göre (bu ifadeniz eğer mecazi bir kullanım değilse) sayaç değişmesinin tek anlamı var: Elinizin elektrik yükünden etkilenecek derecede devrenin enterferansa açık oluşu. Bunu, yaptığınız modülü inceleyerek aşmak gerekecek.
2- Birinci şıkla ilgili problem yok ise Pico üzerindeki interrupt pininin istikrarsız değişimi sonucu kesme gerçekleşerek encoder fonksiyonuna dallanma meydana gelmektedir. "bazen takılı kalıp sonsuza dek sayı artırıyor, bazen de 2 ekleyip 1 çıkaryor" ifadeniz, encoder fonksiyonu içerisinde kurduğunuz if-else yapısı ile kontrol edilen değişkenlerin, encoderdeki bir harekete bağlı olmadan gerçekleştiğini göstermekte. Bu durumda Pico'ya ait interrupt pininin doğru şekilde pull-up veya pull-down yapılıp yapılmadığını anlamak gerekiyor.
Bende herhangi bir sorun olmadan çalışmaya devam eden kod bloğunu yorumlar çıkarılmış halde yeniden paylaşıyorum...
Daha önce de dediğim gibi cli() ve sei() ile hiçbir problem yaşamadan üstelik Arduino UNO'nun interrupt pinlerinin pull-up yapılmasına binaen rotary encoder'ı yalın olarak kullandığım halde bu kod bende problemsiz çalışmakta.
Kod:
int RE_B = 7;
int RE_A = 2;
int RE_Bt = 3;
int PinB;
int Sayac1 = 0;
int Sayac = 0;
int DebounceSuresi = 100;
String Yon="Bos";
boolean Oldu = 0;
void setup() {
cli();
pinMode (RE_A,INPUT_PULLUP);
pinMode (RE_B,INPUT_PULLUP);
pinMode (RE_Bt,INPUT_PULLUP);
attachInterrupt(0, Encoding, FALLING);
attachInterrupt(1, Bt_Pushed, FALLING);
Serial.begin (9600);
Serial.print(Yon);
Serial.print("; Sayac: ");
Serial.println(Sayac);
Serial.print("Button: ");
Serial.println(Sayac1);
sei();
}
void Encoding(){
cli();
PinB=digitalRead(RE_B);
if (PinB) {
Yon="Sag";
Sayac++;
} else {
Yon="Sol";
Sayac--;
}
delay(DebounceSuresi);
Oldu = 1;
sei();
}
void Bt_Pushed(){
cli();
Sayac1+=1;
delay(DebounceSuresi);
Oldu = 1;
sei();
}
void loop() {
if (Oldu) {
Serial.print(Yon);
Serial.print("; Sayac: ");
Serial.println(Sayac);
Serial.print("Button: ");
Serial.println(Sayac1);
Oldu = 0;
}
}