Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • delay ale aby program bežal dalej

delay ale aby program bežal dalej

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

delay ale aby program bežal dalej

Odoslaťod ITIaster » 21 Okt 2017, 22:12

Zdravím hoši som tu znova s tým delay blbým, tentoraz potrebujem aby mi program bežal dalej no po 2 sekundách aby niečo vykonal ... je to blbé rozpisovať, dúfam to pochopíte z programu o čo mi ide...
a keďže neviem čo použiť namiesto toho delay tak stále čakám 1s kým môžem znova pridať hlasitosť alebo bassy...
fungovať to nejako musí len neviem ako to naprogramovať, moja veža to tak mala...
pokiaľ som jej napríklad pridal bassy vypísala sa hodnota pre basy a po 3s sa vrátila späť na frekvenciu rádia ale všetky tlačidlá boli aktivne, či zmena vstupu pridanie hlasitosti a podobne, reagovali ihneď a ako keby prerušili ten časovač čo čakal tie 3s a hneď ukazalo napr. zmenu vstupu a tam to tiež čakalo 3s a tiež to bolo hneď aktívne...

Kód: Vybrať všetko
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
long time = 0;
long debounce = 200;

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


const int encoder_pin_A = 4;   // the pin where is PIN A of encoder connected
const int encoder_pin_B = 5;   // the pin where is PIN B of encoder connected

const int BASS_UP = 7;           // the pin where is Bass button connected
const int BASS_DOWN = 8;           // the pin where is Bass button connected

// Variables will change:
int Vol =  50;   // counter for the number of button presses
int VolupState = 0;         // current state of the button
int lastVolupState = 0;     // previous state of the button
int VoldownState = 0;
int lastVoldownState = 0;
int encoder_A_read = LOW;          // initializating and setting start value for encoder_A_read
int encoder_A_Laststate = LOW;     // initializating and setting start value for encoder_A_Laststate
int encoder_B_read = LOW;          // initializating and setting start value for encoder_B_read
int encoder_B_Laststate = LOW;     // initializating and setting start value for encoder_B_Laststate
int BASS_UP_State = LOW;
int BASS_DOWN_State = LOW;
int BASS_UP_lastState = LOW;
int BASS_DOWN_lastState = LOW;
int BASS = 0;

void setup() {
  // initialize the buttons pin as a input:
  pinMode(encoder_pin_A, INPUT_PULLUP);   //Set pin encoder_pin_A(7) as input
  pinMode(encoder_pin_B, INPUT_PULLUP);   //Set pin encoder_pin_B(6) as input
  pinMode(BASS_UP, INPUT_PULLUP);         //Set pin BASS as input
  pinMode(BASS_DOWN, INPUT_PULLUP);       //Set pin BASS as input
 
  lcd.begin(16,2);
   
 
}


