Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

31.05.2006, 19:44

select, usleep und konsorten

hi,

nachdem ichs jetzt dank euch geschafft habe, die pins vom parallelen port einzeln anzusteuern, gleich das nächste problem:
servos werden wie folgt angesteuert:

1.5 ms signal solltn den servo mittig ausrichten.

jetzt habe ich ein kleines c-programm geschrieben, dass den servo bis zum anschlag drehen sollte:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <parapin.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

inline void mysleep(int usecsleep) {
        struct timeval tv;
        tv.tv_sec = 0;
        tv.tv_usec = usecsleep;
        select(1, NULL, NULL, NULL, &tv);
}

int main() {
        #define D1 LP_PIN02
        #define D2 LP_PIN03
        #define D3 LP_PIN04
        #define D4 LP_PIN05
        #define D5 LP_PIN06
        #define D6 LP_PIN07
        #define D7 LP_PIN08
        #define D8 LP_PIN09
        if( pin_init_user(LPT1) == -1 ) {
                printf("Initialisierung Fehlgeschlagen!\n");
        }
        pin_output_mode(D6);
        printf("Setze D2 an (Spannungsversorgung)\n");
        set_pin(D2);
        sleep(1);
        printf("Und los gehts\n");
        int timetosleep = 1000, i;
        for( i = 0; i < 1000; i++) {
                set_pin(D6);
                mysleep(timetosleep);
                clear_pin(D6);
                mysleep(20000 - timetosleep);
        }
        clear_pin(D2);
        printf("Setze D2 aus... (Spannungsversorgung)\n");
        printf("Fertig!!\n");
        return 0;
}


wie man sieht, schlafe ich die pausen nicht mit usleep, sleep o.ä., sondern mit select, weil usleep ticks zählt und die mit 20ms vieel zu lang sind.

das ist mit sleep leider nur beding besser:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <unistd.h>
#include <sys/times.h>
#include <sys/types.h>
void my_usleep(unsigned int microseconds);

int main()
{
  my_usleep(1e6);
  my_usleep(1e5);
  my_usleep(1e4);
  my_usleep(1e3);
  my_usleep(1e2);
  my_usleep(1);
  printf("Finished\n");
}

void mysleep(int usecsleep) {
        struct timeval tv;
        tv.tv_sec = 0;
        tv.tv_usec = usecsleep;
        select(1, NULL, NULL, NULL, &tv);
}

void my_usleep(unsigned int microseconds)
{
 clock_t tick1=-1, tick2=-1;
 double dClock = -1;
 struct tms tStruct1, tStruct2;

 if((tick1 = times(&tStruct1))== -1) printf("Error time 1\n");
 mysleep(microseconds);
 if((tick2 = times(&tStruct2))== -1) printf("Error time 2\n");
 if((dClock = sysconf(_SC_CLK_TCK)) < 0) printf("Error sysconf \n");

 printf("mysleep(%d) takes %6.2f ms\n", microseconds, (1000*(tick2 -
tick1)/dClock) );
 return;
}
gibt

Quellcode

1
2
3
4
5
6
7
mysleep(1000000) takes 1000.00 ms
mysleep(100000) takes 100.00 ms
mysleep(10000) takes  20.00 ms
mysleep(1000) takes   0.00 ms
mysleep(100) takes   0.00 ms
mysleep(1) takes  10.00 ms
Finished

manchmal auch leicht anders.

eigentlich sollte man doch denken, dass das dabei rauskäme:

Quellcode

1
2
3
4
5
6
7
mysleep(1000000) takes 1000.00 ms
mysleep(100000) takes 100.00 ms
mysleep(10000) takes  10.00 ms
mysleep(1000) takes   1.00 ms
mysleep(100) takes   0.10 ms
mysleep(1) takes  0.01 ms
Finished

tuts aber nicht.

also tut auch der servo nix, obwohl alle spannungen stimmen und alles richtig verkabelt ist. das warten auf den nächsten puls geht einfach nicht.

frage ist: wie kann ich microsekundengenau warten / kann ich das überhaupt?

danke,
Lorenz
Software is like sex - it's better when it's free.