Enkelt exempel:
Kod: Markera allt
ldi r17,$10 ; Stoppa in hex $10, decimalt 16 i register r17
loop:
;Lägg in vad du vill göra i loopen här...
; nedanstående rader skall vara i slutet av loopen, de kollar om
; loopen är klar
dec r17 ; Minska r17 med "1"
brne loop ; Om föregående operation inte vart "0", hoppa till loop
; Resten av koden som skall köras efter loopen är klar.
Sedan minskar vi r17 med 1 (dec r17) dec står för "decrease" = minska. Det kommandot miskar alltid med 1.
Sedan kollar vi om föregående operation vart 0 med kommandot brne (brne = BRanch if Not Equal = Hoppa om inte lika). brne kollar hur senaste operation påverkade Z-flaggan i statusregistret, i detta fall dec instruktionen. Ifall dec r17 blir noll, så sätts Z-flaggan i statusregistret. Det är igentligen den som bneq instruktionen kollar. Ifall den inte är satt hoppar programmet till loop.
Det gäller alltså att inte lägga in massa instruktioner mellan dec och brne som kan påverka Z-flaggan.
Resultatet blir att loopen kommer att köras 16 ggr. När r17 kommit ner till 0 sätts alltså Z-flaggan och uttrycket brne blir falskt och hoppet till loop utförs inte, utan processorn fortsätter exekvera koden nedanför brne-instruktionen.
För att göra en delay funktion så måste du veta hur många ggr du skall loopa. Det får du räkna ut själv. Varje instruktion (dec, brne m.m.) tar en viss tid att exekvera. T.ex. för ATMega 8 tar en instruktion oftast en instruktionscykel. En instruktionscykel är en klockcykel på ATMega8 (iaf vi 4MHz har jag för mig), detta kan dock skilja på andra processorer, så du lär kolla det berömda databladet för just din processor. Om du som exempel kör på 4MHz klocka så tar alltså instruktionen dec r17 0,25 us (1 / 4 000 000). brne kommandot tar 2 cykler om det är "sant" och hoppet utförs, annars tar det 1 cykel. D.v.s 0,5 us om det är "sant" och 0,25 us om det är "falskt".
Hur många gånger måste du då köra genom loopen för att fördröja 50 us?
Du får räkna instruktioner och instruktionscykler. Och vart står det hur många instruktionscykler ett kommando tar?? Säg det nu högt efter mig: I databladet...
http://www.atmel.com/dyn/resources/prod ... oc0856.pdf
Mats