Skocz do zawartości

Program choinki - zawieszanie się programu [Klon Arduino Mega]


BananWszyscy

Pomocna odpowiedź

(edytowany)
4 godziny temu, marek1707 napisał:

Rzeczywiście noc była już głęboka, bo i ja przepuściłem babola. Przecież zapis:


digitalWrite(i, tablica_led);

jest bez sensu. Miało być rzecz jasna:


digitalWrite(i, tablica_led[i]);

i daję sobie uciąć, że tak to widziałem. Drugim argumentem musi być przecież wartość wyrażenia (zerowa gdy ustawiamy stan niski i <>0 gdy wysoki) a nie wskaźnik na tablicę. A dziś cóż, post wygląda inaczej. Zgodnie z obecną modą przyczyna może być tylko jedna: ktoś włamał się na moje konto i strollował wynurzenia garażowego geniusza.. Taa...jasne.

No a teraz o tym prądzie. To co zmierzyłeś wcale nie musi być sprzeczne z pomiarem pojedynczej diody. Kiedy zapalasz jedną, wstawiasz w obwód multimetr i widzisz 16mA, to masz konkretne rezystancje i konkretny prąd wywołujący konkretne spadki napięcia. Myślę tu przede wszystkim o tych cieńszych od włosa drucikach łączących stalowy ażur obudowy procesora z jego strukturą krzemową. No a teraz, gdy przez ten sam drucik ma popłynąć ponad 0.5A to tak jak z gniazdkiem w ścianie: przy obciążeniu ładowarką USB masz tam 235V a po dołączeniu piecyka 2kW zostaje już tylko 210V. Większy prąd to większy spadek napięcia po drodze i próba zapalenia wszystkich LEDów na raz może powodować, że suma prądów nie jest prostą arytmetyczną wielokrotnością pojedynczego, pierwotnego składnika. Zwyczajnie im więcej diodek tym prąd każdej powinien lekko przysiadać włąsnie z powodu rezystancji widzianych na wspólnej części obwodu. Ale to oznacza także, że powinno być widać wyraźne przygasanie diod w miarę zapalnia coraz większej ich liczby. Drugą przyczyną tak małego prądu sumacyjnego może być to, że prądy są różne w zależności od koloru. Niestety nie widzieliśmy tego twojego świątecznego cuda (zdjęcie w pełnej krasie?), ale jeśli kolorki masz różne to i prądy (przy tych samych opornikach) będą rózne. Być może zmierzyłeś czerwoną i wyszło 16mA a np. zielone mogą ciagnąć tylko 8mA (bo mają większe tzw. napięcie przewodzenia UF) i wtedy w sumie wychodzi mniej niż proste 47*16mA. To tylko takie dywagacje, choć warto rozumieć co się dzieje we własnym projekcie - szcególnie w tak prostych sprawach jak prądy statyczne. A być może przyczyna dziwnie małego prądu jest bardziej trywialna: spada zasilanie 5V z powodu przeciążenia zasilacza? stabilizatora? spadku napięcia na kablu (USB)? itp. Diodkom jak to diodkom (elementom nieliniowym) wystarczy lekki spadek napięcia a prąd maleje gwałtownie. Napisz gdy ten problem rozkminisz, bo to nauka dla każdego.. Rzadko zdarza się, by ktoś robił taki overkill i pakował ArduinoMega do napędzania kilkudziesięciu LEDów wprost z kilkudzisięciu pinów procesora.. Jednak narzucającym się rozwiązaniem jest jakiś maluch za 12zł (MINI? NANO?) i multipleksowanie lub ekspandery/rejestry na SPI czy coś..

A przerwania zewnętrzne to osobna sprawa - zgłaszanie ich poprzez układ RC z przycisku i naiwne oczekiwanie, że będzie to deterministyczne (np. tylko jedno zbocze) to zupełna bzdura, ale było o tym tyle, że nie warto bić piany.