void loop() {
  // read the pushbutton input pin:
encoder_A_read = digitalRead(encoder_pin_A);
   encoder_B_read = digitalRead(encoder_pin_B);
   if (encoder_A_Laststate == LOW && encoder_A_read == HIGH && encoder_B_read == LOW && Vol != 1 && millis() - time > debounce)
   { Vol--;
 
     lcd.clear();
     lcd.print("Volume: ");
     lcd.print(Vol);
     
   }
else if (encoder_A_Laststate == LOW && encoder_A_read == HIGH && encoder_B_read == LOW && Vol == 1 && millis() - time > debounce)
        { lcd.clear();
          lcd.print("Volume:MIN");
         
        } 
else{}

if (encoder_B_Laststate == LOW && encoder_B_read == HIGH && encoder_A_read == LOW && Vol !=72 && millis() - time > debounce)
   { Vol++;
   
     lcd.clear();
     lcd.print("Volume: ");
     lcd.print(Vol);
     
     
   }
   
else if (encoder_B_Laststate == LOW && encoder_B_read == HIGH && encoder_A_read == LOW && Vol ==72 && millis() - time > debounce)   
       { lcd.clear();
         lcd.print("Volume:MAX");
        } 
       
else{}




//-----------------------------------------------------------------------------
  BASS_UP_State = digitalRead(BASS_UP);
  BASS_DOWN_State = digitalRead(BASS_DOWN);


if (BASS_UP_State != BASS_UP_lastState) {
    // if the state has changed, increment the counter
    if (BASS_UP_State == HIGH && BASS < 10 ) {
      BASS ++;
      lcd.clear();
      lcd.print("BASS: ");
      lcd.print(BASS);
      delay(1000);
      lcd.clear();
      lcd.print("Volume: ");
      lcd.print(Vol);
     
    }
    else if (BASS_UP_State == HIGH && BASS == 10 ) {
      lcd.clear();
      lcd.print("BASS: MAX");
      delay(1000);
      lcd.clear();
      lcd.print("Volume: ");
      lcd.print(Vol);
    }
    else{}
  }
   


  //__________________________________________________________________________________________________________________________

  if (BASS_DOWN_State != BASS_DOWN_lastState) {
    // if the state has changed, increment the counter
    if (BASS_DOWN_State == HIGH && BASS !=0 ) {
      BASS --;
      lcd.clear();
      lcd.print("BASS: ");
      lcd.print(BASS);
      delay(1000);
      lcd.clear();
      lcd.print("Volume: ");
      lcd.print(Vol);
     
    }
    else if (BASS_DOWN_State == HIGH && BASS == 0 ) {
      lcd.clear();
      lcd.print("BASS: OFF");
      delay(1000);
      lcd.clear();
      lcd.print("Volume: ");
      lcd.print(Vol);
    }
    else{}
  }


 
 
  // save the current state as the last state,
  //for next time through the loop
  encoder_A_Laststate = encoder_A_read;
  encoder_B_Laststate = encoder_B_read;
  BASS_UP_lastState = BASS_UP_State;
  BASS_DOWN_lastState = BASS_DOWN_State;
}
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington
ITIaster
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 131
Vek: 19.06
Založený: 01.06.2014
Karma: 0

Re: delay ale aby program bežal dalej

Odoslaťod popopepe » 21 Okt 2017, 22:33

příklad Blink without delay v arduino IDE?
popopepe
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 390
Založený: 22.06.2009
Karma: 4

Re: delay ale aby program bežal dalej

Odoslaťod peterple » 21 Okt 2017, 22:42

máš to v tom tvojom programe. milis(). Je jedno či to má čakať par milisekund na dokmitanie kontaktu alebo dve sekundy. Max doba čo to odčasuje je nejakých 49 dní. Ale treba pochopiť ako to ten program robí ak si to len prebral z netu bez hlbšieho skúmania. To tu je inak dosť evergreen.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: delay ale aby program bežal dalej

Odoslaťod m6r3k » 21 Okt 2017, 22:56

ITIaster neviem ako v Arduine ale v C sa to da spravit pekne pomocou presušenia z časovača (to je to svoje čakanie ) .

takže na ovladanie encoderom použiješ prerušenie na INT0 pre nabežnú / zostupnú + testovanie či je druhý spinač enkodera v 0-1

týmto usetris INT1

Pre tvoje cakanie 2s by som využil timer counter 2 a krystal 32kHz na prislusne piny čím získaš prerusenia po 1s cize vydelis dvoma a mas 2s. V hlavnej smycke už neháš iba somarinky typu výpis na LCD na zaklade premennych ktoré budes inkrementovať - dekrementovať v preruseniach

Dolezite je si uvedomiť ktoré prerusenie má prednosť
Reset
...
INT
...
TImer
...
...
m6r3k
Okoloidúci
Okoloidúci
Príspevky: 48
Vek: 25
Založený: 29.07.2013
Bydlisko: Brno
Karma: 0

Re: delay ale aby program bežal dalej

Odoslaťod ITIaster » 21 Okt 2017, 23:30

vďaka m6r3k :D ale už som to vyriešil, zatiaľ si hlavu s C nezaťažujem :D

veľká vďaka peterple, je to síce basic ale takto sa to učím, že to potrebujem v praxi, neviem ako, opýtam sa, dostanem odpoveď "naštuduj si ...." a vtedy sa to naučím, vyskúšam a zapamätám :D vďaka ešte raz :)

program vyzera takto :

Kód: Vybrať všetko
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
long time = 0;
long debounce = 200;
long basstime = 0;

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


const int encoder_pin_A = 4;   // the pin where is PIN A of encoder connected
const int encoder_pin_B = 5;   // the pin where is PIN B of encoder connected

const int BASS_UP = 7;           // the pin where is Bass button connected
const int BASS_DOWN = 8;           // the pin where is Bass button connected

// Variables will change:
int Vol =  50;   // counter for the number of button presses
int VolupState = 0;         // current state of the button
int lastVolupState = 0;     // previous state of the button
int VoldownState = 0;
int lastVoldownState = 0;
int encoder_A_read = LOW;          // initializating and setting start value for encoder_A_read
int encoder_A_Laststate = LOW;     // initializating and setting start value for encoder_A_Laststate
int encoder_B_read = LOW;          // initializating and setting start value for encoder_B_read
int encoder_B_Laststate = LOW;     // initializating and setting start value for encoder_B_Laststate
int BASS_UP_State = LOW;
int BASS_DOWN_State = LOW;
int BASS_UP_lastState = LOW;
int BASS_DOWN_lastState = LOW;
int BASS = 0;

void setup() {
  // initialize the buttons pin as a input:
  pinMode(encoder_pin_A, INPUT_PULLUP);   //Set pin encoder_pin_A(7) as input
  pinMode(encoder_pin_B, INPUT_PULLUP);   //Set pin encoder_pin_B(6) as input
  pinMode(BASS_UP, INPUT_PULLUP);         //Set pin BASS as input
  pinMode(BASS_DOWN, INPUT_PULLUP);       //Set pin BASS as input
 
  lcd.begin(16,2);
   
 
}


void loop() {
  // read the pushbutton input pin:
encoder_A_read = digitalRead(encoder_pin_A);
   encoder_B_read = digitalRead(encoder_pin_B);
   if (encoder_A_Laststate == LOW && encoder_A_read == HIGH && encoder_B_read == LOW && Vol != 1 && millis() - time > debounce)
   { Vol--;
 
     lcd.clear();
     lcd.print("Volume: ");
     lcd.print(Vol);
     
   }
else if (encoder_A_Laststate == LOW && encoder_A_read == HIGH && encoder_B_read == LOW && Vol == 1 && millis() - time > debounce)
        { lcd.clear();
          lcd.print("Volume:MIN");
         
        } 
else{}

if (encoder_B_Laststate == LOW && encoder_B_read == HIGH && encoder_A_read == LOW && Vol !=72 && millis() - time > debounce)
   { Vol++;
   
     lcd.clear();
     lcd.print("Volume: ");
     lcd.print(Vol);
     
     
   }
   
else if (encoder_B_Laststate == LOW && encoder_B_read == HIGH && encoder_A_read == LOW && Vol ==72 && millis() - time > debounce)   
       { lcd.clear();
         lcd.print("Volume:MAX");
        } 
       
else{}




//-----------------------------------------------------------------------------
  BASS_UP_State = digitalRead(BASS_UP);
  BASS_DOWN_State = digitalRead(BASS_DOWN);


if (BASS_UP_State != BASS_UP_lastState) {
    // if the state has changed, increment the counter
    if (BASS_UP_State == HIGH && BASS < 10 ) {
      BASS ++;
      lcd.clear();
      lcd.print("BASS: ");
      lcd.print(BASS);
      basstime = millis();
     
     
    }
    else if (BASS_UP_State == HIGH && BASS == 10 ) {
      lcd.clear();
      lcd.print("BASS: MAX");
      basstime = millis();
    }
    else{}
  }
   


  //_______________________________________________________________________________________________________________________________________________________________________________________

  if (BASS_DOWN_State != BASS_DOWN_lastState) {
    // if the state has changed, increment the counter
    if (BASS_DOWN_State == HIGH && BASS !=0 ) {
      BASS --;
      lcd.clear();
      lcd.print("BASS: ");
      lcd.print(BASS);
      basstime = millis();
     
    }
    else if (BASS_DOWN_State == HIGH && BASS == 0 ) {
      lcd.clear();
      lcd.print("BASS: OFF");
      basstime = millis();
    }
    else{}
  }

if (millis() == basstime+2000)
      {
     
      lcd.clear();
      lcd.print("Volume: ");
      lcd.print(Vol);}
 
 
  // save the current state as the last state,
  //for next time through the loop
  encoder_A_Laststate = encoder_A_read;
  encoder_B_Laststate = encoder_B_read;
  BASS_UP_lastState = BASS_UP_State;
  BASS_DOWN_lastState = BASS_DOWN_State;
 
}




