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

[Atmega16][ASM]Pętla opóźniająca

finch 27 Wrz 2008 15:59 3576 3
REKLAMA
  • #1 5576480
    finch
    Poziom 20  
    Witam

    Mam taki oto kod realizujący opóźnienie:

    
    
    wait_us:
       push R17
       push R18
    
       mov R18, R16
       ldi R17, sys_freq
    
    wait_us_0:
       mov R16, R18
    
    wait_us_1:
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       dec R16
       brne wait_us_1
    
       dec R17
       brne wait_us_0
    
       pop R18
       pop R17
    
      ret
    
    



    Przy czym do R16 ładuje się wartość opóźnienia w mikro sekundach, natomiast "sys_freq" jest to wartość kwarcu w MHz.
    I powiedzcie mi jakim cudem przy kwarcu 1 Mega załadowanej wartości 0 do R16 opóźnienie na końcu wyjdzie 2560 us??

    Przecież:
    -kwarc 1MHz ma okres 1us czyli jak rozumiem jeden takt jest równy jednej mikro sekundzie
    -instrukcje(ilość taktów zegara na wykonanie):
    - call 4 takty
    - push 1 takt
    - mov 1 takt
    - ldi 1 takt
    - nop 1 takt
    - dec 1 takt
    - brne 1 lub 2 takty (zalżene prawda czy fałsz)
    - pop 1 takt
    - ret 4 takty

    Czyli przy wartoścach R16=0 i sys_freq=1 daje to około 40us a nie 2560, chyba że źle rozumię to proszę o sprostowanie, z góry dziękuję.

    Poprawiłem tytuł.
    [zumek]
  • REKLAMA
  • Pomocny post
    #2 5576524
    shg
    Poziom 35  
    Ja nie wiem, jakim cudem wyszło Ci 40us.
    Jeden obieg wewnętrznej pętli (wait_us_1) wykonuje się w 10 cyklach. Wartość w R16 jest nie w mikrosekundach a w dziesiątkach mikrosekund.
    Pętla wykona się w czasie:
    255 * 10 (255 obiegów wewnętrznej pętli, każdy po 10 cykli)
    +1 * 9(ostatni obieg wewnętrznej pętli - bez skoku)
    +17 cykli na resztę
    razem: 2576 cykli i tyle samo us.
    Instrukcje Push i pop wykonują się w dwóch taktach.

    dec R16, gdy w R16 będzie zero spowoduje że wartość rejestru się "przekręci" (underflow) i będzie w nim 255 po tej operacji, w związku z czym skok brne zostanie wykonany.
  • REKLAMA
  • #3 5576578
    finch
    Poziom 20  
    faktycznie zapomniałem o tym że istnieje coś takiego jak "underflow" moja wina, dziękuję za pomoc.
    Powiedz mi jeszcze jakbyś mógł czy w wyświetlaczach LCD znaki kodowane są kodem ASCII czy w jakiś inny sposób.
  • #4 5576607
    shg
    Poziom 35  
    Znaki do kodu 127 są w ASCII, za wyjątkiem znaków specjalnych (kody 0 - 31), pierwsze 8 jest definiowalne przez użytkownika, pozostałe w zależności od zestawu znaków w kontrolerze, albo są niezgodne ze standardem ASCII (ale bardzo przydatne), albo ich nie ma (częściej).
    Znaki o kodach >= 128 są różne w zależności od kontrolera, najczęściej japońskie... Poza tym zdarzają się LCD z cyrylicą i kilkoma skryptami zachodnimi i jeszcze na innym, kompatybilnym kontrolerze (EPSON) są nawet z polskimi znakami.
    www.esiee.fr/~perrotol/LCD-HD44780.pdf
    Strona 17 i 18.
REKLAMA