Skocz do zawartości

Oryginalność mikrokontrolerów AVR z Chin


Sabre

Pomocna odpowiedź

deshipu, nse, nie wiesza się z "no save" 😋 dla tych mikrokontrolerów. I nie wiesza się bez "no save" dla mikrokontrolera z TME. Mówi Wam to coś?

Jestem w 99% pewien że masz błąd w programie, zamiast zgadywać zacznij myśleć 😉

A ja na 99% jestem pewny, że to problem z mikrokontrolerem. No i niestety muszę zgadywać z przyczyn, o których już wielokrotnie pisałem ale napiszę ponownie gdyby nie chciało Ci się czytać moich wcześniejszych postów. Ten sam kod, działa bez problemów na mikrokontrolerze, który kupiłem właśnie do lampek w TME, później doszły mikrokontrolery z Chin i mini arduino i zacząłem robić na nich inne rzeczy i wyszło to niejako przypadkiem.

Pokaż mi gdzie jest błąd skoro jesteś taki obeznany w Bascomie, to jeden z efektów, do którego jest skok z przerwania:

Sub Efekt6
  If Indeks = 4 Then Indeks = 5
  Enable Interrupts
  Enable Int0

  Do
     For N = 1 To Ile_ledow Step 3

        For X = 0 To Ile_ledow Step 1
           Red(n) = Max_pwm
           Blue(n + 1) = Max_pwm
           Green(n + 2) = Max_pwm
        Next X
        Gosub Bit_send
     Next N

     Wait 1
  Loop

End Sub
Link do komentarza
Share on other sites

deshipu, nse, nie wiesza się z "no save" 😋 dla tych mikrokontrolerów. I nie wiesza się bez "no save" dla mikrokontrolera z TME. Mówi Wam to coś?

Tak, marnujesz nasz czas 🙂

Dziękuję za owocną rozmowę 🙂

Link do komentarza
Share on other sites

Chłopaki, spokojnie. Przy takich błędach łatwo o przeoczenie ważnych rzeczy i ruskie wnioski.

Sabre: nie sądź pochopnie. Sam czujesz, że twierdzenie "to wina kompilatora" albo "mam zepsuty procesor" jest ostatnim czego profesjonalista powinien podejrzewać. Dlatego drążymy, to chyba dobrze, prawda? Spójrz, bardzo łatwo wyobrazić sobie (błędny) kod którego działanie będzie oparte np. na wartości jakiejś zmiennej, która nie jest inicjalizowana. W tym przypadku dla jednego procesora będzie działanie A, a w przypadku drugiej sztuki program będzie robił B lub C. Jeżeli na to nałożymy technologię i szansę tego, że zawartość RAMu po włączeniu zasilania nie jest totalnie przypadkowa a zależy od minimalnych różnic w strukturach tranzystorowych to może się okazać, że parta procesorów z danego miesiąca (lub innego cyklu produkcyjnego) zawsze robi pożądane A a inna, zawsze robi niechciane B z prawdopodobieństwem 95%. Jeżeli przyłożysz do tego prostą miarę (jak właśnie próbujesz) to wyjdzie, że jedne są dobre a drugie popsute.

Tu może być bardzo podobnie (bity rejestrów to też przerzutniki tranzystorowe), ale błąd jest być może bardziej subtelny.

Atrybutu NOSAVE możesz użyć wyłącznie wtedy gdy przerwanie wychodzi i wraca z/do pustej pętli. Jeżeli w kodzie który jest przerywany są jakieś instrukcje używające rejestrów to koniec, leżysz, bo nietrywialna obsługa przerwania prawie na pewno je zniszczy a dany program zauważy to jak przypadkowe zmiany swoich rejestrów w trakcie działania.

Pokaż więcej kodu i absolutnie nie czuj się osaczony, winny czy już skazany. Próbujemy pomóc i sami czegoś się dowiedzieć. To nie jest walka ani oskarżenia tylko ciekawy problem techniczny.

EDIT: Pisałem tak długo, że zdążyłeś coś wrzucić, dzięki 🙂 Tu widzę, że odblokowujesz przerwania w trakcie jego obsługi. Czy pętla trwa za długo? Już samo to jest proszeniem się o problemy, bo często zgłaszane (np. z przycisku?) przerwania kumulują swoje ramki na stosie wchodząc jedno w czasie obsługi poprzedniego. Jednopoziomowy system przerwań AVR ma jednak swoje zalety a samodzielne ich załączanie przed wyjściem z poprzedniego trzeba robić z bardzo dużym namysłem. Po drugie już mamy kolejny kłopot: jeżeli obsługa wyposażona w atrybut NOSAVE wystartuje w czasie pracy skomplikowanej pętli, na pewno zepsuje rejestry potrzebne lokalnie do jej organizacji i algorytm pętli na 100% się zawali...

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

marek1707, pokazałem kod obsługi jednego z efektów, pozostałych nie będę wklejał bo to nie ma sensu, kod wysyłania danych do ledów to jedyne czego brakuje, nie jestem jego twórcą:

$asm