"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington
ITIaster
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 131
Vek: 19.06
Založený: 01.06.2014
Karma: 0

Re: delay ale aby program bežal dalej

Odoslaťod peterple » 22 Okt 2017, 10:23

Máš tam dve chyby. Prvá je že to testuješ na rovnosť. Ak sa ti to niekde zdrží a netrafí sa presne tá daná milisekunda tak sa nič nevykoná. Druhá nastane keď ten test opravíš a dáš tam test väčší rovný. Potom to bude fungovať dobre ale v čase 2 sekundy pred pretečením toho long počítadla v milis, to čakať 2 sekundy nebude.

Obe chyby sú poriadne zradné. prvá sa ti prejaví až kód ktorý máš v loope bude trvať dlhšie ako 1 ms. To teraz asi nehrozí. Ale ako tam budeš pridávať ďalej tak pri istých okolnostiach to nastane, a ty si budeš lámať hlavu prečo to nejde.
Druhá chyba je ešte horšia, lebo sa môže prejaviť iba v čase 2 sekundy, raz za 49 dní (pretečenie počítadla). Na to pri testovaní nemáš šancu prísť. Pri používaní by to bola náhoda jak hrom a mávlo by sa nadtým rukou, lebo ďalší pokus by už fungoval. Ale ak by si ten interval natiahol na hodiny, tak to už by uživateľ asi zbadal (alebo aj nie).

Prečo si to neurobil ako je urobené to debounce? Nerobili to tak pre srandu králikom, ale preto že to robili ľudia čo tomu rozumejú. To nemá ani jednu z popisovaných chýb. A to sa tam jedná o desiatky milisekund.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: delay ale aby program bežal dalej

Odoslaťod ITIaster » 22 Okt 2017, 22:43

tak ako funguje to perfektne :D tak chybu som nikde nepocítil, a inak sa mi to nepodarilo prepísať aby to fungovalo, buď to nejde vôbec, alebo každých 49dní alebo mi to robí pri opakovaní void loop takže vkuse...
skúsim si to naštudovať najbližšie keď bude čas... ale keby si mi polopatisticky vysvetlil ako to mám použiť bol by som ti vďačný :)
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington
ITIaster
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 131
Vek: 19.06
Založený: 01.06.2014
Karma: 0

Re: delay ale aby program bežal dalej

Odoslaťod peterple » 23 Okt 2017, 21:43

veď som písal že sú to zradné chyby. Objavia sa keď to budeš najmenej čakať. Možno to časom napíšem lopatistickejšie, ale teraz mám iný program. Takže urob to ako robia debounce a nijako inak.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: delay ale aby program bežal dalej

Odoslaťod peterple » 01 Nov 2017, 00:51

Tak som to napísal. Či je to lopaticky napísané musíš posúdiť ty. Kedže raz vidieť je lepšie ako 100x počuť a 1000x čítať, je tam urobená interaktívna simulácia čo sa v premenných deje. Z toho dôvodu sa to nedá dať sem ako obyčajný text. Prečítať sa to dá tu:
http://www.plesnik.sk/Sim/millis.html
Naposledy upravil peterple dňa 13 Nov 2017, 18:48, celkovo upravené 1 krát.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: delay ale aby program bežal dalej

Odoslaťod ITIaster » 12 Nov 2017, 21:35

Ďakujem veľmi pekne, teraz som tomu porozumel :D je to dostatočne lopaticky :D

máš SS odo mňa :)
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington
ITIaster
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 131
Vek: 19.06
Založený: 01.06.2014
Karma: 0

Re: delay ale aby program bežal dalej

Odoslaťod AEdison » 12 Nov 2017, 22:13

peterple napísal:Tak som to napísal. Či je to lopaticky napísané musíš posúdiť ty. Kedže raz vidieť je lepšie ako 100x počuť a 1000x čítať, je tam urobená interaktívna simulácia čo sa v premenných deje. Z toho dôvodu sa to nedá dať sem ako obyčajný text. Prečítať sa to dá tu:
http://www.plesnik.sk/Sim/milis.html

