Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Attiny 2313][ASM] - Nieprawidłowy reset z powtarzającym się błędem

acetylenek 20 Wrz 2012 23:19 2910 6
  • #1 20 Wrz 2012 23:19
    acetylenek
    Poziom 11  

    Układ jest fizyczną realizacją projektu Elm ChaN

    Jest to sterownik serwo do silników prądu stałego ze sprzężeniem zwrotnym na enkoderze inkrementalnym.

    Program w asemblerze na At902313-SMC i nowa wersja na Attiny2313 - SMC3

    Problem pojawia się niezależnie od wersji oprogramowania.

    Konfiguracja tego sterownika odbywa się poprzez komunikację z komputerem za pomocą terminala poprzez RS232.
    W wersji SMC i SMC3 (wersja bez ideksu a) użycie instrukcji "l enter" powoduję pojawienie się wartość licznika aktualnej pozycji (kręcąc enkoderem widzimy na bieżąco zmiany pozycji na ekranie)

    Gdy układ nie pracuje dłuższy czas po jego włączeniu i sprawdzeniu wartości aktualnej pozycji nie ma tam wartości zero jak powinno być tylko najczęściej
    3158208 = 0b 0011 0000 0011 0000 1100 0000 lub
    1052736 = 0b 0001 0000 0001 0000 0100 0000 lub inne wartości (kiedyś pojawiały się inne teraz 95% poz 1 i 5%poz 2)
    Wartość ta jest zapisana w rejestrach R10, R11, R12.

    Układ mimo to pracuje dalej poprawnie po prostu silnik kręci się do tej pozycji i dalsza praca przebiega bez przeszkód (można też poprzez komendy zmiany trybu pracy dokonać zerowania licznika, każda zmiana trybu pracy skutkuje jego resetowaniem)

    Nie dzieje się tak gdy układ się wyłączy i włączy ponownie w ciągu kilku lub kilkunastu minut.

    Można sztucznie ten czas skróci, doszedłem do tego jak wywołać na 100% pojawienie się tego błędu. Wystarczy zewrzeć kondensator zasilający aby napięcie na nim było bliskie 0V i włączyć zasilanie.

    Mierzyłem napięcie zasilające procesor i gdy zasilanie wróci przed uzyskaniem 0,02V błąd się nie pojawia, gdy napięcie jest mniejsze niż 0,01V wartość licznika jest błędna.

    Sprawdzałem program i nic niepokojącego nie widzę.

    Fusebity ustawione wg. mojej wiedzy oraz opisu na stronie ELM ChaN dobrze czyli
    CKSEL=1111
    SUT=10
    CKOUT=1
    CKDIV8=1
    RSTDISBL=1
    BODLEVEL=100
    WDTON=1
    EESAVE=1
    DWEN=1
    SPMEN=1

    Zasilanie układu realizowane jest na przetwornicy impulsowej Lm574hvn oraz poprzez filtr LC L2=1,2uH (na schemacie jest napisane 12uH) C11=100nF.
    Nóżka reset poprzez R1=10kom do +5 i kondensator C12 do masy.

    Udało mi się ze 100% skutecznością uzyskać uruchomienie z błędem oraz bez błędu.

    100% błąd jak już wcześniej napisałem zewrzeć nóżki kondensatora na lini 5V i włączyć zasilanie (12V z zasilacza od dysku zewnętrznego - przelotka usb - ale i na innych zasilaczach jest tak samo)

    100% prawidłowe uruchomienie podłączyć zasilanie ale 5V (z tego samego zasilacza od dysku) do nóżki dławika ale od strony procesora (łatwiej mi było dotknąć do dławika niż do nóżki procka). Zwieranie kondensatora nie ma wpływu na prawidłowe uruchomienie zawsze jest ok.

    Co ciekawe podłączenie zasilania 5V do drugiej nóżki dławika (oczywiście znowu po wcześniejszym chwilowym zwarciu kondensatora) daje błąd.






    Fragment kodu do momentu RESET - reszta jest dostępna na stronie z linku -patrz pierwsza linijka.

    Płytka drukowana dwu warstwowa zaprojektowana według mojego stanu wiedzy. Na płytce znajduje się przetwornica 5/5v do separacji galwanicznej sterowania, oraz transoptory (wartości rezystorów na schemacie nie odpowiadają tym rzeczywistym)

    Parę lat temu się tym zajmowałem teraz temat powrócił i stanąłem przed ścianą. Układ pracuje poprawnie w zaśmieconym elektromagnetycznie środowisku bez obudowy (silnik 3kW zasilany z falownika z kablami bez ekranu same silniki które układ steruje 48V do 6A) i nic mu się nie dzieje (oczywiście po ponownym uruchomieniu aby licznik wskazywał 0 )

    Co jeszcze mogę zrobić? Wszystko wskazuje na to że zasilanie jest nieprawidłowe, tylko dlaczego układ już po takim błędzie działa poprawnie?

    UWAGA na schemacie niektóre wartości elementów są opisane nieprawidłowo to znaczy w rzeczywistym układzie mają inną wartość.


    Kod: asm
    Zaloguj się, aby zobaczyć kod


    [Attiny 2313][ASM] - Nieprawidłowy reset z powtarzającym się błędem
    [Attiny 2313][ASM] - Nieprawidłowy reset z powtarzającym się błędem

    0 6
  • #2 21 Wrz 2012 11:58
    30402
    Użytkownik usunął konto  
  • #4 21 Wrz 2012 16:09
    acetylenek
    Poziom 11  

    Kondensator na reset troszkę z rozpędu dałem (projekt robiłem w 2006r ). W zasadzie nie jest on potrzebny tak samo jak rezystor choć rezystor wydaje się być w takim zastosowaniu wskazany. Nota o kondensatorze mówi jedynie " gdyby był to trzeba go odłączyć przy trybie debugwire"

    To ty masz za zadanie tą pamięć wyzerować.

    Uwaga jest słuszna tak powinno być i jest. Pamięć ram jest resetowana przez wpisanie tam wartości "0" która jest w rejestrze "zawsze zerowym" zerowanym w drugiej linii etykiety "reset" czyli clr _0 (rejestr R15) potem ta wartość czyli 00000000 jest wpisywana kolejno do pamięci ram od 0x60 w górę czyli nie zeruje rejestrów o które mi chodzi. Zerowanie tych rejestrów jest w etykiecie init_servo :
    W pliku include stworzonym przez programistę jest określona wartość
    .equ RAMTOP = 0x60 oraz zadeklarowane inne "instrukcje" nie asemblerowe, dla przejrzystości i łatwości użyte są instrukcję z końcówką "w" dla wartości word oraz "i".

    Czyli tu jest reset pamięci ram bez rejestrów:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Tutaj jest reset rejestrów które właśnie czasem zerowe nie chcą być _Pos i _Posx - razem to są 3 rejestry.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    wypis z piliku avr.inc
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 16 [minuty]:

    Chyba znalazłem sposób.

    Ta informacja o obowiązku resetowania ... reset tego co nie wychodzi jest dopiero po skoku.

    dodałem do etykiety "reset" fragment z etykiety "init_servo:" na samym początku

    wyszło coś takiego i po wstępnych próbach jest ok.

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #5 22 Wrz 2012 01:48
    acetylenek
    Poziom 11  

    Jednak dalej to samo.

    Przy okazji robiłem porządki z komentarzami i usunąłem przypadkiem jedną linijkę kodu:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    bez tej linijki czyli włączenia przerwań od timer0 błąd się nie pojawia ???

    Jakieś pomysły?

    0
  • #6 22 Wrz 2012 12:02
    30402
    Użytkownik usunął konto  
  • #7 25 Wrz 2012 18:11
    GreG$
    Poziom 13  

    Nie mam jakiegoś konkretnego pomysłu, bo nie widzę całości kodu, ale zauważyłem, że "puste" przerwania wskazują na "reset".

    .cseg
    ; Interrupt Vectors (ATtiny2313)
    rjmp reset ;Reset
    rjmp 0 ;INT0
    rjmp 0 ;INT1
    ... itd.

    Wydaje mi się, że może być któreś z "pustych" przerwań wykonywane - to trzeba sprawdzić w kodzie, czy istnieje taka możliwość.
    Z mojego doświadczenia wynika, że wykonanie resetu poprzez #$%ski skok do adresu 0x00 w AVRach nie daje oczekiwanych rezultatów - tj. takiego resetu jak poprzez BOD, WDT czy szczególnie External reset. Zawsze miałem coś nie tak właśnie w pamięci, pomimo że przygotowanie pamięci było po resecie realizowane (oczywiście wydaje mi się, że właściwie).
    Może tak być, gdyż zauważyłem (chyba ATmega8), że przerwania są jakby buforowane (INT0 i INT1 chyba używałem), tzn. że zanim skonfigurujesz obsługę przerwania, a fizycznie wystąpi zdarzenie to flaga przerwania jest ustawiona.
    Spróbuj przed włączeniem przerwań "sei" wyczyścić wszystkie pending interrupts i zalecałbym raczej taką konstrukcję wektora przerwań:

    .cseg
    ; Interrupt Vectors (ATtiny2313)
    rjmp reset ;Reset
    reti ;INT0
    reti ;INT1
    ... itd.

    0