Kontrukcja Twojego kodu jest taka, że wykonujesz wszystko (łącznie z generowaniem nowych wzorków) zawsze w kółko i powtarzasz to tak szybko jak tylko procesor zdoła wykonywać główną pętlę. To powoduje, że program jest responsywny w każdym stanie i to z jednej strony dobrze, ale są też ciemne strony tego rozwiązania (pomijam pobór mocy). Gdyby problemem była właśnie "nieatomowość" sprawdzania stanu licznika, to wtedy opoźnienie zwyczajnie zmniejsza częstość występowania błędu być może rzędy wielkości razy i nie naprawia a jedynie "rozrzedza" niepoprawne przeskoki programu przez kolejne kroki.

A jeśli jesteś przywiązany do konstrukcji if, to gdybyś na początku zawsze wykonywał proste czyszczenie (zerowanie) całej tablicy LEDów, wtedy musiałbyś w dalszych switch-ach/if-ach wpisywać jedynie wartości niezerowe i odpadłyby wszystkie else "gaszące" poprzednie śmiecie. Program byłby bardziej przejrzysty i na pewno krótszy.

ten zapis od razu wyłapałem, że chodzi o element nie tablicę, ale już o tym nie wspomniałem, więc luz. Nadal mówię, że ja bym teraz tę choinkę zrobił inaczej (nawet napisałęm, że mam tylko głównie atmegi i musiałbym multiplexować (parę tranzystorów i może ekspander musiałbym wrzucić, żeby uciec i mieć pająka..), ale jest jak jest i trzeba było ratować obecną sytuację (znaczy wiadomo nic nie trzeba, ale na studiach na podstawach automatyki wykładowca powiedział taką mądrą rzecz "często automatyk nie może zmienić obiektu, a musi jakoś uratować projekt" i podszedłem z tej strony). Sprawdzone zostało, że natłok tak mocno pracujących wyjść nie wpływał na błędne działanie całego kodu i problem leżał gdzie indziej i nadal nie wiemy gdzie :3. Nadal przy wywaleniu doraźnego lekarstwa w postaci delay'a staje zawsze w tym samym miejscu, a możliwości debugowania mam ograniczone.

A te ify to tak wynika z mojego małego doświadczenia i często patrzenie na kody w maszynach na plckach, które nierzadko są jakie są...<nie pomaga> a że te mikroklocki to nie jest póki co moja wybitna strona to wiadomo. Chciałem nawet dopisywać fragmencik ze stanem czekania na zmianę kroku, żeby nie latał po pinach w kółko... ale jestem leniem ostatnimi dniami 🙂

edit. z drugiej strony jak na początku kminiłem co jest nie tak, to też myślałem, że może być problem z zasilaniem. Teraz wiem, że 5v trzyma, ale nawet myślałem, że do wspólnego masowego przycisku wrzucić jakiś tranzystor i pyknąć wypełnienie jakieś niewielkie i zobaczyć co się dzieje. ale odłączenie wszystkich światełek nie poprawiło sytuacji to odpuściłem

Edytowano przez BananWszyscy
Link do komentarza
Share on other sites

37 minut temu, BananWszyscy napisał:

Nadal przy wywaleniu doraźnego lekarstwa w postaci delay'a staje zawsze w tym samym miejscu

Co prawda ja nic złego w tym programie nie dostrzegam, ale miewałem tak, że dodanie debugowatego printfa w magiczny sposób sprawiało, że program zaczynał działać. Zawsze (podkreślam: zawsze) było to jakieś łażenie po tych fragmentach pamięci, po których się łazić nie powinno (jakiś błąd +/-1). Może ta informacja pomoże?

Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

Co prawda ja nic złego w tym programie nie dostrzegam, ale miewałem tak, że dodanie debugowatego printfa w magiczny sposób sprawiało, że program zaczynał działać. Zawsze (podkreślam: zawsze) było to jakieś łażenie po tych fragmentach pamięci, po których się łazić nie powinno (jakiś błąd +/-1). Może ta informacja pomoże?

A podpowiesz jak to sprawdzić? 😛

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.