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

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

uszok 05 Sty 2009 01:50 3713 6
REKLAMA
  • #1 5952181
    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:
    
        .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
    
    
    
  • REKLAMA
  • REKLAMA
  • #3 5952249
    uszok
    Poziom 14  
    Dziękuję bardzo. Zaraz z tym powalczę :)
  • REKLAMA
  • #5 5956769
    uszok
    Poziom 14  
    Problem w tym, że nie wiem jak go użyć. Było by to napewno optymalniejsze, ale....
  • REKLAMA
  • #6 5956821
    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:>
  • #7 5956902
    uszok
    Poziom 14  
    Mam ATmega 2560 4MHz :) A to co piszesz - pobawię się...
REKLAMA