Bit_send:                                                   
  ldi r17, Ile_ledow                                    
  clr R18                                                
  clr r19
  ;****************************************
  LDI XL , LOW(LABEL3)                                  
  LDI XH , HIGH(LABEL3)
  PUSH  XL
  Push  XH
  LDI XL , LOW(LABEL2)
  LDI XH , HIGH(LABEL2)
  PUSH  XL
  Push  XH
  LDI XL , LOW(LABEL1)
  LDI XH , HIGH(LABEL1)
  PUSH  XL
  Push  XH
  IN R23, SPL                                           
  in R24, sph                                           
Led_loop_:


  Out Spl , R23                                         
  Out Sph , R24                                         
  Loadadr Led_array(1) , X
  ADd Xl , R18                                          
  adc xh,r19
Bit_loop_init:
  ld R0,x                                               
  ldi R16,8                                             
Bit_loop:
  lsl r0                                                
  Sbi Port_led , Pin_led                                
  brcc Bit_0                                            
Bit_1:                                                      
  nop                                                   
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  dec r16                                               
  cbi port_led , Pin_led                                
  nop                                                   
  nop
  brne BIT_LOOP                                         
  rjmp Byte_ende
Bit_0:                                                      
  nop                                                   
  nop                                                   
  cbi Port_led , Pin_led                                
  nop                                                   
  nop
  nop
  nop
  Nop
  nop
  nop
  nop
  dec r16                                               
  brne BIT_LOOP                                         
Byte_ende:                                                  
  RET                                                   


Label1:
  add XL , r17                                          
  adc xh ,r19
  Rjmp Bit_Loop_Init                                    
Label2:
  add XL , r17                                          
  adc xh ,r19
  Rjmp Bit_Loop_Init                                    
Label3:
  inc R18                                               
  CPI R18 , Ile_ledow                                  
  brne led_loop_                                        

  ;****************************************




$end Asm
Return
Link do komentarza
Share on other sites

Czy mógłbyś opisać strukturę albo wrzucić jednak pełny kod? Może w formie zzipowanego załącznika bez rozpychania postów tagami CODE. Nie rozumiem kiedy wywoływane są takie funkcje jak Efekt6, jak wygląda pętla główna i jak ma się do tego obsługa przerwania.

EDIT: Akurat kod wysyłania strumienia danych najmniej mnie interesuje. Chodzi o całościową strukturę programu, miejsca włączania przerwań, sposoby wywoływania efektów z pętli głównej itd. Co powiesz o problemie gryzienia się atrybutu NOSAVE z niepustą pętlą główną? To bardzo ważne.

Link do komentarza
Share on other sites

marek1707, deshipu Miałem tylko jeden problem z procesorem przy wymianie AT90S2313 na ATinny2313 jeden działał drugi wyprawiał losowe głupstwa, zajęło mi to trochę czasu zanim znalazłem przyczynę polegającą na dolutowaniu pojemności 100nF bezpośrednio do zasilania procesora. Reszta problemów to wynikała z braku stosowania pewnych zasad przy pisaniu programów, ot taki twórczy chaos bez systematycznego sprzątania 😉

W tym przypadku barak stosowania podstawowych zasad pisania obsługi przerwań 🙂

Bo po co pisać przerwanie, skoro ono ma być główna pętlą programu ?

Link do komentarza
Share on other sites

Tu widzę, że odblokowujesz przerwania w trakcie jego obsługi.

Przerwanie jest odblokowywane po wyjściu z przerwania właśnie do podprogramu, do przerwania wchodzi dopiero po następnym wywołaniu go. Filmik z wczoraj tego nie pokazuje, ale tak jak tam pisałem, program działa, co 5 sekund jest zmieniany efekt, dochodzi do efektu, w którym w losowych miejscach zapalaja się i są płynnie wygaszane białe i niebieskie diody (48 sekunda filmu). Przestaje mikrokontroler reagować na nowe przerwania tylko gdy mam zdefiniowane 15 diod (zmienna Ile_leow), gdy zdefiniowane jest 100 ledów, mikrokontroler działa poprawnie i reaguje na kolejne przerwania, co widać na filmie, bo przeskoczyło na kolejny efekt.

Główna pętla programu jest pusta 😋, w przerwaniu jest sprawdzana wertość Indeks, która decyduje o kolejności efektów i skok do podprogramu w którym jest efekt i jego wyświetlanie, wszystkie, wydaje mi się, wystarczające kawałki wrzuciłem.

Link do komentarza
Share on other sites

Tak, to są cenne spostrzeżenia, ale typowy program jest na tyle skomplikowany, że trudno na tej podstawie wnioskować o miejscu błędu. Twój dodatkowo - mam wrażenie - stosuje pewne niestandardowe wybiegi. Mam delikatne wrażenie, że pisałeś go metodą objawową: działa? To idziemy dalej. To w 99% przypadków kończy się sukcesem, ale czasami zawodzi. Nadal wnioskuję o pełną wersję. Jeśli z jakichś powodów nie chcesz tego wrzucać, wyślij mi na PM. Po prostu jestem ciekaw. A przyczyny zasilaniowe odrzuciłem wcześniej - jesteś zbyt doświadczonym konstruktorem by złapać się na takie grabie.

