Arduino schéma - arduino.sk

Nezavisle podprogramy

Programovanie arduina
Príspevky: 21
Registrovaný: Pon 11. Feb 2013 12:57:54

Nezavisle podprogramy

Poslaťod Korko » Pon 11. Feb 2013 14:32:52

Zdravim pani, prosim o pomoc s podprogramom.
Chcem aby void loop () bezal neustale plnou rychlostou nezavisle od delay (xy) vo vyvolanom podprograme.
Je nieco take vobec mozne - pridelit prerusenia podprogramom ?
Diky moc.

Obrázok užívateľa
Príspevky: 311
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: Nezavisle podprogramy

Poslaťod tomXX » Pon 11. Feb 2013 16:12:59

Ahoj, čo myslíš podprogramom? Funkciu? Ak funkciu namapuješ na prerušenie, zabrániš zastaveniu (delay), ale ber do úvahy, že prerušenia sú hardvérové... Ak chceš zakázať prerušenia, stačí použiť príkaz cli() a na opätovné povolenie sei() - čo to ale urobí s funkciou delay() neviem. Nemám tu poruke Arduino, takže to nemám ako vyskúšať. Každopádne, prečítaj si tento článok, možno pomôže.

http://playground.arduino.cc/Code/AvoidDelay
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Príspevky: 21
Registrovaný: Pon 11. Feb 2013 12:57:54

Re: Nezavisle podprogramy

Poslaťod Korko » Str 13. Feb 2013 11:01:14

Vdaka za odpoved. Ten link je presne to co som potreboval. S anglictinou som na tom horsie ,ale ak som to spravne pochopil- delay= betonovy stop ,teda nevhodny pre moju aplikaciu.
Miesto toho potrebujem kazdy cyklus porovnavat mnou nastaveny cas a interny cas procesora, az potom sa vykona dalsi krok.

Este pre istotu ci spravne chapem prog. jazyk . priklad : void loop (){if (a==1) prg1(); if (a==2) prg2();} void prg1(){} void prg2(){}.
Proces bude nasledovny. donekonecna opakuje loop, kym nebude splnena 1 s podmienok, potom raz vykona vyvolany prg a znova opakuje loop.
Rozumiem tomu spravne ?

Vdaka.

Obrázok užívateľa
Príspevky: 311
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: Nezavisle podprogramy

Poslaťod tomXX » Str 13. Feb 2013 11:25:33

Korko píše:Vdaka za odpoved. Ten link je presne to co som potreboval. S anglictinou som na tom horsie ,ale ak som to spravne pochopil- delay= betonovy stop ,teda nevhodny pre moju aplikaciu.
Miesto toho potrebujem kazdy cyklus porovnavat mnou nastaveny cas a interny cas procesora, az potom sa vykona dalsi krok.

Este pre istotu ci spravne chapem prog. jazyk . priklad : void loop (){if (a==1) prg1(); if (a==2) prg2();} void prg1(){} void prg2(){}.
Proces bude nasledovny. donekonecna opakuje loop, kym nebude splnena 1 s podmienok, potom raz vykona vyvolany prg a znova opakuje loop.
Rozumiem tomu spravne ?

Vdaka.


Chápeš to správne, len ja osobne by som to nekomplikoval procedúrami, toto si zrejme prebral z Pascalu :) Takže:

Kód: Vybrať všetko
void loop (){
  if (a==1) {
    ....
  }
  if (a==2) {
   .....
  }
}
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: Nezavisle podprogramy

Poslaťod xeram » Uto 26. Feb 2013 12:10:29

Urobil som taký "skoro-multitasking" :lol: bude to súčasť väčšieho projektu, zatiaľ len základný kód na pochopenie
Kód: Vybrať všetko
/* Nejedná sa o skutočný multitasking, má to k nemu dosť ďaleko.
Ide skôr o spúšťanie jednotlivých podprogramov v rôznych čas. intervaloch
bez použitia delay(x). Základný čas. interval som použil 250ms; môže
byť kratší (napr. 100ms) aj dlhší len treba dbať na to, aby čas trvania "tasku",
prípadne súčet časov trvania "taskov" nebol dlhší ako perióda
tasku (časové kvantum).
je možné nadefinovať subtasky - napr. po ulynutí 15 sekúnd sa aktivuje
nejaký ďalší task atď...
premenná task (odborne sa tuším volá semafor} určuje ktoré "tasky" sa budú spúšťať
bit 0 - úlohy každých 250 ms
bit 1 - úlohy každých 500 ms
bit 2 - úlohy každú sekundu
bit 3 - úlohy každú minútu, atd...
Odskúšane na Arduino ProMini 3,3V */

