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

Jak zaimplementować opóźnienie w asemblerze na AT90S1200?

kurzymis 29 Cze 2004 12:17 1164 3
REKLAMA
  • #1 717299
    kurzymis
    Poziom 11  
    Posty: 67
    Ocena: 4
    czy jest jakas instrukcja w at90s1200 odpowiedzialna za wyczekanie ustalona ilosc sekund (cos jak odpowiednik pascalowego delay-a) albo chociaz jakis fragment kodu ktory by to realizowal. chodzi mi oczywiscie o asemblera na at90s1200, a nie o bascoma. prosze o pomoc i pozdrawiam :)
  • REKLAMA
  • #2 717493
    mzielin
    Poziom 22  
    Posty: 483
    Pomógł: 31
    Ocena: 16
    Programik dla kwarcu 4 MHz:
    delay1us: nop
    cpi temp,0x03
    breq finished
    nop
    nop
    loop: dec temp
    cpi temp,0x03
    brne loop
    finished: ret
    Oczywiście możesz jeszcze użyć timera, i sprawdzać bit, lub obsłużyć przerwanie od niego. Można uzyć watchdoga (do 2s !).
    Procedura powyższa jest "żywcem wzieta" z noty katalogowej AVR910.asm
  • REKLAMA
  • #3 721471
    kurzymis
    Poziom 11  
    Posty: 67
    Ocena: 4
    a jak obsluzyc rezonator kwarcowy (10Mhz). chodzi mi o wstawke asemblerowa. sorki, ale dopiero zaczynam zabawe z uC to jeszcze wiele rzeczy nie wiem..
    pozdrawiam
  • #4 721780
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    To ze masz rezonator 10 MHz oznacza ze mikrokontroler wykonuje 10 * 10^6 cykli, a to oznacza ze jeden cykl trwa 0,1 us. Na początek załoz ze kazdy rozkaz trwa 1 cykl (to tylko załozenie), a wiec 0,1 us. Teraz musisz tylko wykonac podprogram który wykona T/0,1 rozkazów, gdzie T jest to czas który powinien trwac twój delay (mozna to wykonac przez pętle).
    Na koncu pozostają tylko drobne poprawki, typu zmiana ilosci wykonywania petli, albo nop w odpowiednie miejsce.
    Załączam juz gotowe 2 delaye dla kwarca 10 MHz:


    .INClUDE "1200def.inc"
    start:
    ldi r16,10
    rcall delay_us
    ldi r16,10
    rcall delay_ms
    koniec:
    rjmp koniec
    ;-------------------------------------------
    ;delay o czasie trwania "r16"us
    ;delay jest obarczony błędem ~0,5 us do odliczanej wartosci
    ;np dla 10 w r16 odliczy 10,5 us, dla 100 w r16 odliczy 100,5 us itd.
    delay_us:
    nop
    nop
    nop
    nop
    nop
    loop_d_us2:
    dec r16
    cpi r16,0
    breq end_delay_us
    rjmp delay_us
    end_delay_us:
    ret
    ;-------------------------------------------
    ;delay o czasie trwania "r16"ms
    ;ten delay tesz ma drobny błąd, jednak pomijalnie mały w stosunku do
    ;doliczanych wartosci
    delay_ms:
    ldi r17,10
    loop_d_ms:
    ldi r18,166
    loop_d_ms2:
    nop
    nop
    dec r18
    cpi r18,0 ;porównaj rejestr ze stałą
    brne loop_d_ms2 ;skocz jesli nierówne
    dec r17
    cpi r17,0
    brne loop_d_ms
    dec r16
    cpi r16,0
    brne delay_ms
    ret ;powrót z podprogramu

    Wpisanie 0 do r16 spowoduje odliczenie 256 us lub ms w zależnosci od
    podprogramu
REKLAMA