Program Arduino nano

3mgo
Příspěvky: 6
Registrován: 08 bře 2022, 18:16
Reputation: 0

Re: Program Arduino nano

Příspěvek od 3mgo » 10 bře 2022, 19:28

Tak jsem se řídil Vámi udělenými radami, a po prostudování fce Millis() jsem se dobral výsledku.

Kód: Vybrat vše



int cnt;
boolean pricetl_jsem;
unsigned long cas_1;
unsigned long cas_2;
boolean flag;

void setup() {
 pinMode(2, INPUT_PULLUP);
 pinMode(12, OUTPUT);
 Serial.begin(9600);
 cnt=0;
 pricetl_jsem=false;
 flag=false;
 digitalWrite(12, HIGH);
}

void loop() {
  if((digitalRead(2) == LOW) && pricetl_jsem == false) {
    cnt=cnt+1;
    Serial.println(cnt);                                                 //Kdyz je enkoder na Low pricti si +1 a zaroven si poznamenej ze uz jsi pricetl.... Pokud je Low a pricetl jsi, nedelej nic. Pokud je high, tak nastav ze jsi jeste necetl.
    pricetl_jsem=true;
  }
  if((digitalRead(2) == HIGH) && pricetl_jsem == true) {
    pricetl_jsem=false;
  }
  
  if(cnt == 180) {
    cnt=0;
    Serial.println("nizka na 12");               //impulz se poslal
    digitalWrite(12, LOW);
    cas_1=millis();
    cas_2=cas_1+200UL;
    flag=true;
    
  }
 

  if((cas_2 == millis()) && flag == true) {
    Serial.println("vysoka na 12");              //konec impulzu
    digitalWrite(12, HIGH);
    flag=false;
  }
}
Funguje téměř dokonale, impulzy počítá jak má, a na výstup se impulzy posílají většinou taky jak mají. Občas se objeví totiž taková anomálie (cca jednou za 10-20 cyklů, někdy vůbec), kdy se na pin 12 pošle impulz (nízká úroveň), ale po uběhnutí daného časového intervalu (200ms) kdy se má pin 12 přehodit opět do high stavu, se nic neděje. Přeskočí tam až po uběhnutí dalších 180 impulzů encoderu. Je to způsobeno nějákou nedokonalostí, nebo nepřesností procesoru, nebo je chyba jako obvykle na straně člověka? :DD

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Program Arduino nano

Příspěvek od peterple » 10 bře 2022, 19:49

Skús ten posledný if zmeniť na

Kód: Vybrat vše

  if((cas_2 <= millis()) && flag == true) {
    Serial.println("vysoka na 12");              //konec impulzu
    digitalWrite(12, HIGH);
    flag=false;
  }
inak raz za 49 dní je tam šanca že ti to môže zblbnúť. Tu je to málo pravdepodobné. Problém je že to testuješ chybne a ak to budeš používať do budúcna tak sa si môžeš nabehnúť. Nehovoriac o tom že vytváraš ďalší návod pre ostatných aby to robili chybne.
Naposledy upravil(a) peterple dne 10 bře 2022, 20:00, celkem upraveno 1 x.

3mgo
Příspěvky: 6
Registrován: 08 bře 2022, 18:16
Reputation: 0

Re: Program Arduino nano

Příspěvek od 3mgo » 10 bře 2022, 19:53

Může to zblbnout pouze kdyby to jelo 57 dní v kuse, ne? Nebo tak jsem to alespoň pochopil u definice funkce millis.

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Program Arduino nano

Příspěvek od peterple » 10 bře 2022, 19:55

presne tak, ale prečo ísť tomu naproti chybným testovaním.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů