[ myrmidon @ 20.02.2006. 18:42 ] @
Pozdrav svima, evo jedan mali problem sa paralelnim portom i step motorom.

Ovaj kod vrti jedan step motor bez problema ali opterecuje CPU 99.99% zbog beskonacne petlje,


ako ubacim usleep(1); opterecenje procesora padne na 0.1% ali motor se vrti jaaako sporo.

Da li je moguce "uspavati" process da ne jede CPU ali da motor vrti normalnom brzinom ?


Code:




#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>


#define BASEPORT 0x378 /*lpt0*/


int *spin_wheel(int *current_step, int *start_step)
{

outb(*current_step,BASEPORT);



if (*current_step==*(start_step+3))
current_step=start_step;
else
current_step++;

return current_step;

}



int main()
{
// Duo phase
int steps[]={3,6,12,9};

int *current,*pocetni;

current=steps;
pocetni=steps;

/* open port */
if (ioperm(BASEPORT,3,1))
{
perror("ioperm");

exit(1);
}


outb(0,BASEPORT);


while(1)
{

current=spin_wheel(current,pocetni)

/*

usleep(1);

*/

}


return 0;

}


[ NrmMyth @ 20.02.2006. 20:48 ] @
Pa mozes napraviti pomocu if da svakih nekoliko iteracija ubacis usleep()
npr.
for i = 1 to N
if i % 10 = 1
usleep(1)

sad svaku desetu iteraciju on zaustavi.
jednostvno.

poz.
[ X Files @ 20.02.2006. 22:04 ] @
Kada neka aplikacija dovede CPU opterecenje do 100%, zaista moze nastati
problem. Medjutim, ipak PROVERI da li ti je sistem ZAISTA zagusen.

Pouzdano znam da Windows nekad LAZNO, zbog neke BRZE petlje prijavi tih 100%
opterecenja. Pogotovo kod programiranja servera u OnExecute() petlji. U stvari OS
nije u stanju da ti da pravu informaciju.

Tada obican Sleep() pomaze da "smiri" CPU status, a ti poslusaj savet koji ti je dao
NrmMyth i pokusaj da odradis tu pauzu na svakih N iteracija.

[ chupcko @ 21.02.2006. 12:19 ] @
Eh, a kojom brzinom zelis da okreces step motor ?

Na kojem os-u sve to radis ?

Mada ti ja savetujem da za tako nesto ipak iskoristis neki mikrokontrolor...


Ipak mislim da ovde imas drugi problem, koja je brzina reakcije na pararelnom portu.
Moguce da ti njemu previse brzo palis magnete na step motoru, tako da u sustini on i ne stigne da reaguje da se pomeri.

Primer, neka su magneti na step motoru 1 2 3 4 i neka mu treba 1ms da reaguje.
ti mu saljes aktiviranje magneta 1 2 3 4 uzastopno ali sa pauzom od 0.1ms pauze.
Sta ce se desiti ?

Predji na linux i koristi nanosleep ili nesto nadji nesto drugo na win-u sto ima manju rezoluciju.

A ajmo ovako stavi pauzu po 1s, pa gledaj brzinu rotacije, onda smanji pauzu na 0.5s, pa nastavi tako dok ne dobijes usporenje :).

P.S. Puno sam ispisao i sve bre gluposti :).
[ myrmidon @ 21.02.2006. 20:21 ] @
Citat:
chupcko: Eh, a kojom brzinom zelis da okreces step motor ?

Na kojem os-u sve to radis ?

Mada ti ja savetujem da za tako nesto ipak iskoristis neki mikrokontrolor...


Ipak mislim da ovde imas drugi problem, koja je brzina reakcije na pararelnom portu.
Moguce da ti njemu previse brzo palis magnete na step motoru, tako da u sustini on i ne stigne da reaguje da se pomeri.

Primer, neka su magneti na step motoru 1 2 3 4 i neka mu treba 1ms da reaguje.
ti mu saljes aktiviranje magneta 1 2 3 4 uzastopno ali sa pauzom od 0.1ms pauze.
Sta ce se desiti ?

Predji na linux i koristi nanosleep ili nesto nadji nesto drugo na win-u sto ima manju rezoluciju.

A ajmo ovako stavi pauzu po 1s, pa gledaj brzinu rotacije, onda smanji pauzu na 0.5s, pa nastavi tako dok ne dobijes usporenje :).

P.S. Puno sam ispisao i sve bre gluposti :).



OS je naravno Linux (pod win XP-om nije moguce direktno pristupiti lpt-u)

Reakcija na paralelnom portu je ok. Pauze su takodje ok. Motor odgovara lepo na zadate komande.

usleep(p) za parametar p moze primati samo int tip.

nanosleep(&tr,&tp) ako se koristi za interval manji od 2 ms onda se mora poterati program u "real time" sto dovodi takodje do "neodgovaranja" programa dok radi.


u svakom slucaju hvala na savetu, NrmMyth je dao odlicnu ideju.

Hvala...
[ chupcko @ 21.02.2006. 23:03 ] @
aha, pa ideja o pauzama svaki 10 ciklus nije dobra, jer neces imati ravnomerno okretanje step motora. I dalje ne znam sta bi moglo to biti.

Ajde da ne posmatramo to sa strane c-a, nego sa strane linux-a. Posalji mi rezultat "ps -uaxwww" i bar jedan ekran "vmstat 1".

Probaj to isto i bez startovanje programa.