Kód: Egész kijelölése
int val=0;
boolean send=false;
int button=8;
int rotaryA=2; //int0
int rotaryB=3; //int1
//int rotaryA=9; //no int
//int rotaryB=10; //no int
int zoldLed=11;
int pirosLed=12;
int fixLed=13;
volatile int encoderPos = 0;
void setup(){
pinMode(button, INPUT);
digitalWrite(button, HIGH); //Belső felhúzóval
pinMode (rotaryA, INPUT); //Külső Felhúzó
pinMode(rotaryB, INPUT); //Külső PullUp
pinMode (9, INPUT);
pinMode(10, INPUT);
pinMode(zoldLed, OUTPUT);
pinMode(pirosLed, OUTPUT);
pinMode(fixLed, OUTPUT);
/*
Amikor a mehanikus "röcögtetője" fix pozíciót ad, akkor az A érintkező fix helyzetű
*/
if (digitalRead(rotaryA) == HIGH){ //Ha az A csatorna magas
attachInterrupt(0, rotaryHandlingLowA, RISING);} //akkor lefutó él jön
else{
attachInterrupt(0, rotaryHandlingHighA, FALLING);} //egyébként felfutó követketik
digitalWrite (zoldLed, digitalRead(rotaryA));
digitalWrite (pirosLed, digitalRead(rotaryB));
Serial.begin(9600);
Serial.println("START");
}
void loop(){
if ((send == false) && (digitalRead(button) == false)){
send=true;
Serial.println("***************");
}
if (digitalRead(button) == HIGH){
send = false;
}
}
void rotaryHandlingLowA(){
detachInterrupt(0);
digitalWrite (zoldLed, LOW); //Debug
Serial.println("A le");
if (digitalRead (rotaryB) == LOW){ //Ha a másik vonal alacsony,
attachInterrupt (1, rotaryHandlingHighB, FALLING);} //akkor magas következik
else{
attachInterrupt (1, rotaryHandlingLowB, RISING); //Ha magas volt alacsony következik
}
}
void rotaryHandlingHighA(){
detachInterrupt(0);
digitalWrite (zoldLed, HIGH);
Serial.println("A fel");
if (digitalRead (rotaryB) == LOW){
attachInterrupt (1, rotaryHandlingHighB, FALLING);}
else{
attachInterrupt (1, rotaryHandlingLowB, RISING);
}
}
void rotaryHandlingLowB(){
detachInterrupt(1);
digitalWrite (pirosLed, LOW);
Serial.println("B le");
if (digitalRead (rotaryA) == LOW){
attachInterrupt (0, rotaryHandlingHighA, FALLING);}
else{
attachInterrupt (0, rotaryHandlingLowA, RISING);
}
}
void rotaryHandlingHighB(){
detachInterrupt(1);
digitalWrite (pirosLed, HIGH);
Serial.println("B fel");
if (digitalRead (rotaryA) == LOW){
attachInterrupt (0, rotaryHandlingHighA, FALLING);}
else{
attachInterrupt (0, rotaryHandlingLowA, RISING);
}
}
Az a probléma, hogy egy csatorna kétszer egymás után ugyan abba az irányba nem lépet. Ahhoz hogy fel léphessen előtte le kell lépnie, és meg is teszi, mert a működést szkópon lestem. Az ábrát is csatolnám, ha tudnám hogyan kell. Így most csak legenda, de az ábra jó működést mutat az enkóder lábán.START
A fel
B le
A fel
B le
A le
B le
A le
A lényeg, hogy kimaradnak megszakítások, nem jön az aminek kellene, ezért tud úgy röccenni (hopp egy szakkifejezés) az enkóder, hogy nem változik a led, és a sorosra sem érkezik meg minden várt szöveg. Azt gondolom, hogy a megszakítás tiltás/engedélyezés körül lehet a gond. Vagy nem is így kell ezt csinálni, hogy eldobom, majd újra felveszem a megszakítást? Tud valaki segíteni? Van valakinek ötlete? Én meg közben megnézem szkóppal, hogy a proc lábát kímélő pár száz ohm proc felé eső lábán is korrekt-e a jel.