Skocz do zawartości

Oryginalność mikrokontrolerów AVR z Chin


Sabre

Pomocna odpowiedź

jnk0le, mikrokontroler się nie zawiesza, przestaje reagować na przerwania. Wyświetla albo efekt na którym był czyli zawsze 11, albo tak jak było ostatnio gdy miałem wpisane 100 diod do ile_ledow, mikrokontroler zaczął wysyłać dane do 3 pierwszych ledów z paska zmieniając im cyklicznie kolory RGB.

Pisałem już że "nosave" nie ma wpływu na działanie tego programu. Sprawdziłem to gdy podmieniałem mikrokontrolery. Wpływ ma tylko i wyłącznie zdefiniowana ilość ledów.

Bez .lss ciężko mi wywróżyć coś więcęj.

Nie wiem o czym piszesz 🙂.

Link do komentarza
Share on other sites

O ile widzę stos jest na końcu pamięci RAM, więc możesz spróbować tak:
ldi r16,0xff 
out Spl,r16 
ldi r16,0x7f 
out sph,r16 

No niestety tego zapisu Bascom też nie trawi:

Unexpected non numeric characters found 0XFF

EDIT:

Zamieniłem to na zapis dziesiętny i poszło, wgram kod i dam znać.

Link do komentarza
Share on other sites

To przelicz na dziesiętne - a przy okazji totalnie się pomyliłem przeliczając, powinno być (dziesiętnie):

ldi r16,255
out Spl,r16 
ldi r16,7
out sph,r16 

[ Dodano: 16-06-2016, 18:26 ]

2k RAM = 0x07ff, a jakoś z rozpędu mi wyszło 0x7fff. Przepraszam

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Powinno być 7, ale ostatnio pracuję z większymi pamięciami i wyszło mi 127 🙂

[ Dodano: 16-06-2016, 18:29 ]

Cała pamięć ma 2K, czyli 2048 bajtów. Najwyższy adres to 2047 - liczone są od zera. 2047 to w hexach 0x7ff, czyli dolny bajt ma wartość 0xff = 255, a górny 7. Ja przez pomyłkę policzyłem dla 32K RAM

Link do komentarza
Share on other sites

Bez .lss ciężko mi wywróżyć coś więcęj.

Nie wiem o czym piszesz 🙂.

Plik generowany przez avr-objdump, ze zdekompilowanym kodem.

Jeśli nigdzie go nie ma, to wrzuć przynajmniej ten problematyczny 11 efekt co się zawiesza.

Link do komentarza
Share on other sites

Elvis masz u mnie piwo i to prawdziwe, a że obydwaj jesteśmy z Warszawy to nie będzie problemu z tym. Okazuje się, że pies jest gdzieś indziej pogrzebany. Mikrokontroler po dopisaniu tego kodu w asemblerze reaguje dalej na kolejne przerwania, ale uwaga, dla wartości zdefiniowanych ledów 15 przeskakuje kolejny efekt i wraca do 1.

Troszkę tego nie rozumiem, dlaczego dla 15 diod przestawał reagować na przerwania a dla 100 diod reagował. A teraz z tym czyszczeniem ramu pomija ten efekt.

Link do komentarza
Share on other sites

Kwestia tego która zmienna akurat się wylosuje w tym miejscu, gdzie jest overflow. Podejrzewam, że jak byś zrobił jakieś inne zmiany jeszcze w innych kawałkach kodu, nawet tylko zmiany nazw zmiennych albo kolejności ich definiowania, to zobaczyłbyś jeszcze więcej interesujących efektów.

Link do komentarza
Share on other sites

Coś jest nie tak mimo wszystko jest jakiś problem. Gdy zdefiniuję 100 diod to działa dobrze, ale jak zmienię na 15 to się resetuje. Dodałem na wyświetlaczu wyświetlanie zmiennej Indeks i jest ok do 10 po kolejnym przerwaniu zamiast zmienić się na 11 to pojawia się z kosmosu 60 i mikrokontroler się resetuje, wcześniej przestawał reagować na przerwania, teraz się resetuje.

Link do komentarza
Share on other sites

Wybaczcie już post pod postem, biję się w pierś. To był czeski błąd i w życiu bym nie wpadł na niego.

Dziwne że kompilator nie wyłapywał tego błędu że przypisywałem do zmiennej większą wartość niż zdefiniowana była dla niego tablica. Wiem już dlaczego ten kod pomimo jego problemów działał dla 100 diod a dlaczego dla 15 nie. Wpadłem na to, gdy na wyświetlaczu zamiast wartości Indeks =11 dostawałem 60. Wpisywało się na lcdku wartość, którą miał dostawać kolor diody. Z jakiegoś powodu przez mój błąd nadpisywało to wartość zmiennej Indeksu. Zorientowałem się gdzie leży problem jak zmieniłem wartość koloru na 50, wtedy na lcdku wyświetliło mi się 50 i mikrokontroler się resetował.

