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.

Asembler (AVR Studio) - jak wprowadzić opóźnienie

uszok 05 Sty 2009 01:50 3242 6
  • #1 05 Sty 2009 01:50
    uszok
    Poziom 14  

    Witam

    Programowałem trochę w bascomie swego czasu i tam opóźnienie wprowadzało się bardzo prosto - wait x i już..
    O co mi chodzi. Mam zrobić pragramik [na symulatorze], który stan wciśnięty przyciskami na porcie D wyświetla na LED na porcie B. Wszystko by było fajnie gdyby nie to, że to świecenie ma trwać 2 sekundy i dioda ma zgasnąc [a jeśli przycisk w ciągu tych 2 sek był ponownie wciśnięty to znów dolicza 2 sek itd]. No i tutaj jest mój problem. Dużo się już o tym naczytałem. Raz robiono to za pomocą pętli delay, ale jakoś się te rozwiązanie nie sprawdza bo nie umiem kontrolować czasu. Gdzieś piszą o wykorzystaniu timerów i przerwaniach... Da się to jakoś po ludzku zrobić?

    Programik:

    Code:

        .include "m2561def.inc"
        rjmp START
    ;--------------------------------

    START:
        .def rej1 = r16


        .equ KeyPort = PORTD
        .equ KeyPins = KeyPort - 2
        .equ LedPort = PORTB

        ldi rej1,low(RAMEND)
        out SPL,rej1
        ldi rej1,high(RAMEND)
        out SPH,rej1

        ser rej1
        out DDRB,rej1

    PETLA:
       in rej1, KeyPins
                out LedPort, rej1
                rjmp PETLA


    0 6
  • #3 05 Sty 2009 04:40
    uszok
    Poziom 14  

    Dziękuję bardzo. Zaraz z tym powalczę :)

    0
  • #5 05 Sty 2009 23:30
    uszok
    Poziom 14  

    Problem w tym, że nie wiem jak go użyć. Było by to napewno optymalniejsze, ale....

    0
  • #6 05 Sty 2009 23:40
    Balu
    Poziom 38  

    Toć to jak zawsze;)
    W DS'icie na pewno napisali:)

    Anyway jak już uruchomisz timer, to on Sobie liczy i liczy...
    Załóżmy, że to timer1.
    Sam z Siebie zliczy 65536 taktów zanim się przewróci;)
    Zakładam, że masz 1MHz taktowanie procka -> 1us trwa takt Uruchomiony timer z dzielnikiem 1(no prescale).
    Musisz zliczyć 15 razy i masz około 1 sekundy :) teraz możesz poeksperymentować żeby np. skrócić cykl ;)

    Skracanie cyklu: Przy wejściu do procedury timera wpisujesz mu na siłę to TCNT (chyba tak się nazywał ten rejestr) wartość np. 15535 no i zostaje nam do nowego przerwania 50000 taktów.
    Czyli każde przerwanie będzie generowane co 0,05 sekundy... Czyli po 20 przerwaniach otrzymujesz sekundę;)

    Łukasz.

    Dodano po 1 [minuty]:

    (Oczywiście weź pod uwagę ile taktów zajmie Ci wpisanie do tcnt nowej wartości i wpisz o tyle mniejszą;-) no i pamiętaj, że w asmie musisz wpisać do tcnt1l i tcnt1h oddzielnie:>

    0
  • #7 05 Sty 2009 23:56
    uszok
    Poziom 14  

    Mam ATmega 2560 4MHz :) A to co piszesz - pobawię się...

    0