eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaPowolność programatora STK500v2
Ilość wypowiedzi w tym wątku: 15

  • 11. Data: 2010-03-04 23:51:07
    Temat: Re: Powolność programatora STK500v2
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    W dniu 04.03.2010 00:44, Adam Dybkowski pisze:
    >
    > W sterowniku dla Windows jest okienko ustawień zaawansowanych, gdzie
    > można m.in. zmniejszyć czas oczekiwania przed wysłaniem danych (gdy
    > bufor nie jest zapełniony, standardowo 16ms a minimalnie 1ms). Może masz
    > gdzieś też upchnięte podobne ustawienia w Linuxie, albo można jest
    > ustawić niestandardowym ioctl'em? Wtedy nie problem dodać to nawet w
    > źródłach avrdude.

    Choroba, pod Linuxem w ogóle jakoś dziwnie działa obsługa portów
    szeregowych. Nawet na RS-ie czysto sprzętowym (normalny COM1 wbudowany w
    płytę) ma taki dziwny efekt przy wysyłaniu krótkich paczek po kilka
    bajtów. Przykładowo kawałek kodu w C.

    int handle = 0;
    handle = open("/dev/ttyS0", O_RDWR);
    for(int i = 1000; i; i--) {
    write(handle, "abcd", 4);
    tcdrain(handle); // czeka na opróżnienie bufora nadajnika
    }
    close(handle);

    daje mi taki efekt, że wysyłane są paczki po cztery bajty, a między nimi
    jest 20ms przerwy !!! Poszperałem na góglu, ale znalazłem tylko ludzi
    mających podobny problem (choć ta zwłoka nie była aż tak duża).
    Pierwszy raz robię obsługę RS-a pod linuxem i trochę mnie to zmartwiło.
    Znają Koledzy może jakiś parametr (coś w stylu timeouta), który
    zmniejszałby tę zwłokę? Dziwne to trochę, bo o ile rozumiem zwłokę w
    wysyłaniu w przypadku gdy FIFO nie jest jeszcze zapełnione (choć
    nadajnik powinien rozpocząć nadawanie z chwilą pojawienia się pierwszego
    bajtu w buforze), to w przypadku wymuszenia nadawania trochę to bez sensu.

    Pozdrawiam
    Grzegorz


  • 12. Data: 2010-03-05 06:29:02
    Temat: Re: Powolność programatora STK500v2
    Od: hobgoblin <h...@g...com>

    On Mar 5, 8:51 am, Grzegorz Kurczyk
    <g...@c...slupsk.pl> wrote:
    >
    > Choroba, pod Linuxem w og le jako dziwnie dzia a obs uga port w
    > szeregowych. Nawet na RS-ie czysto sprz towym (normalny COM1 wbudowany w
    > p yt ) ma taki dziwny efekt przy wysy aniu kr tkich paczek po kilka
    > bajt w. Przyk adowo kawa ek kodu w C.
    >
    > int handle = 0;
    > handle = open("/dev/ttyS0", O_RDWR);
    > for(int i = 1000; i; i--) {
    >         write(handle, "abcd", 4);
    >         tcdrain(handle); // czeka na opr nienie bufora nadajnika}
    >
    > close(handle);
    >
    > daje mi taki efekt, e wysy ane s paczki po cztery bajty, a mi dzy nimi
    > jest 20ms przerwy !!!

    Uzywasz kernela 2.4? W 2.6 "tick" jest 10x krotszy (10ms->1ms). Nie
    znam implementacji tcdrain ale prawdopodobnie nie czeka ona na
    zakonczenie transmisji w petli, a oddaje CPU schedulerowi.

    Zamiast tcdrain sprobuj uzyc (nie sprawdzalem w praktyce):

    do {
    ioctl(handle, TIOCSERGETLSR, &lsr);
    } while (lsr & TIOCSER_TEMT);

    -hob


  • 13. Data: 2010-03-05 08:32:21
    Temat: Re: Powolność programatora STK500v2
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    W dniu 05.03.2010 07:29, hobgoblin pisze:
    > Uzywasz kernela 2.4? W 2.6 "tick" jest 10x krotszy (10ms->1ms). Nie
    > znam implementacji tcdrain ale prawdopodobnie nie czeka ona na
    > zakonczenie transmisji w petli, a oddaje CPU schedulerowi.

    Jajko z serii 2.6.

    >
    > Zamiast tcdrain sprobuj uzyc (nie sprawdzalem w praktyce):
    >
    > do {
    > ioctl(handle, TIOCSERGETLSR,&lsr);
    > } while (lsr& TIOCSER_TEMT);
    >

    Właśnie coś w tym stylu kombinowałem, ale podpowiedź Kolegi bardzo dużo
    mi pomogła. Działa, z drobną poprawką. Odwrotny warunek przy while.
    Potrzebne mi to jest m.inn. do wysyłania danych przez bufor RS485
    sterowany sygnałem RTS. W efekcie końcowym wyszło coś takiego:

    ioctl(handle, TIOCMGET, &status);
    status &= ~TIOCM_RTS;
    ioctl(handle, TIOCMSET, &status);

    write(handle, Out_data, strlen(Out_data));
    do {
    ioctl(handle, TIOCSERGETLSR, &lsr);
    } while(!(lsr & TIOCSER_TEMT));

    ioctl(handle, TIOCMGET, &status);
    status |= TIOCM_RTS;
    ioctl(handle, TIOCMSET, &status);

    Wygląda niby dobrze, ale na oscyloskopie widzę niekiedy taką sytuację,
    że RTS przeszło na moment w stan aktywny (ok 20..30us), a nie poszedł
    żaden bajt. Po południu sprawdzę czy ta "ramka" jest gubiona czy
    faktycznie wychodzi z następnym aktywnym RTS.

    Dzięki za podpowiedź.
    Pozdrawiam
    Grzegorz


  • 14. Data: 2010-03-05 08:40:13
    Temat: Re: Powolność programatora STK500v2
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    W dniu 05.03.2010 09:32, Grzegorz Kurczyk pisze:
    > Wygląda niby dobrze, ale na oscyloskopie widzę niekiedy taką sytuację,
    > że RTS przeszło na moment w stan aktywny (ok 20..30us), a nie poszedł
    > żaden bajt. Po południu sprawdzę czy ta "ramka" jest gubiona czy
    > faktycznie wychodzi z następnym aktywnym RTS.

    P.S. Coś mi się wydaje, że to co obserwowałem, może wynikać ze
    "złośliwego przypadku" wyzwalania oscyloskopu analogowego. Wieczorkiem
    podepnę to pod cyfrówkę z długim rekordem, albo do drugiego komputera i
    zobaczę co wyłazi z drugiej strony :-)

    Pozdrawiam
    Grzegorz


  • 15. Data: 2010-03-05 09:29:26
    Temat: Re: Powolność programatora STK500v2
    Od: hobgoblin <h...@g...com>

    On Mar 5, 5:32 pm, Grzegorz Kurczyk
    <g...@c...slupsk.pl> wrote:
    >
    > Jajko z serii 2.6.

    Dziwne. Nie bede sie na ten temat wypowiadal bo juz dawno w tym nie
    grzebalem.

    > Potrzebne mi to jest m.inn. do wysyłania danych przez bufor RS485
    > sterowany sygnałem RTS.

    Moze da sie to zrobic sprzetowo? (man stty)

    > W efekcie końcowym wyszło coś takiego:
    [...]
    > Wygląda niby dobrze, ale na oscyloskopie widzę niekiedy taką sytuację,
    > że RTS przeszło na moment w stan aktywny (ok 20..30us), a nie poszedł
    > żaden bajt. Po południu sprawdzę czy ta "ramka" jest gubiona czy
    > faktycznie wychodzi z następnym aktywnym RTS.

    Nie wiem. Na wszelki wypadek dorzuc sprawdzanie wyniku ioctl'a. Moze
    petla konczy sie zbyt wczesnie?

    Wez tez pod uwage, ze ten kod moze w kazdej chwili byc wywlaszczony.
    Miedzy RTS i ramka (i na odwrot) moga trafic sie duze opoznienia.

    Pozdrawiam,
    -hob

strony : 1 . [ 2 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: