Fråga ang C kod

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Loopar och delayer är bra fortsättning att lära sig assembler. De kommandon du vill titta närmare på är inc, dec, breq och brneoch dessutom de register som används för beräkningar r0 - r31.

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.
Först stoppar vi in talet 16 (eller $10 hexadecimalt) i register 17 (r17).

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
exos
Inlägg: 194
Blev medlem: 24 november 2005, 21:04:25

Inlägg av exos »

Kanon... !!!
Skriv svar