Veľmi pekný návod. Ja som si vďaka nemu našiel zblúdilu chybičku vo svojich kódoch. Len by som rád upozornil že funkcia millis() nie milis().
AEdison
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 837
Vek: 22.42
Založený: 13.07.2009
Bydlisko: Drienov
Karma: 17

Re: delay ale aby program bežal dalej

Odoslaťod peterple » 13 Nov 2017, 18:52

Ďakujem za upozornenie. Opravil som to plus nejaké kozmetické chyby. Aj som zmenil meno súboru takže link je teraz http://www.plesnik.sk/Sim/millis.html.
Ak by ste vedeli ešte nejaký iný scenár ako sa to dá pokaziť, dajte vedieť. Môžem doplniť.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: delay ale aby program bežal dalej

Odoslaťod zen » 14 Nov 2017, 18:51

Ked uz, tak by som dal:

Kód: Vybrať všetko
if (elapsedTime >= 1000)


Predstav si, ze chces urobit cosi kazdou milli (neriesim, ci Arduino na to ma kapacitu). Urobis to len v parnych alebo neparnych.
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 286
Založený: 22.11.2013
Bydlisko: Cadca
Karma: 4

Re: delay ale aby program bežal dalej

Odoslaťod peterple » 15 Nov 2017, 19:38

Máš pravdu bez rovná sa, bude ten časový interval o milisekundu dlhší. Ja som to prebral z príkladov na debounce. Tam to majú bez rovná sa. Ona sa tá millis používa zvyčajne tam kde nevadí hore dole nejaká milisekunda. Aj keď by sa aj tento kód dal ľahko upraviť aby interval bol presná sekunda. Takto ako to je v príkladoch uvedené bude ten interval kĺzať v závislosti na dĺžke oboch vykonávaných akcií.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43

Re: delay ale aby program bežal dalej

Odoslaťod zen » 16 Nov 2017, 15:21

peterple napísal:Takto ako to je v príkladoch uvedené bude ten interval kĺzať v závislosti na dĺžke oboch vykonávaných akcií.


Hadam, ze do toho padne vela ludi. Da sa to vyriesit, len to je piplacka ak to vsetko je v loop(). Asi najjednoduchsie by bolo "rob nieco stale" ako funkciu, ale to bude aj tak spagetti code. Ak som robil "multitasking", dal som kazdu akciu do jednej funkcie.
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 286
Založený: 22.11.2013
Bydlisko: Cadca
Karma: 4

Re: delay ale aby program bežal dalej

Odoslaťod ITIaster » 19 Nov 2017, 19:17

fajn, vyriešiť return screen sa mi podarilo, ale, čo ak by som chcel animáciu na displayii ktorá by sa tiež zobrazovala nezávisle od programu ? povedzme že mám 3 znaky ktoré sa majú zobrazovať stále dookola, a medzi nimi má byť 1s prestávka, poprípade by som si dal prestávku do premennej a vedel ju regulovať... mam to teraz takto riešené cez delay ale čakať na zareagovanie tlačidla 3sekundy je iný hardcore :D takže potrebujem tam znova riešenie cez millis() ... a nie nechcem tam interrupty, pretože to tlačítko ma zastaviť animáciu, zobraziť niečo na displayii, zmeniť 1 hodnotu a pokračovať dalej (tiež zatiaľ riešené cez delay ale funguje perfektne... ) čiže znova sa spustí animácia a menia sa mi tie 3 znaky...

takže otázka znie ako to nahodiť cez millis() ? :D mne sa podarilo zobrazovať buď iba 1 znak alebo sa snažilo písať všetky 3 naraz ... jasné že smial som sa aký som sprostý keď som potom reverzne pozeral do programu :D ale riešenie som aj tak nenašiel :D
"Nemôžete sa báť ľudí, že vám ublížia, pretože ak sa budete obávať života, nikdy nebudete žiť..."
Chester Bennington
ITIaster
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 131
Vek: 19.06
Založený: 01.06.2014
Karma: 0