Od początku, w tym efekcie diody zapalają się w losowych miejscach, ale ponieważ w Bascomie nie da się do funkcji generującej randomową wartość wpisać zmiennej, to wpisałem tam na sztywno 100. Dla tylu diod miała być generowana tablica z losowo zapalanymi diodami. A ja tych diod definiowałem tylko 15, więc ta tablica u mnie miała wartość 15 a nie 100. Więc z tego powodu następował reset mikrokontrolera.

I żeby było zabawnie to zakomentowałem kod Elvisa z przerwania i zostawiam wszystko na jakiś czas żeby sprawdzić jak długo podziała z wychodzeniem z tych przerwań do podprogramów bez czyszczenia ramu. Przeszło już ponad 70 cykli i dalej działa poprawnie.

Nie było tematu, tak to bywa jak się człowiek zapomni i nie napisze jakiegoś komentarza żeby coś zmienić edytując program. Obiecuję Wam, że podczas następnej kąpieli wyleję sobie może nie wiadro zimnej wody na głowę, ale prysznic będzie zimny (przez chwilę 😋 ).

Link do komentarza
Share on other sites

Nie zaglądałem trochę na forum (przez wyjazdy), a tu powstał taki piękny temat 😃

Od teraz będzie to lektura obowiązkowa dla każdego początkującego, który będzie pisał, że program mu nie działa, bo dostał zepsuty procesor! A tak zupełnie serio, to dziękuję wszystkim za zaangażowanie się w dyskusję. Wyszedł świetny przykład praktyczny, na temat sposobu na poszukiwanie mało oczywistych błędów 🙂

Link do komentarza
Share on other sites

jnk0le, pewnie dużo mniej dla kogoś bardzo spostrzegawczego bo to nie było takie oczywiste 🙂. Sam o tym zapomniałem.

Na pocieszenie i przeprosiny wrzucam zdjęcia działających lampek na choinkę 🙂.

Ten się nie myli co nic nie robi, każdemu się zdarza, ważne, że razem doszliśmy do tego 🙂.

Link do komentarza
Share on other sites

Fajnie, że wspólnymi siłami doszliśmy do pewnych wniosków 🙂 Ja jednak nie przestawałbym na obecnej wersji programu - wydaje mi się, że gdybyśmy zrobili głosowanie to demokratyczna większość osób piszących w tym wątku przegłosowałaby opinię, że w programie jest jeszcze jakiś błąd.

Ja nadal twierdzę, że ze stosem jest coś nie-tak. Może warto byłoby to dokładniej przetestować? Nawet jeśli program działa pięknie, ale sposób poszukiwania błędów może się przydać innym osobom w przyszłości.

Problem ze stosem jest taki, że program może długo działać w pełni poprawnie - wszystko zależy od tego co poniżej lub powyżej stosu się znajduje. Gdy program wychodzi "poza" stos, zapisuje dane w miejscu innych, np. zmiennych. Można takiego błędu długo nie wykryć, ale "czasem" obserwować np. dziwne wyniki.

Proponowałbym starą metodę dodania zmiennych "wartowniczych". Gdybyś miał wolną chwilę i chciał potestować program proponowałbym następującą metodę:

1) zmniejszyć rozmiar stosu, żeby szybciej było widać problemy - chyba dyrektywa $hwstack pozwala na zadeklarowanie wielkości stosu

2) zmniejszyć opóźnienia - tak żeby częściej występowały przerwania i łatwo można było sprawdzić co będzie np. po 1000 wywołań

3) zadeklarować jak największą tablicę i wpisać do niej ustaloną wartość - datę urodzin żony/dziewczyny, albo jakąkolwiek ustaloną wartość

4) w pętli głównej czy procedurze obsługi przerwania dodać sprawdzanie, czy w tablicy nadal jest oczekiwana wartość - wystarczy sprawdzać pierwszą i ostatnią pozycję tablicy

Moim zdaniem po pewnym czasie działania programu zawartość tablic ulegnie zmianie niejako samoczynnie... Ale fajnie byłoby to sprawdzić 🙂

Link do komentarza
Share on other sites

Elvis, zaproszenie na piwo aktualne, ale co do testów tego programu to odpuszczę go narazie. Za dużo dzisiaj już nad nim czasu straciłem. Planuję przepisanie go w jakimś stopniu, tak aby przerzucić większość do pętli głównej, tak żeby było bardziej zgodnie ze sztuką. Muszę odpocząć trochę od tego bo już wyczerpał mi się limit cierpliwości na jakiś czas 😉.

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.