Link do komentarza
Share on other sites

Tu widzę, że odblokowujesz przerwania w trakcie jego obsługi.

Przerwanie jest odblokowywane po wyjściu z przerwania właśnie do podprogramu, do przerwania wchodzi dopiero po następnym wywołaniu go. Filmik z wczoraj tego nie pokazuje, ale tak jak tam pisałem, program działa, co 5 sekund jest zmieniany efekt, dochodzi do efektu, w którym w losowych miejscach zapalaja się i są płynnie wygaszane białe i niebieskie diody (48 sekunda filmu). Przestaje mikrokontroler reagować na nowe przerwania tylko gdy mam zdefiniowane 15 diod (zmienna Ile_leow), gdy zdefiniowane jest 100 ledów, mikrokontroler działa poprawnie i reaguje na kolejne przerwania, co widać na filmie, bo przeskoczyło na kolejny efekt.

Zwróć uwagę na fakt że podprogramy wywołujesz w obsłudze przerwania, więc jak będziesz w nich odblokowywał przerwania to przy ich wywoływaniu będziesz przepełniał stos, tak to działa sprzętowo 🙂 Dokładniej pozwalasz wywoływać przerwanie jeszcze w nim będąc .... Idź na spacer i uspokój się, a potem analizuj swój kod krok po kroku i wszystko uporządkujesz sam 😉

Praca z przerwaniami to wyższy poziom rozumienia pracy mikroprocesorów, jesteś początkujący i powinieneś się cieszyć że Twój problem jest rozważany 🙂

Link do komentarza
Share on other sites

Zwróć uwagę na fakt że podprogramy wywołujesz w obsłudze przerwania, więc jak będziesz w nich odblokowywał przerwania to przy ich wywoływaniu będziesz przepełniał stos, tak to działa sprzętowo 🙂 Dokładniej pozwalasz wywoływać przerwanie jeszcze w nim będąc .... Idź na spacer i uspokój się, a potem analizuj swój kod krok po kroku i wszystko uporządkujesz sam 😉

Jestem spokojny i rozumiem jak to działa, tylko, że właśnie dzięki opcji "no save" wyrywając się z obsługi przerwania do podprogramu z efektem zapominam o przerwaniu i niejako nie zapycham stosu. To działa. Tylko, że to działa na tym mikrokontrolerze. Na tym z TME nie musiałem dopisywać "no save" i działało wszystko bez problemu, dlatego powstał ten wątek.

Program jest tak skonstruowany a nie inaczej bo to według mnie jedyne wyjście obsługi tego z przerwaniem. Jeśli się mylę to mnie poprawcie.

Teraz w przerwaniu jest podejmowana decyzja o skoku bo inaczej nie mógłbym mieć pętli kolejnych efektów. Gdybym zostawił w przerwaniu tylko zwiększanie zmiennej Indeks, a resztę wyrzucił do pętli głównej, pisząc resztę mam na myśli skoki do kolejnych podprogramów z efektami, to wtedy wywołując przerwanie w trakcie trwania podprogramu nie wróciłbym do pętli głównej (i tego nie jestem pewny) tylko do tego podprogramu, z którego wyrwało go przerwanie. Więc nie mógłbym zmieniać efektów.

Link do komentarza
Share on other sites

Sabre, czy zastanawiales sie co dzieje sie ze stosem gdy wywolywane jest przerwanie? np. czy stos jest pusty, a moze cos na nim jest? A jesli przerwanie nie wraca do miejsca wywolania, to kiedy to co bylo na stosie jest z niego zdejmowane?

Link do komentarza
Share on other sites

"

Przerwanie:

Disable Interrupts

Disable Int0

If Indeks = 0 Then

Waitms 500 " /// tu jest podstawowy problem zwróć uwagę ile czasu trwa obsługa przerwania

stosuj zasadę czas wykonywania podprogramu w przerwaniu ma być jak najkrótszy, a na pewno krótszy od czasu odstępu czasowego pomiędzy kolejnymi jego wywołaniami !

W tym przypadku chęć udowodnienia że to procesor winny, a nie programista jest już absurdalna 🙂, trzeba umieć uznać swój błąd i go naprawić, no chyba że wolisz wydać majątek na procesory ?

Link do komentarza
Share on other sites

Elvis, nie zastanawiałem się dopóki nie użyłem tych mikrokontrolerów z Chin bo nigdy nie miałem z tym problemu, wierz mi. Podkreślę kolejny raz, ten kod działa na mikrokontrolerze z TME, a ten z Chin po jakimś czasie przestaje reagować na kolejne przerwania ale tylko gdy mam zdefiniowane mniej diod czyli 15, gdy zdefiniowane jest 100 diod i opcja "nosave" program działa z bardzo dużą ilością przerwań bez problemu. Tak jak pisałem zostawiłem wyświetlanie na około 20 minut co jakiś czas zerkając czy działa, przerwania generowane były przez drugi mikrokontroler co 5 sekund. Wszystko działało poprawnie przez na pewno 15 minut, potem gdy zajrzałem świeciły tylko 3 pierwsze diody, zmieniając kolory RGB.

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.