Re: delay ale aby program bežal dalej

Odoslaťod boraicho » 19 Nov 2017, 20:47

Ja by si nastavil prerusenie na kazdych 0,1sek a v preruseni pripocitaval a v obsluznom programe if kde bude ak sa cas== 10 cize sekunda tak sa vykona.
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
boraicho
Obrázok používateľa
Ultimate člen
Ultimate člen
Príspevky: 11463
Vek: 28.93
Založený: 03.02.2007
Bydlisko: Prešov
Karma: 40

Re: delay ale aby program bežal dalej

Odoslaťod alidedko » 19 Nov 2017, 22:08

boraicho: to by nemohlo byt arduino, lebo na to nie je kniznica :)

Preco to nemoze byt interruptom???

ITIaster napísal:a nie nechcem tam interrupty, pretože to tlačítko ma zastaviť animáciu, zobraziť niečo na displayii, zmeniť 1 hodnotu a pokračovať dalej
Trhala si chrasty, tretieho dvanásty ...
alidedko
Ultimate člen
Ultimate člen
Príspevky: 3189
Vek: 25.8
Založený: 04.02.2013
Bydlisko: U alibabky v Poprade
Karma: 22

Re: delay ale aby program bežal dalej

Odoslaťod peterple » 19 Nov 2017, 23:30

Oba predrečníci sú trochu mimo so svojimi odpoveďami.

Alidedko:
Ale ono to je interruptom. Funkcia millis() používa na svoju činnosť 8 bitový timer. Všetko je pre typického pojedača koláčov skryté. On len zavolá millis() a kompilátor tam pridá kód ktorý nastaví nejaký časovač (zvyčajne timer0 ale môže sa to líšiť podla typu ...duina). A aj kód čo počíta jednu milisekundu ak sa mu dá správne vedieť aké ma ten MCU hodiny.

Boracicho:
Tá millis() to robí skoro ako by si to robil ty s tým prerušením, len to prerušenie ide trocha rýchlejšie ako desatina sekundy. Konkrétne si niekto niekedy povedal že taká milisekunda je dostatočne malá na to aby to vyhovovalo všetkým. Takže ty máš premennú čo sa inkrementuje každých 100ms a arduinista má premennú čo sa inkrementuje každú jednu milisekundu. A má funkciu čo mu tú hodnotu prečíta - millis()

Výhoda pre pojedačov koláčov ak použijú millis() je, že to urobil niekto, kto tomu naozaj rozumie a urobil to dobre. Napríklad tam ošetril aj atomický prístup k tomu počítadlu. Lebo to počítadlo má dĺžku long int (4 byte) a ten procesorje iba 8bitový, teda si to nevie prečítať v jednej inštrukcii.
Čo je to atomickosť prístupu nevedia ani mnohí "machri" čo programujú PHP, Javascript, dokonca aj JAVA. V tých jazykoch je to tiež zvyčajne skryté, takže to netreba riešiť, len za určitých okolností. Kde je zase vidno kto tomu ako rozumie. Ale v C (akože Wiring) je to jedna z nášlapných mín na ktorú začiatočník ľahko nabehne. Preto je používanie millis() lepšie ako sa snažiť o prácu s prerušeniami ak tomu programátor nerozumie.

A teraz k veci.
Z dotazu je jasné že nemá problém niečo urobiť každú sekundu. Ale má problém urobiť každú sekundu niečo iného. Samozrejme ak chceš každú sekundu napísať iný znak tak si to musíš niekde pamätať že ktorý si vypísal naposledy. Takže potrebuješ nejaké počítadlo od nula do dva. A podľa neho budeš vypisovať ten znak ktorý akurát chceš. If-mi alebo switch je neefektívny, lepšie je použiť pole.
Alebo sa to dá aj ukazateľom ak vieš čo to je a ako sa to používa.
Ja doporučujem aby si sa to pokúsil urobiť pomocou počítadla, ktoré bude použité ako index v poli.
Urob si len túto vec v loop a ak ti to nepôjde tak sa na to tu môžeme potom pozrieť.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 1521
Vek: 50.98
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 43


Naspäť na Arduino

Kto je prítomný

Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 0 hostí.

Forums ©
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.73 sekúnd