Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

step motor i paralelni port

[es] :: C/C++ programiranje :: step motor i paralelni port

[ Pregleda: 3276 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

myrmidon
B.Robert
Tungusia

Član broj: 10428
Poruke: 55
*.opticon.hu.



Profil

icon step motor i paralelni port20.02.2006. u 18:42 - pre 220 meseci
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;

}



Myrmidon
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: step motor i paralelni port20.02.2006. u 20:48 - pre 220 meseci
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.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: step motor i paralelni port20.02.2006. u 22:04 - pre 220 meseci
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.

 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: step motor i paralelni port21.02.2006. u 12:19 - pre 220 meseci
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 :).
CHUPCKO
 
Odgovor na temu

myrmidon
B.Robert
Tungusia

Član broj: 10428
Poruke: 55
*.opticon.hu.



Profil

icon Re: step motor i paralelni port21.02.2006. u 20:21 - pre 220 meseci
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...
Myrmidon
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: step motor i paralelni port21.02.2006. u 23:03 - pre 220 meseci
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.
CHUPCKO
 
Odgovor na temu

[es] :: C/C++ programiranje :: step motor i paralelni port

[ Pregleda: 3276 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.