Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Przejście ATtiny2313 w tryb oszczędzania energii - asembler

tadeko9 08 Apr 2020 11:01 948 14
  • #1
    tadeko9
    Level 9  
    Witam.
    Nie wiem jak w asemblerze wykonać przejście mikrokontrolera ATtiny2313 w trym oszczędzania energii, gdy brak będzie zasilania z sieci (praca
    na baterii).
    W bascomie po skonfigurowaniu PORTD.2 (INT0) jako wejście podciągnięte do + i podłączenia do niego +5V i rezystora do masy sprawę załatwiał poniższy fragment programu
    Code: vbnet
    Log in, to see the code


    Jak powinien wyglądać odpowiednik w asemblerze?
    Jak wyłączyć i załączyć Timer0 ?
    Jak włączyć tryb Idle ?
    tadeko9
  • #2
    kamyczek
    Level 38  
    To co napisałeś to pewnie Bascom, ale po pierwsze nie używasz przerwania INT0 tylko portu jako wejścia.

    Żeby używać INT0 jako przerwania powinieneś po pierwsze skonfigurować jakie zdarzenie na INT0 ma wywołać przerwanie: zmiana stanu czy poziom?
    Zezwolić na obsługę przerwania INT0 i odblokować globalnie przerwania. Po wystąpieniu zdarzenia nastąpi skok do procedury obsługi przerwania i zostanie wykonane to co w niej się znajduje.
    W obsłudze przerwania musisz wyłączyć TIMER0, wyłączyć wyświetlacze, a następnie wpisać do rejestru MCUCR odpowiednią wartość SM0 i SM1 = 0 i SE = 1.
    Operacje tego typu to po prostu zapisywanie odpowiednich rejestrów odpowiednimi wartościami.
  • #3
    bart-projects
    Level 26  
    Nie wiem dlaczego to chcesz napisać w Asm, ale musisz wiedzieć, że Bascom generuje plik OBJ który mozesz załadować do Atmel Studio i podejrzeć wygenerowany kod Asm.
    Mój program NoSave Tool także potrafi te dane wyciągać z pliku OBJ tyle że szybciej i przyjemniej - jednym klikiem.

    Proszę to zdeasemblowany kawałek (nie cały) kodu wraz z opisami która to komenda Bascom odpowiada za kod Asm. Moze Tobie pomoże ;)

    Code: avrasm
    Log in, to see the code


    Miłego dnia ;)

    BTW. Program potrafi też dodawać opisy instrukcji, ale po czasie znam je na pamięć i domyślnie mam to wyłączone. Przydaje się to jednak jak ktoś jeszcze mnemoników nie zna.
    Przejście ATtiny2313 w tryb oszczędzania energii - asembler
  • #4
    tadeko9
    Level 9  
    kamyczek wrote:
    To co napisałeś to pewnie bascom ,ale po pierwsze nie używasz przerwania int0 tylko portu jako wejścia .

    Żeby używać int0 jako przerwania powinieneś po pierwsze skonfigurować jakie zdarzenie na int0 ma wywołać przerwanie
    zmiana stanu , poziom .Zezwolić na obsługę przerwania int0 i odblokować globalnie przerwania . po wystąpieniu zdarzenia nastąpi skok do procedury obsługi przerwania i zostanie wykonane to co w nim się znajduje .
    W obsłudze przerwania musisz wyłączyć timer0 ,wyłączyć wyświetlacze a następnie wpisać do rejestru MCUCR odpowiednią wartość SM0 i SM1 =0 i SE =1
    Operacje tego typu to po prostu zapisywanie odpowiednich rejestrów odpowiednimi wartościami .


    Tak to dokładnie fragment z bascom'a, co napisałem w 2-gim zdaniu.
    Dziękuję za podpowiedź. Problem w tym, że dopiero startuję w asemblerze, więc proszę o uszczegółowienie:
    1. Jakim poleceniem wyłączyć Timer0.
    2. Jakimi poleceniami ustawić rejestr MCUCR.
    Znalazłem informację, że w celu przejścia do trybu "Idle", należy ustawić SM0=0 i SM1=0, ale nie wiem jak to napisać w aseblerze.
    Proszę o podpowiedź.
    Dziękuję.
    tadeko
  • #5
    kamyczek
    Level 38  
    Po pierwsze ściągnij sobie pdfa tam powinien być przykład konfiguracji w C i w asemblerze jeśli nie będzie go w tym układzie z pewnością jest w atmedze 8 . Wszystko co robisz w bascomie za pomocą config ... w asemblerze odbywa się wpisując odpowiednią wartość do rejestrów . Może na początek zaproponował bym ci książke Mikrokontrolery attiny w praktyce . Wydawnictwo BTC autor Rafał Baranowski . Są w niej opisy , przykłady i wystarczająca ilość wiedzy żeby zacząć .
  • #6
    dasej
    Level 32  
    Witam.

    Możesz odpowiedzieć na pytanie co to za projekt ( ogólnie ).
    Dlaczego nie zasilasz go z baterii stale, a układ zasilania sieciowego tylko wspomaga zasilanie bateryjne.
    Tak są robione UPS serii RT. Niema w nich czasu przełącznia.
    Jak jest to Twój projekt i jeszcze nie dokończony to zmienień sposób zasilania i nie będziesz miał
    problemu z czasem reakcji na zmianę zasilania, wystarczy Ci sam Bascom.
  • #7
    bart-projects
    Level 26  
    Wychodzi na to, że szybciej sie dogaduję z uC, PC niż z ludźmi :D

    Jest kod w Bascom i działa. Gość pyta jak to zapisać w Asm to dostaje tłumaczenie każdej komendy Bascom do Asm i dalej nie widzi zależności?

    Może zanim komus pomożemy powinniśmy zapytać czy OT wie ile jest rejestrów albo czy wie co to R23 :D

    Otóż Bascom jak ma działać na zmiennych to ładuje je do R24 a jak coś ładuje do R23 to znaczy że działamy na rejestrach I/O.

    "Jak to napisać w asemblerze" - no widać jak na dłoni.

    Jeśli Bascom robi tak : IN R23, $35
    To otwórz z łaski swojej notę katalogową procesora, przejdź do "Register Summary" i sprawdź co Bascom wciąga do rejestru podręcznego... to może być MCUCR.

    Dopóki kolega nie odrobi lekcji zamilknę w tym temacie.

    [EDIT]Podpowiedź która może rozjaśni coś w temacie jak sie OT będzie rozglądał w kodzie Asm $35 to MCUCR a $39 to TIMSK
  • #8
    tadeko9
    Level 9  
    Witam.
    Nie wiem, czemu moje dodatkowe pytanie tak zdenerwowało Cię "bart-projects".
    Akurat Twoja odpowiedź jest dla mnie jasna i klarowna.
    Moje dodatkowe pytanie było skierowane do "kamyczek".
    Chyba oczywiste jest, że pytania zadają osoby, które dopiero zaczynają i nie mają doświadczenia.
    Nie ma się co złościć.
    Za pierwszą odpowiedź kol. "bart-projects" bardzo dziękuję.
    Interesuje mnie jeszcze, jak na samym początku programu należy zapisać, że chcę korzystać z przerwania INT0.
    Z góry dziękuję za informację.
    tadeko9
  • #9
    JarekC
    Level 32  
    Może pokaż na początek jak jest zrobione zasilane awaryjne.

    Aby korzystać z przetrwania musisz:
    - odblokować przerwanie INT0 w rejestrze GIMSK (ustawienie bitu INT0 w stan 0)
    - skonfigurować kiedy ma być zgłaszane INT0 , bity konfiguracyjne ISC00,ISC01 w rejestrze MCUCR
    - zainicjować vektor przerwania od INT0 (jeżeli nie robi tego kompilator)
    - odblokować globalnie przerwania, rozkaz SEI
    - napisać obsługę przerwania.
  • #10
    tadeko9
    Level 9  
    Witam.
    Tutaj udzielę odpowiedzi kol. dasej.
    Ten fragment kodu w bascomie, który zamieściłem w inicjującym temat pytaniu, to fragment mojego programu dla zegara z wyświetlaczami led. Układ zasilany jest z zasilacza sieciowego, a w przypadku zaniku napięcia, układ zasilany jest z baterii. Stąd przejście w tryb oszczędzania energii.
    INT0 skonfigurowałem jako wejście podciągnięte do + i jest ono podczas normalnej pracy zwierane tranzystorem do masy, dlatego PIND.2=1 (INT0=1) oznacza brak zasilania z sieci.
    Zegar ten samoczynnie przestawia czas na letni i zimowy. Ma też możliwość bardzo dokładnej regulacji dokładności zegara (obecnie odchyłka wynosi znacznie mniej niż 0,5s/miesiąc).
    Ponieważ dla programu w bascomie brakuje mi miejsca na korygowanie parametrów, od których zależy dokładność zegara, chciałem przejść na asembler. Obecnie zegary z tym programem pracuję na ATtiny4313, lecz zmiana parametrów dokładności wymaga przeprogramowania.
    Napisany program w asemblerze mieści się w ATtiny2313, ale stanąłem przed problemem zasilania awaryjnego po zaniku napięcia. Wiem, że muszę wyłączyć wyświetlacze oraz Timer0, który nimi steruje, ale problem mam z przełączeniem mikrokontrolera w tryb Idle - z asemblerem dopiero się zapoznaję.
    Pozdrawiam
    tadeko9
  • #11
    dasej
    Level 32  
    @tadeko9
    Dając DS3231 nie musiałbyś się martwić zasilaniem, układ ma swoje własne podtrzymanie zasilania.
    Skoro sam kalibrujesz oscylator to mogłeś dać DS32KHZSN i obeszło by się kalibracji a układ ma wejście bateryjne.

    A tu masz poglądowy przykład zasilania układu, gdzie czas zaniku zasilania niema znaczenia i gdzie bez problemu
    można obsłużyć funkcję budzika.

    Przejście ATtiny2313 w tryb oszczędzania energii - asembler

    Przejście ATtiny2313 w tryb oszczędzania energii - asembler

    A tu masz Link do tego pdf.

    Wychodzi że bascom ma na to wszystko polecenia i nie przypuszczaj żeby z kompilatora
    zajęło więcej miejsca niż w asm. Przed użyciem rejestrów w asm wypada je odłożyć na stosie
    by nie namieszać w reszcie programu.

    Przypuszczam że jeden z timerów obsługuje kwarc 32kHz, zapewne w trybie asynchronicznym.
    Czyli wejście w tryb oszczędnościowy masz już zrobiony.
  • #12
    tadeko9
    Level 9  
    bart-projects wrote:
    Nie wiem dlaczego to chcesz napisać w Asm, ale musisz wiedzieć, że Bascom generuje plik OBJ który mozesz załadować do Atmel Studio i podejrzeć wygenerowany kod Asm.
    Mój program NoSave Tool także potrafi te dane wyciągać z pliku OBJ tyle że szybciej i przyjemniej - jednym klikiem.

    Proszę to zdeasemblowany kawałek (nie cały) kodu wraz z opisami która to komenda Bascom odpowiada za kod Asm. Moze Tobie pomoże ;)

    Code: avrasm
    Log in, to see the code


    Miłego dnia ;)

    BTW. Program potrafi też dodawać opisy instrukcji, ale po czasie znam je na pamięć i domyślnie mam to wyłączone. Przydaje się to jednak jak ktoś jeszcze mnemoników nie zna.
    Przejście ATtiny2313 w tryb oszczędzania energii - asembler


    Dopiero teraz wróciłem do tego tematu. Niestety ten kod dopisany do programu w asemblerze nie działa. Po wyłączeniu zasilania i ponownym załączeniu, wyświetlacze zegara są ciemne i nie wiem co jest tego powodem. Zegar wraca do pracy tylko po resecie, ale wówczas trzeba go od nowa ustawiać.
    Czy ma tutaj znaczenie, że używam ATtiny4313 a nie ATtiny2313?
    Z góry dziękuję za pomoc.
    tadeko9

    Dodano po 24 [minuty]:

    bart-projects wrote:
    Wychodzi na to, że szybciej sie dogaduję z uC, PC niż z ludźmi :D

    Jest kod w Bascom i działa. Gość pyta jak to zapisać w Asm to dostaje tłumaczenie każdej komendy Bascom do Asm i dalej nie widzi zależności?

    Może zanim komus pomożemy powinniśmy zapytać czy OT wie ile jest rejestrów albo czy wie co to R23 :D

    Otóż Bascom jak ma działać na zmiennych to ładuje je do R24 a jak coś ładuje do R23 to znaczy że działamy na rejestrach I/O.

    "Jak to napisać w asemblerze" - no widać jak na dłoni.

    Jeśli Bascom robi tak : IN R23, $35
    To otwórz z łaski swojej notę katalogową procesora, przejdź do "Register Summary" i sprawdź co Bascom wciąga do rejestru podręcznego... to może być MCUCR.

    Dopóki kolega nie odrobi lekcji zamilknę w tym temacie.

    [EDIT]Podpowiedź która może rozjaśni coś w temacie jak sie OT będzie rozglądał w kodzie Asm $35 to MCUCR a $39 to TIMSK


    Tylko, że ten kod nie działa właściwie - po zaniku zasilania i powrocie, wyświetlacz jest ciemny.
  • #13
    kamyczek
    Level 38  
    Deklaracja dla attiny4313 różni się wartościami bo układ ma dwa razy więcej ram , flash i eeprom ,ale o to nie musisz pytać wystarczy że porównasz pdfy attiny2313 i attiny 4313.
  • #14
    bart-projects
    Level 26  
    Szanowny Panie @tadeko9, przepraszam za mój poprzedni, faktycznie szorstki, ton. Co złego to nie ja :D
    W pierwszym poście dołączył Pan taki kod:
    Code: vbnet
    Log in, to see the code

    ...i wcześniej napisał, że to "załatwiało sprawę".
    Otóż tutaj Pan się pomylił, albo specjalnie przekłamał :P , a ja niepotrzebnie zaufałem w prawdziwość tej tezy :P

    W nocie katalogowej Tinych 2313-4313 można odnaleźć rozdział "Power Management And Sleep Modes" a w nim "co może wybudzić procesor ze snu w danym trybie Idle-Power Down-Standby". Z tabeli wynika, że nie obudzi się od zwykłej zmiany stanu na pinie. Potrzebne jest przerwanie.

    Poniżej przedstawiam krótki kod z opisem co i dlaczego. Jeśli Pan zrozumie gdzie był błąd a będzie chciał to mogę pokazać wygenerowany kod w ASM.
    Code: vbnet
    Log in, to see the code


    Bascom pozwala pisać cały kod w ASM lub robić wstawki i nawet jestem się w stanie założyć, że potrafiłbym napisać te procedury które rzekomo kalibrują ten zegar do 0.5s na miesiąc, w Bascom tak żeby zmieściły się w Tiny z 2K flash. Nie wiem tylko po co się tak gimnastykować żeby to tam upchnąć :D

    W celu natchmiastowego wykrycia zmiany stanu zasilania może Pan zmienić przerwanie z Falling na Change i przenieść instrukcję warunkową do przerwania.

    [EDIT] W Bascom $regfile 2313.dat oznacza uC AT90S2313 a dopiero $regfile Attiny2313.dat oznacza ATtiny2313 i one się dużo róznią. Możliwe więc że wygenerowany wcześniej ASM code nie pasował. Dlatego dołączam od razu ten dla powyższego kodu.
    Code: avrasm
    Log in, to see the code
  • #15
    kaczodp
    Level 14  
    tadeko9 wrote:
    Ponieważ dla programu w bascomie brakuje mi miejsca na korygowanie parametrów, od których zależy dokładność zegara, chciałem przejść na asembler. Obecnie zegary z tym programem pracuję na ATtiny4313

    Jak układ jest w DIP to daj AVR z większą pamięcią i zrób przejściówkę.