Skocz do zawartości

ethanak

Użytkownicy
  • Zawartość

    977
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    33

ethanak wygrał w ostatnim dniu 19 marca

ethanak ma najbardziej lubianą zawartość!

Reputacja

361 Mistrz

O ethanak

  • Ranga
    7/10
  • Urodziny 05.02.1960

Informacje

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. ethanak

    Zasilanie silników DC baterią Nimh

    A na przykład drv8835 - niewiele droższy a chyba lepszy od L298N? Do tego dwa takie akumulatorki?
  2. ethanak

    UART - gdzie montuje się STM32 na Linuksie

    Która wersja ubuntu? Bo u mnie (18.04, akurat z niego piszę) używa wbudowanego... zresztą odkąd pamiętam zawsze tak było. A że -n jest wszędzie to inna sprawa
  3. ethanak

    UART - gdzie montuje się STM32 na Linuksie

    A Ty? Ja się domyślam ; jeśli ktoś wspomina o askubuntu i nie czytuje dokumentacji to raczej nie jest developerem PLD i używa tego co fabryka dała w jego Jedynej Słusznej Dystrybucji (czyli basha).
  4. ethanak

    UART - gdzie montuje się STM32 na Linuksie

    Bo man jest do innego polecenia (do /bin/echo a nie do wbudowanego polecenia shella). Zresztą cytując man echo: (wytłuszczenie moje)
  5. ethanak

    UART - gdzie montuje się STM32 na Linuksie

    Jeśli już to "help echo" (to polecenie wbudowane w basha)
  6. ethanak

    UART - gdzie montuje się STM32 na Linuksie

    No załącza \n - w końcu echo a na wyjściu daje 'a\n'. echo -n "a" >/dev/gdzieśtam nie zadziała?
  7. Jaka karta wifi? Jeśli to TP-Link na rtl8188eu to ten model tak ma.
  8. Ciekawe, przecież pisałeś że to zrobiłeś... To ja tak z ciekawości - co właściwie wtedy zrobiłeś?
  9. Drugą wersję robił jakiś początkujący... pierwszą Prawdziwy Specjalista ™
  10. "Czas wykonania" masz akurat dobrze Czy ja nie wspominałem, że masz reagować na zdarzenia, a nie na stany? A Ty uparcie wtykasz reakcję na stan (w Twoim przypadku jest "czy czas jest między 2000 a 4000" zamiast "czy czas przekroczył 2000"). Nic dziwnego że czas wykonania masz zero, jeśli co chwila startujesz wykonanie czynności od zera. Wyobraź sobie oświetlenie np. schodów. Po zasłonięciu fototranzystora światło zapala sie na ileś tam sekund. A ty zamiast wleźć na te schody uparcie cały czas zasłaniasz ten fototranzystor, licznik sekund cały czas się zeruje i dziwisz się, czemu nie gaśnie... A wystarczy przecież nie reagować na wciśnięcia klawisza jeśli czynność już się wykonuje, prawda? Na przykład: if (millis() > 2000 && millis() < 4000 && !coRobimy) {... Nie mówię że ma to sens, ani że jest dobrze... ale przynajmniej zadziała.
  11. Masz kondensator na resecie w Arduino? Cytując https://www.arduino.cc/en/Tutorial/ArduinoISP:
  12. Że co? Nawet przy fatalnie napisanym programie są to czasy rzędu tygodni... Załóżmy coś takiego: masz zmienną globalną "coRobimy" w której trzymasz wykonywaną czynność. Załóżmy że 0 to "nie robimy nic", 1 to "migamy trzy razy". masz zmienną globalną "czasStartu" typu uint32_t w której trzymasz czas zapamiętany w chwili, kiedy wartość coRobimy zmieniła się z 0 na coś innego. Czyli coś w stylu: if (dostalem_sygnal()) { coRobimy = MIGAMY_TRZY_RAZY; czasStartu = millis(); } Dalej mamy coś takiego, co pozwoli migać sobie czymśtam ogólnie (wykorzystam funkcję z poprzedniego posta): uint32_t czasWykonania = millis() - czasStartu; if (coRobimy == MIGAMY_TRZY_RAZY) { kierunek(czasWykonania % (2 * CZAS_MIGNIECIA) < CZAS_MIGNIECIA); } W ten sposób zapewniamy sobie, że migać będziemy regularnie począwszy od otrzymania sygnału (nacisnięcia klawisza albo czegoś tam innego). Nie zajmujemy się tutaj żadnymi liczeniami ile razy mignęliśmy ani ile razy mamy mignąć, interesuje nas tylko regularne migania. W rzeczywistości - ponieważ migać moglibyśmy raz, siedem albo dowolnie długo powinniśmy mieć jakąś możliwość stwierdzenia że "trzeba migać" (np. ustawiony bit "MIGAMY"), i warunek wyglądałby jakoś tak: if (coRobimy & ( 1 << MIGAMY)) { // czy w ogóle migamy, nieważne ile razy No i migamy sobie, migamy aż przyjdzie pora na przestanie migania, bo dalej w kodzie mamy coś takiego: if (coRobimy == MIGAMY_TRZY_RAZY) { if (czasWykonania > 5 * CZAS_MIGNIECIA) { // czasWykonania obliczyliśmy wcześniej coRobimy = 0 ; // przestajemy migać kierunek(0); // co prawda nie powinno być potrzebne, ale warto się nauczyć po sobie sprzątać } // i na przykład return; // powrót z pętli loop bo dalej nie ma już nic ciekawego } W ten sposób Twoje obawy o zbyt dużą wartość osiąganą przez millis() są bezzasadne - po prostu jedno mignięcie po ok. 50 dniach migania bez przerwy będzie trwało nieco krócej. Ale jakoś nie wyobrażam sobie migania bez przerwy przez 50 dni Jest to jakoś tam zrozumiałe?
  13. Na pewno sześć pełnych cykli? Po co Ci ostatni cykl "zgaszone przez ćwierć sekundy"? Owszem, masz sześć zmian, ale ostatnia (szósta) zmiana kończy całą imprezę. Jednak moja wersja była prostsza A problem niewysyłania zwielokrotnionych komunikatów można rozwiązać w dużo prostszy sposób zamiast kombinować jak sł^Wkoń pod górkę - np tworząc funkcję wysyłającą na magistralę komunikat wtedy kiedy jest to konieczne (tzn. funkcja została wywołana z innym argumentem niz poprzednio). Taki kawałek kodu na przykład: void kierunek(bool zapalony) { static bool stan = FALSE; if (zapalony != stan) { stan = zapalony; CanSend(0x02214000, 0x00, 0x00, stan ? 0x60 : 0, 0x00, 0x00, 0x00); } }
  14. I co z tą wersją publiczną? Tak z ciekawości pytam... bo cały czas tkwią babole wielkości parowozu
  15. A jaka jest dla programu różnica między "wcisnąłem przycisk i wskutek tego pojawiło się (lub znikło) napięcie" a "napięcie się pojawiło (lub znikło)"? Monitorujesz zmiany stanu (zdarzenia), a nie stany.
×