logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

at902313 asembler -przerwania

Yacek_64 05 Gru 2011 12:13 1261 7
REKLAMA
  • #1 10220629
    Yacek_64
    Poziom 11  
    Witam
    Własciwie to mam na początku dwa pytania , pierwsze to :
    Konfiguruje port d jako wejscie z podciąganiem do plusa i potem w programie sprawdzam czy przycisk jest wciśnięty
    Sbis pind,6
    Rcall podprogram

    i tu pytanie w AVR studnio podczas symulacji symulator zachowuje się tak jakby przycisk byl wciśnięty tzn panowal stan niski czyli skacze do podprogramu.
    Tego nie rozumie .

    i drugi temat
    zmienna ma powiedzmy wartość 5
    w pętli typu :

    petla:
    cpi cyfra,0
    brne petla
    ret

    sprawdzam czy cyfa jest równa 0 jeśli tak to z podprogramu, moim zdaniem powinien wrócić do głównego programu
    a tak sie nie dzieje , dlaczego nie wiem .
    tytułem uzupełnienia
    zmniejszenie wartości rejestru cyfra realizowane jest poprzez wywolanie przerwania zewnętrznego

    przerwanie:
    dec cyfra
    reti
    Proszę o jakieś sugestie wskazówki , juz od tygodnia walcze z tematem
    jeśli zamiast przerwań zmniejszenie wartości cyfry realizuje np poprzez badanie przycisku , wszystko dziala ok , ale ja potrzebuje przerwania. No i diabli mnie biorą ze czegoś nie wiem albo coś źle robie a nie wiem co.
    Pozdrawiam
    Yacek
  • REKLAMA
  • #2 10220677
    tmf
    VIP Zasłużony dla elektroda
    Co do pierwszego - skąd symulator ma wiedzieć w jakim stanie jest pin wejściowy? Możesz stworzyć plik symulacji z przebiegami IO i nim nakarmić AVR Studio.
    Co do drugiego - cyfra to jak rozumiem jakiś symbol rejestru? Jak wygląda procedura obsługi przerwania? Jeśli tak jak pokazałeś to jest totalnie błędna, bo dec zmienia rejestr statusu procesora, a że z punktu widzenia programu przerwanie jest w losowym momencie, to SREG ma po tym wartość zupełnie niezwiązaną z instrukcją programu. Np. co będzie jeśli przerwanie wypadnie pomiędzy cpi a brne?
  • REKLAMA
  • #3 10221780
    Yacek_64
    Poziom 11  
    Wydumałem sobie co do pierwszego ze skoro deklaruje podciąganie do plusa to panuje stan 1 bit jest ustawiony. Co do drugiego, nie upieram się bo wiez ze źle to dziala ale staram się zrozumieć, przerwanie wywoluje zbocze opadające przycisku uruchamianego paluchem, nie chce mi się wierzyć ze zawsze przerwanie przypadalo w takim niefortunnym momencie, na wyświetlaczu mam wartość "cyfry" równej zero więc po istrukcji tst lub jak w przykladzie cpi powinno wyjść z pętli. Albo inaczej poddaje się, jak sprawdzić czy "cyfra " jest równa zero i jeśli tak ma wyjśc z podprogramu. Albo zamiast takiej postaci mojej procedury obsługi przerwania jak w fachowy sposob pomniejszyć o jeden wartosć rejestru cyfra a kiedy ona osiągnie wartosć zero podprogram wyjdzie z pętli
    Yacek
    Ps. dziękuje za zainteresowanie ,a sam bede dalej dręczyl temat
  • #4 10222209
    tmf
    VIP Zasłużony dla elektroda
    W procedurze obsługi przerwania musisi zachowywać stan rejestru stanu procesora - standardowo push/pop. Bez tego w programie będą się działy takie cuda, że nie ma senstu tego analizować.
  • REKLAMA
  • #5 10226757
    Yacek_64
    Poziom 11  
    tmf - jesteś wielki co prawda pop i push nie dziala tylko ldi i out ale to szczegół, normalnie sam jestem zachwycony w takim razie temat można zamknąc.
    Dzieki
  • #6 10227042
    Andrzej__S
    Poziom 28  
    Yacek_64 napisał:
    ...co prawda pop i push nie dziala ...

    Instrukcje push i pop muszą działać, bo one głównie do tego służą. Trzeba tylko pamiętać, żeby, po odłożeniu na stos używanych w obsłudze przerwania rejestrów instrukcją push, przywracać je przed zakończeniem (tejże obsługi) instrukcją pop dokładnie w odwrotnej kolejności.

    Standardowo wygląda to tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Yacek_64 napisał:
    ... dziala tylko ldi i out ale to szczegół...


    Chodziło Ci zapewne o instrukcje in i out. Owszem, w wyjątkowo prostych programach wystarczy zapamiętać zawartość SREG w którymś z nieużywanych (nigdzie indziej w programie) rejestrów. Trzeba też wtedy pamiętać o tym, że nie wolno w przerwaniu korzystać tymczasowo z tych samych rejestrów, co w głównym programie (chyba, że jest to zmienna globalna). Jeśli jednak spróbujesz stworzyć bardziej rozbudowany program, taka technika szybko przestanie być wystarczająca.
  • REKLAMA
  • #7 10228129
    Yacek_64
    Poziom 11  
    Ja tam nie jestem wytrawnym znawcą tematu jak użyłem instrukcji push i pop to avr studnio pluło błędami podobnie jak in czy mov. A w ksiązec "Mikrokontrolery AVR w praktyce ― Wydawnictwo BTC autor Doliński" był przykład własnie z ldi i out i poszło , moze przyczyna tkwi ze korzystałem z dolnych rejestrów R0...R15. ale to na emeryturze bede analizowal :-)
  • #8 10229986
    Andrzej__S
    Poziom 28  
    Yacek_64 napisał:
    ...jak użyłem instrukcji push i pop to avr studnio pluło błędami podobnie jak in czy mov. A w ksiązec "Mikrokontrolery AVR w praktyce ― Wydawnictwo BTC autor Doliński" był przykład własnie z ldi i out i poszło...

    To co najmniej dziwne, jeżeli nie działa instrukcja in, za to działa instrukcja out. Te instrukcje są komplementarne, robią dokładnie to samo, tylko w odwrotnym kierunku. Przedstawiony przeze mnie sposób musi działać, pod warunkiem, że wybrałeś w projekcie prawidłowy procesor (domyślam się, że chodziło o AT90S2313) i zainicjowałeś prawidłowo wskaźnik stosu.

    Skoro jednak w ten sposób podchodzisz do tematu:
    Yacek_64 napisał:
    Ja tam nie jestem wytrawnym znawcą tematu ... ... moze przyczyna tkwi ze korzystałem z dolnych rejestrów R0...R15. ale to na emeryturze bede analizowal :)

    to ja tym bardziej nie będę analizował, w jaki sposób za pomocą instrukcji ldi (załadowanie do rejestru wartości stałej) można zapamiętać zawartość rejestru statusowego. ;)
REKLAMA