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

Asembler AVR - wyjaśnienie działania programu...

29 Sty 2007 18:36 3390 4
  • Poziom 9  
    Witam,
    kiedyś bawiłem się mikrokontrolerkami AVR w Bascomie - ciekawa sprawa, ale po jakimś czasie zaczął mi się nudzić :). Postanowiłem więc spróbować sił w Asemblerze. Korzystam z kursu na stronie mikrokontrolery.net - ciekawy, ale trochę za mało jest wyjaśnień, dlatego bardzo proszę o pomoc :)

    Mam problem z układem czasowym, tzn. działa mi, ale ja chciałbym zrozumieć dlaczego i jak on działa.

    Oto jego kod źródłówy
    Code:

    .include "2313def.inc"
    .def acc = r16 ; nadanie rejestrowi r16 nazwy symbolicznej
    .cseg
    .org 0x00

    ldi acc, 0b11111111 ; załaduj do acc liczbę 255 (0xff)
    out DDRB, acc ; wpisanie do DDRB samych jedynek
    ; powoduje ustawienie pinów jako wyjście
    out PORTB, acc

    ldi acc, 0b1111100 ;
    out DDRD, acc ; piny D0 i D1 są ustawione jako wejścia
    ; pozostałe jako wyjścia
    ldi r16, 0b1110111
    out PORTD, acc

    ldi acc, 127 ;
    out SPL, acc ; ustawienie wskaˇnika stosu na 127

    sprawdz_klawisze:
    sbis PIND, 0 ; jeśli przycisk S1 nie jest wciśnięty
    ; to pomiń następną instrukcję
    rcall led ; w przeciwnym wypadku wywołaj procedurę
    ; zapalającą diodę
    rjmp sprawdz_klawisze ; powróć na początek sprawdzania klawiszy

    led:
    cbi PORTB, 7 ; zapal kropkę wyświetlacza
    ldi acc, 250 ; załaduj do acc czas opóˇnienia
    rcall waitms ; i wywołaj procedurę opóˇniającą
    rcall waitms ; czterokrotne wywołanie opóˇnienia
    rcall waitms ; 250ms da w sumie opóˇnienie ok 1s
    rcall waitms ;
    sbi PORTB, 7
    ret

    ; Przybliżone czasy opóźnień są podane dla
    ; rezonatora 4MHz
    .def licz1 = r20
    .def licz2 = r21
    .def licz3 = r22
    waitms:
    mov licz3, acc ; ustaw czas opóĽnienia
    ; powtórz n razy pętlę L,
    ; co da opóˇnienie ok. n * 1 ms
    L:
    ; powtórz 10 razy pętlę L0,
    ; co da opóĽnienie ok 1ms
    ldi licz2, 10
    L0:
    ; powtórz 100 razy pętlę L1,
    ; co da opóĽnienie ok. 100 us
    ldi licz1, 100
    L1:
    nop ; 1 cykl
    dec licz1 ; 1 cykl
    brne l1 ; 2 cykle
    ; koniec pętli L1
    dec licz2
    brne l0
    ; koniec pętli L0
    dec licz3
    brne L
    ; koniec pętli L
    ret


    A teraz pytania z mojej strony...
    1. Co oznaczają te dwie instrukcje?
    .cseg
    .org 0x00

    2. Po co używa się tutaj stosu? Czy jest on konieczny?

    3. Nie rozumiem instrukcji BRNE. Wiem że wykonuje ona skok do określonego miejsca w kodzie, jednak nie wiem co to jest "flaga zera (Z)"? Jak robi się operacje na tej fladze zera? Czy jest to jakiś rejestr?

    "Instrukcja BRNE (Branch if not equal) wykonuje skok warunkowy, jeśli flaga zera (Z) jest wyzerowana."

    I to wszystko :)

    Aha mam jeszcze jedno małe pytanie... planuje kupić płytkę prototypową do Atmegi16 (http://www.propox.com/products/t_145.html). Ponieważ nie jest tania to pytam się czy nie lepiej zainwestować w jakaś płytę i mikrokontroler ARM?
  • Pomocny post
    VIP Zasłużony dla elektroda
    1.
    .cseg - CODE SEGMENT - użycie pamięci programu (flash)
    org - wymuś kompilację od danego adresu
    2. Stos należy najpierw ustawić na koniec pamięci RAM (bo jest używany przy skokach do podprocedur, przerwań, powrotach z nich(, wynika to z tego, że z reguły na jej początku przechowywane są dane, a rdzeń procesora, czy ATmega128, czy ATtiny2313 jest podobnie skonstruowany, a różni się ilością tej pamięci.
    3. Flaga zera jest ustawiana, gdy ostatnia operacja arytmetyczna lub logiczna przyniosła zero. Instrukcja porównywania jest odejmowaniem bez zapamiętywania jej wyniku, jedynie zapamiętywany jest w rejestrze SREG odpowiedni stan flag.
    Ogólnie polecam najpierw spokojnie poczytać pomoc do AVRasm (w AVRStudio).
    Do do inwestowania, to najtaniej zrobić samemu i dokładnie to, co potrzebujemy. Bateria na tej płytce wydaje mi się zbędna, moze sprzedają gdzieś same laminaty bez elementów ?
  • Pomocny post
    Poziom 42  
    1. dyrektywa asemblera .cseg .org "mówi" kompilatorowi od jakiego adresu umieścić kod wynikowy programu po skompilowaniu

    2. stosu mógłbyś nie używać tylko wtedy gdybyś nie używał instrukcji typu rcall lub innych skoków do podprocedur, które muszą odłożyć na stosie punkt do którego ma wrócić program po zakończeniu tejże podprocedury - po rozkazie ret, lub gdybyś nie używał przerwań , które z natury korzystają ze stosu albo gdybyś nie korzystał z poleceń push i pop które odkładają i pobierają dane ze stosu. Jednak taki program o płaskiej budowie rzadko się stosuje - co najwyżej do prostych i testowych rozwiązań

    3. instrukcje typu br** to skoki do jakichś miejsc w programie w zależności od odpowienich warunków. Tak dla przykładu:

    jeśli robisz jakąś pętlę i chcesz aby powtarzała się 7 razy to napiszesz to np tak:

    ldi R17, 7
    Petla: [color=green];etykieta początku pętli

    .....
    tu jakieś instrukcje które działają w pętli
    ....
    dec R17
    ; zmniejszenie wskaźnika pętli
    brne Petla ; sprawdzenie czy wskaśnik = 0 - jeśl nie to skocz do etykiety Petla (poprstu gdy w wyniku rozkazu dec Rejestr - powstanie ZERO to odpowiedni wskaźnik przyjmuje jakąś wartość, i różne skoki typu Branch wykorzystują te zjawiska)

    ....
    tu dalsza część programu
    [/color]

    ... oczywiście warto poczytać szczegółowo na temat znaczników w resjestrze SREG , najlepiej chyba poleciłbym książkę wydawnictwa BTC "Mikrokontrlery ATmega w praktyce" - tam znajdziesz mnówstwo informacji dla początkującego asemblerowca a co ważniejsze sporo przykładów programów w asemblerze z dokłanymi opisami

    - odnośnie zakupu płytki prototypowej i cen - polecałbym ci wypróbowanie tego wszystkiego przy prawie zerowych kosztach - kup sobie procek ATmega8 czy ATtiny2313 i zacznij robić własne proste projekty nawet na pająka , które sterują na początku zapalaniem i gaszeniem jednej diody LED podłączonej do któregoś z wyjść portów.

    ... zaopatrz się jednak w programatorek STK200 (można go zrobić samemu ale uważam to za mało opłacalne bo kosztuje on ok 15zł i gdy kupisz to jest sprawdzony i działa dobrze a co ważne ze wszystkimi prockami z rodziny AVR). Zainstaluj sobie darmowy a dobry kompilator ATmela AvrStudio - zassij sobie program do programowania procków przez STK200 np PonyProg najnowszą wersję czy ISPPROG (też dadmowe) i zacznij zabawę bez kosztów - zobaczysz jakie to proste i jak szybko i mocno wciąga

    polecam ;)
  • Poziom 9  
    Dzięki bardzo za wyjaśnienie :)

    Co do tej płytki prototypowej to chyba faktycznie jest ona za bardzo rozbudowana a przez to za droga. Programator mam SI-PROG 2.2 a swoje projekty będe na pająka łączył a co tam :)
  • Poziom 42  
    pewnie, że na pająka ;) w końcu procki są po kilka zł a trzeba się naprawdę "pstarać" żeby uszkodzić trwale scalaka ;) .... Twój programator umożliwia rónie proste podłączenia do procka więc - powodzenia i dobrej zabawy - a dzięki asemblerowi szybko poznasz szczegóły działania AVRków - i nie jest to takie trudne jak się wielu wydaje na początku