# define led1 A3  // piny na ktorých sú LED-ky
# define led2 A2  // môžu byť samozrejme ľubovolné iné
# define led3 A1
# define led4 A0
# define led5 13
boolean led_s1, led_s2, led_s3, led_s4, led_s5;  //LED_status (ON, OFF)
byte hods, mins, secs, quarts, task;
long milisek;

void setup(void){
  hods = 1;
  mins = secs = quarts = task = 0;
  led_s1 = led_s2 = led_s3 = led_s4 = led_s5 = 0;
  pinMode(led1,OUTPUT);
  digitalWrite(led1,led_s1);
  pinMode(led2,OUTPUT);
  digitalWrite(led2,led_s2);
  pinMode(led3,OUTPUT);
  digitalWrite(led3,led_s3);
  pinMode(led4,OUTPUT);
  digitalWrite(led4,led_s4); 
  milisek = millis();
}

void loop(void){ 
  // ___meranie času + setovanie taskov___
  while(millis() - milisek >= 250){
    milisek += 250;
    quarts++;
    bitSet(task,0);  // setuj 250ms tasky
    if(quarts == 2)bitSet(task,1); //setuj 500ms tasky
    if(quarts == 4){
      quarts = 0;
      secs++;
      bitSet(task,0);
      bitSet(task,1);
      bitSet(task,2);  //setuj 1sek. tasky
    }
    if(secs == 60){
      secs = 0;
      bitSet(task,3);  //setuj minútové tasky
      mins++;
    }
    if(mins == 60){
      mins =0;  //tu nasetuj hodinové tasky
      hods++;
    }
    if(hods == 24){
      hods = 1;//tu nasetuj tasky 1x za deň
    }
  }
 
  //____ spúšťanie "taskov"____
  if(bitRead(task,0)){  //250ms tasky
    led_ka1();
    led_ka5();  //LED5 bliká spolu s LED2
    //tu môže byť viac "taskov"
    bitClear(task,0);
  }
  if(bitRead(task,1)){ //500ms tasky
    led_ka2();
   //aj tu môže byť viac "taskov"
    bitClear(task,1);
  }
  if(bitRead(task,2)){  //1sek. tasky
    led_ka3();
   //aj tu môže byť viac "taskov"
    bitClear(task,2);
  }
  if(bitRead(task,3)){ //1minut. tasky
    led_ka4();
   //aj tu môže byť viac "taskov"
    bitClear(task,3);
  }
}

//definovanie jednotlivých "taskov"
void led_ka1(void){
  led_s1 ^= 1;
  digitalWrite(led1,led_s1);
}

void led_ka2(void){
  led_s2 ^= 1;
  digitalWrite(led2,led_s2);
}

void led_ka3(void){
  led_s3 ^= 1;
  digitalWrite(led3,led_s3); 
}

void led_ka4(void){
  led_s4 ^= 1;
  digitalWrite(led4,led_s4); 
}
void led_ka5(void){
  led_s5 ^= 1;
  digitalWrite(led5,led_s5); 
}

Obrázok užívateľa
Príspevky: 311
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: Nezavisle podprogramy

Poslaťod tomXX » Uto 26. Feb 2013 15:20:58

xeram: tiež som to riešil podobne, pokiaľ som nenašiel http://monkauthor.wordpress.com/2012/01 ... r-library/ :)
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Príspevky: 41
Registrovaný: Štv 21. Feb 2013 10:59:11

Re: Nezavisle podprogramy

Poslaťod xeram » Str 27. Feb 2013 16:26:49

Thx! Vyzerá to super, skúsim s tým niečo "zbuchnúť".

Späť na Software