Skocz do zawartości

Cała aktywność

Strumień aktualizowany automatycznie

  1. Wczoraj
  2. Spróbuj znacząco zwolnić przełączanie wyświetlaczy (zmniejszyć częstotliwość), poprzez modyfikację warunku „licznik == 120", zwiększając liczbę po prawej stronie znaku porównania i w razie potrzeby zwiększając liczbę bitów zmiennej licznik. Zrób test dla częstotliwości przełączania 1000 Hz (nie musi być dokładnie taka, może być zbliżona; mam kod z bliźniaczej płytki Mimas v2, który działał bezproblemowo właśnie z taką częstotliwością, ale nie wyświetlał znaków z UARTa, tylko generowane w kodzie VHDL), ale spróbuj też inne częstotliwości, np. 50, 200 Hz. Jakie dokładnie wartości pr
  3. Teraz efekt jest taki, że oba wyświetlacze aktualizują się starszą połówką bajtu (ostatnio wpisaną cyfrą), ale jeden z nich tą aktualizacje ma przyciemnioną, a na jasno jest wyświetlana "3" na stałe.
  4. Poczytaj o rs485 https://elektronikab2b.pl/technika/3404-czym-jest-rs-485 myślę że tego szukasz
  5. No to wykorzystaj 1-wire przy pomocy uarta i masz ideolo temat załatwiony, ile rzeczy na raz się nauczysz
  6. Wyobrażałem sobie, że zrobię to jako magistralę i kolejne nano będą dopinane bez problemu, w sensie pamiętania na którym sprzętowym uarcie dany nano jest.
  7. Mam problem z tą pętlą for, która ma sprawdzać głośność przy wszystkich możliwych częstotliwościach. Program nie wraca po kilku sekundach na początek pętll, tak jak było napisane w kursie, tylko buzzer cały czas wydaje coraz cichsze dźwięki.
  8. A jeszcze tak dodam, może 1-wire? możliwości jest kupa
  9. Cześć! Świetny artykuł, ma dokładnie to czego chciałem się nauczyć <3. Proszę czy mógłbyś mnie naprowadzić jak przesłać jakieś dane (np. JSON) i odebrać je na ESP? Tj. w ramach ćwiczenia chciałem zrobić coś takiego, że na stronie internetowej jest text input, którego zawartość zostanie wyświetlona na LCD.
  10. @Designer I prawo Kirchhoffa dotyczy przepływu prądu, a prąd mierzy się rozdzielając obwód. We wpisie ze wczoraj kierowanego do innego kursanta, podlinkowałem artykuły które mogą pomóc.
  11. Ekhm... co ma wspólnego bycie sercem z wykorzystaniem kilku sprzętowych uartów? Mają sobie spać? BTW diody mają wiele zastosowań, ale demultiplexing urządzeń podłączonych do jednego uarta do nich nie należy.
  12. No dobra, myślę, że wiesz, jak działa dioda, jaka jest jej charakterystyka i jak działa cały ten interfejs uart... Jedną z metod jest wymuszenie na pinach tx slave'ów przejście w stan wysokiej impedancji "wybudzanie" ich tylko wtedy, gdy mają coś nadać (musisz zatroszczyć się, żeby jeden tylko był aktywny) Możesz użyć układu typu max485. http://www.gammon.com.au/forum/?id=11428 taki link na przykład https://forum.arduino.cc/t/connection-multiple-arduinos-via-rs485/103488/16
  13. Użyłem uarta bo potrzebuję komunikacji na odległość tak do 8~10 metrów, dlatego I2C odpuściłem. Nie wykorzystuję dodatkowych uartów, bo mega ma być sercem do którego będą podłączone przyciski do sterowania, oraz diody LED do sygnalizacji, ale oprócz tego teraz jest dwa slave, a docelowo może być ich 5 lub 6.
  14. Czemu nie możesz użyć I2C? Czemu nie skorzystasz z wielości interfejsów uartu płytki mega? Czy jest to konieczne wykorzystać tylko jeden czy możesz sobie uprościć znacząco zadanie?
  15. Nie o to mi chodziło, to nie ma prawa działać, raczej coś takiego przewidywałem: always @(posedge i_Clk) begin if(w_RX_DV) begin nowy = w_RX_Byte; end licznik <= licznik + 1; if (licznik == 120) begin licznik <= 0; if (wybranyBajtMlodszy) begin nowyWektor = nowy[3:0]; end else begin nowyWektor = nowy[7:4]; end wybranyBajtMlodszy = ~wybranyBajtMlodszy; end if (licznik == 0) begin if (wybranyBajtMlodszy) begin led_enable = 3'b101; end else begin led_enable = 3'b110; end end Na wejściu modułu Bin
  16. Długa dyskusja się wywiązała, więc pozwólcie że napiszę kilka słów. Po pierwsze warto zrozumieć czym różni się wartość od wskaźnika - wartość to np. Bajt (uint8_t), int, albo cała struktura. Typ zmiennej określa ile pamięci jest potrzebne do jej przechowywania oraz jak wykonywać operacje na niej. Różne typy mogą zajmować różną ilość pamięci, więc np. Przypisując wartoś zmiennej 32-bitowej do zmiennej 8-bitowej możemy część danych stracić, bo po prostu się nie zmieszczą. Natomiast wskaźnik jest tylko adresem w pamięci, w stm32l4 to zawsze 32-bitowa liczba, a więc każdy typ wskaźnikowy w pamięci
  17. Bo C++ wymaga bezwzględnej zgodności typów - co przy portowaniu kodu z C na C++ może doprowadzić do traumy. Ostatnio przy portowaniu swojego kodu stwierdziłem, że "const " to powinienem mieć pod jakimś łatwym skrótem klawiszowym, a głupi strtol który miał przesunąć wskaźnik na buforze const char * wymagał jawnego rzutowania na char ** z const char ** (przynajmniej ja nie znalazłem lepszego rozwiązania). No ale nic dziwnego - to jednak dwa różne języki.
  18. @ethanak faktycznie ciekawe, czyli kod z kursu w C++ by nie przeszedł. Coś rodzaju tego: void mehh(uint8_t *aw, int cnt){ uint8_t k = 0; while(cnt--) k = *aw++; } void meh(void * aa, int cnt){ mehh(aa, cnt); } W C się skompiluje, bez ostrzeżenia. W C++ wyrzucił błąd: argument typu "void *" jest niezgodny z parametrem typu "uint8_t *"
  19. Na początek wystarczy zwykłe zmniejszenie jasności, a czy korekcja będzie potrzebna to zależy od uzyskanego efektu.
  20. Jeśli chcesz uzyskać równomierne rozłożenie kolorów konieczne jest użycie korekcji gamma, inaczej wraz ze zmianą jasności będzie zmieniała się barwa paska. link1 i dość obszerny artykuł
  21. Prawie... a prawie robi wielką różnicę. Nie można np. zrobić dereferencji, a to może utrudnić życie. Przykładowo (taka teoretyczna funkcja): wypisz(void *d, int count) { while (count-->0) wypisz_znak(*d++); } raczej słabo się skompiluje...
  22. Dzięki wcześniej na to nie wpadłem. Czyli wystarczy w programie zmniejszyć jasność wszystkich używanych kolorów?
  23. @ethanak tak zgadza się. Tylko tu podejrzane jest przejście z czegoś szczegółowego do ogólnego ale od zewnątrz. Zazwyczaj nabudowuje się w przeciwnym kierunku. Np w Javie funkcje ogólnego przeznaczenia miały u mnie argument List (interfejs, tj. abstrakcyjny), a dopiero w konkretach zastępowałem np. ArrayList który już miał swój obiekt. Odesłałem do wyższej instancji, bo nie jestem ekspertem, ale jednak zaryzykuję i ocenię, że w tej funkcji HAL powinien być void *. Tak przynajmniej kojarzę z prac przy OpenGl, że jak coś się wysyłało do pamięci (tam do pamięci karty graficznej) to do adres
  24. Po prostu w C (ale nie C++) typ void * oznacza "wskaźnik na cokolwiek" i można go użyć w miejsce dowolnego wskaźnika. Przykładowo jeśli mamy funkcje: int cośtam(uint8_t *data, size_t count); char *cośinnego(int size); możemy je wywołać np. tak: void *data; int wynik; data = cośinnego(10); wynik = cośtam(data, 10); W C++ już ten numer nie przejdzie A uint8_t jest pewnie dlatego, że wygodnie się go używa (np. w iteracjach).
  1. Załaduj więcej aktywności
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.