joi, 20 septembrie 2012

Sistemul de comenzi al microcontrollerului AVR

 
 Microcontrollerul AVR este un MCU tip RISC cu arhitectura Haward fapt ce permite execuţia a majorităţii operaţiilor într-un singur tact. Această performanţă se datoreaz faptului că sunt excluse cheltuielele de timp pentru transferul de date din memoria de program. Excepţii de la regula "execuţia intr-un singur tact" comenzi care operează cu date pe 16 biţi, salturi, transfer a controlului, etc.
    O comandă Assembler presupune o acţiune pe care o poate efectua un MC. Comanda deţine un nume şi operanzii de lucru, stîng şi drept. Există comenzi comenzi cu un singur operand sau fără nici un operand.

   Operandul stîng serveşte drept destinaţie a rezultatului operaţiei presupusă de comanda respectivă. În calitate de operand poate fi un registru de uz general (R), o constantă (k), oadresă a memoriei sau un registru periferic (P)
    Comanda ASM are urmatorul format:
<mnemonica> <operand stang>, <operand drept>
    • mnemonica - denumirea comenzii care este o prescurtare de la operaţia pe care o execută.
    • operand - adresa de aces la un resurs a Microcontrollerului sau o constantă pentru operaţiile cu constante.



    Limbajul ASM presupune că fiecare comandă este direct transferată în cod-maşină. Mnemonica comenzii este de fapt o reprezentare a codului maşina intr-o formă uşor înţeleasă de programator
    Pentru operaţiile de transfer operandul drept serveşte ca sursă, iar cel stâng ca destinaţie.
    Pentru cele de prelucrare aritmetică sau logică, de regulă se execută operaţia între operanzi, iar rezultatul este stocat in operandul stâng, numit operand destinaţie.
    Acesarea prin adrese a operanzilor este de cele mai dese ori incomodă, deaceea ele sunt înlocuite cu nume de constante ce indică adresa resursului pe care îl reprezintă. De exemplu pentru Regiştrii de uz General vom avea constanter cu nume R0, R1, R2... R31. Exemplu de regiştri periferici pot fi PORTA, PINA, DDRA, etc.
    De obicei aceste adrese sunt descrise în fişiere speciale care pot fi incluse cu directiva de preprocesare
    Aceste fişiere sunt puse la dispoziţie de către compania producător, sau de către producătorul de compilator sau mediu de dezvoltare a programelor.

        .include "<tip_mcu>def.inc"

        ex: .include "m16def.inc" - include constantele pentru resuresele microcontrollerului ATmega16


    Vom evidenţia mai multe moduri de adresare către resursele microcontrollerului:
  • Adresarea directă – presupune modificarea datelor direct în registru (COM), în cazul operaţiilor cu un singur operand(LDI,TST)
  • Adresare directă cu doi regiştri – presupune adresarea datelor ce se găsesc în doi regiştri concomotent.
  • Acces direct la memorie – situaţia cînd un operand este un registru, iar celălalt este o adresă la memorie (LDS, STS).
  • Acces direct la periferici – (IN, OUT)
  • Adresare indirectă către memorie – modul de adresare presupune situaţia cînd adresa se află în unul din regiştri x, y, şi z.
  • Accesul la memoria de date cu predecrementare
  • Adresare indirectă cu deplasare
  • Adresare directă la constantele din program
  • Acces indirect la memoria din program.
    Orice operaţie de transfer de date sau prelucrare a datelor presupune participarea a unui registru de uz general. În utilizarea Regiştrilor de uz general vom evidenţia anumite restricţii impuse de arhitectură.
  • R0 .. R15 - nu sunt disponibili pentru operaţiile cu constante
  • R1:R0 - întotdeauna servesc ca destinaţie a rezultatului a operaţiei MUL, indiferent de operanzi.
  • R26 .. R30 - formează 3 perechi de regiştri pentru comenzile ce presupun acces indirect la resursele Microcontrollerului
    • R27:R26 - X - XH:XL
    • R29:R28 - Y - YH:YL
    • R31:R30 - Z - ZH:ZL
   Microcontrollerul AVR posedă un set de 90-120 comenzi, care pot fi grupate în următoarele categorii:
  • Comenzi pentru operaţii logice;
  • Comenzi pentru operaţii aritmetice si de deplasare;
  • Comenzi pentru operaţii cu biţii;
  • Comenzi pentru operaţii de transfer de date;
  • Comenzi pentru operaţii de transfer de control; (salt)
  • Comenzi pentru operaţii de control al sistemului;
  • Operaţiile logice permit evaluarea operaţiilor logice de tip AND, OR XOR, etc. tot în acest grup intră şi comenzile de calcul a valorilor inverse cum ar fi NEG şi COM. Tot aici va intra comenzile de curăţare şi setare a regiştrilor şi de schimb a adoua tetrade intr-un registru de uz general. toate comenzile din acest set se vor executa intr-un sigur tact de execuţie.
  • Operaţiile aritmetice permit evaluarea operaţiilor de aritmetice bază  cum ar fi adunarea, scăderea, deplasare stânga şi dreapta, încementare şi decrementare. Toate operaţiile aritmetice se aplică doar la regiştrii de uz general. Evaluarea operaţiilor aritmetice este posibilă pentru operaţii cu valori cu semn şi fără. Toate comenzile din aces set se execută intr-un singur tact cu excepţia celor care operează cu date pe 16 biţi ( 2 baiti), care se vor executa în 2 tacturi maşină.
  • Operaţiile cu biţi permit executarea operaţiilor cu biţi pentru Regiştrii de Uz General şi Regiştrii Periferici, precum şi comenzi de modificare a registrului de stare SREG ca un subset suplimentar ceea ce se datorează faptului că lucrul cu aceşti biţi este des utilizat. De menţionat că operarea cu biţii pentru comenzile pentru Regiştrii de uz general şi cele cu perifericile este diferită. Pentru Periferice operandul drept va prezenta numărul bitului pentru modificare, iar pentru Regiştrii de uz general - masca. Toate comenzile din acest set se execută intr-un sigur tact.
  • Operaţiile de transfer permit transferul valorii de la operandul drept către operandul stâng. Operanzii vor conţine adrese ce se referă la memoria de Date. Aici vor intra Registrii de uz general, Regiştri Periferici şi memoria RAM. Operaţiile de transfer sunt posibile doar în anumite moduri, după cum urmează:
    • Registru Uz General <=> Registru Uz General
    • Registru Uz General <=> Registru Periferic
    • Registru Uz General <=> Memoria RAM
        Tot în acest set de comenzi intră şi comenzile de lucru cu stiva PUSH şi POP. Pentru execuţia acestor comenzi vor fi necesare de la 1 pana 3 tacturi de execuţie, în dependenţă de comandă.

  • Operaţiile de transfer de control permit realizarea salturilor conditionate şi necondiţionate. Tot în acest set intră şi comenzile pentru lucrul cu subrutinele de chemare a subrutinelor şi returnare din ele. Comenzile de salt conditionat vor fi de două tipuri salt la o adresa dacă se satisface condiţia şi salt condiţionat peste o comandă  numit şi comandă de ignorare a următoarei comenzi. tot în acest set vor intra şi comenzile de comparaţie a operanzilor ce va permite setarea biţilor din registrul de stare SREG, şi este utilizată ca o pre-comandă pentru salturile condiţionate.
  • Operaţiile de control al sistemului sunt 3 la număr:
    • NOP - Comanda nulă (1 tact)
    • SLEEP - transferă Microcontrollerul în regim de consum redus (4 tacturi)
    • WDR - resetasrea contorulul Watchdog (1 tact)
    În tabelul mai jos vor fi prezetate seturile de comenzi pentru Microcontrollerul seriei AVR Clasic. Comenzile vor fi grupate după tipul de operaţii pe care îl execută. Se va evidenţia mnemonica operaţiei, explicaţie scurtă despre funcţionalitate în varianta engleză şi română, parametrii, numărul de tacturi de execuţie şi flagurile pe care le afectează sau care se ia în consideraţie la evaluarea rezultatului.

Nota: Pentru o versiune mai completă, explicaţii în detaliu şi exemple de utilizare pentru fiecare comandă din setul de comenzi accesaţi site-ul producatorului :  http://www.atmel.com/images/doc0856.pdf



  • Comenzile aritmetice şi logice
NrComandaOperanziiDescriereaTraducereaOperaţiaFlags
1ADDRd, RrAdd without carryAdunarea aritmetică fără transportRd->Rd+RrZ,C,N,V,H
2ADCRd, RrAdd eith carryAdunare cu transportRd>Rd+Rr+CZ,C,N,V,H
3ADIWRd, kAdd immediate to workAdunarea constantei la un cuvîntRdh:Rdl Rdh:Rdl+KZ,C,N,V
4SUBRd, RrSubstract without carryScaderea fără transportRdRd-RrZ,C,N,V,H
5SUBIRd, kSubstract immediateDiferenţă cu o constantăRdRd-kZ,C,N,V,H
6SBCRd, RrSubstract with carryScădere cu transportRdRd-Rr-CZ,C,N,V,H
7SBCIRd, kSubstract immediate with carryDiferenţă cu constantă şi transportRdRd-K-CZ,C,N,V,H
8SBIWRd, kSubstract immediate from wordDiferenţa constantei de la cuvîntRdh:Rdl Rdh:Rdl-KZ,C,N,V
9ANDRd, RrLogical AndSI logicRdRd*RrZ,N,V
10ANDIRd, kLogical And with ImmediateSI Logic cu o constantăRdRd*kZ,N,V
11ORRd, RrLogical OrSAU logicRdRdRrZ,N,V
12ORIRd, kLogical Or with ImmediateSAU logic cu constantăRdRdkZ,N,V
13EORRd, RrExclusive ORSAU exclusivRdRdRrZ,N,V
14COMRdOne’s complementComplement faţă de 1Rd$FF-RdZ,C,N,V
15NEGRdTwo’s complementNegarea complementului binarRd$00-RdZ,C,N,V,H
16SBRRd, kSet Bits in RegisterSetarea bitului K în registruRdRdkZ,N,V
17CBRRd, kClear Bits in RegisterŞtergerea bitului K în registruRdRd*($FF-k)Z,N,V
18INCRdIncrementIncrementareaRdRd+1Z,N,V
19DECRdDecrementDecrementareaRdRd-1Z,N,V
20TSTRdTest for zero or minusTestarea la 0 sau la „-”RdRd*RrZ,N,V
21CLRRdClear RegisterCurăţirea registruluiRdRdRrZ,N,V
22SERRdSet all bits in registerSetarea biţilor în registruRd$FFNone
  • 3. Comenzi pe biti
Nr Comanda Operanzi Descrierea Traducerea Operaţia Flags
1 LSL Rd Logical Shift Left Shiftare logică la stinga Rd(n+1)Rd(n), Rd(0) 0 CRd(7) Z,C,N,V,H
2 LSR Rd Logical Shift Righ Shiftare Logică la dreapta
Rd(n)Rd(n+1), Rd(7) 0,
CRd(0)
Z,C,N,V
3 ROL

Rotate left trough carry Rotare la stinga peste bitul de transport
Rd(0)C,
Rd(n+1) Rd, CRd(7)
Z,C,N,V,H
4 ROR Rd Rotate right trough carry Rotare la dreapta peste bitul de transport
CRd(7)
Rd(n+1) Rd,
C Rd(0)
Z,C,N,V
5 ASR Rd Arithmetic Shift Right Shiftare logică la dreapta
Rd(n) Rd(n+1)
n=0..6
Z,C,N,V
6 SWAP Rd Swap Nibbles Inversarea jumătăţilor Rd(0..3) Rd(4..7) None
7 BSET s Flag Set Setarea flagului SREG(s) 1 SREG(s)
8 BCLR s Flag Cleared Ştergerea flagului SREG(s) 0 SREG(s)
9 SBI P, b Set bit to I/O Setarea bitului în registrul I/O I/O (P,b) 1 None
10 CBI P,b Clear bit in I/O Register Ştergerea bitului din registru I/O I/O (P,b) 0 None
11 BST Rd, b Bit Store from Register to T Stocarea bitului din registru în flagul T

Rd(b)

T
12 BLD Rd, b Bit load from T to Register Încărcarea flagului T in bitul registrului Rd(b) T None
13 SEC

Set carry Flag Setarea transportul flagului C1 C
14 CLC

Clear carry flag Stergerea transportul flagului C0 C
15 SEN

Set negative flag Setarea flagului negativ N1 N
16 CLN

Cleared Negative flag Ştergerea flagului negativ N0 N
17 SEZ

Set zero flag Setarea flagului 0 Z1 Z
18 CLZ

Clear zero flag Ştergerea flagului 0 Z0 Z
19 SEI

Set global Interrupt flag Setarea flagului intreruperii globale I1 I
20 CLI

Clear global interrupt flag Ştergerea flagului intreruperii globale I0 I
21 SES

Set Signed Flag Setarea flagului de semn
S1
S
22 CLS

Clear Signed Flag Ştergerea flagului de semn S0 S
23 SEV

Set overflow flag Setarea flagului fluxului de date V1 V
24 CLV

Clear overflow Stergerea flagului fluxului de date V0 V
25 SET

Set T flag Setarea flagului T T1 T
26 CLT

Clear T flag Stergerea flagului T T0 T
27 SEH

Set half carry flag Setarea flagului a jumătăţii bitului de transport H1 H
28 CLH

Clear half carry flag Ştergerea flagului a jumăţăţii bitului de transport H0 H







  • Comenzile de transfer
NrComandaOperanziDescriereaTraducereaOperaţiaFlags
1ELPM

Extend Load Program MemoryExtinderea încărcării memoriei de programRo=(Z+ELPM)None
2MOVRd, RrCopy RegisterCopierea registruluiRdRrNone
3LDIRd, KLoad ImmediateIncărcarea constanteiRdKNone
4LDSRd, XLoad direct from RAMÎncarcă din RAMRd(k)None
4LDRd, xLoad directÎncărcare directăRd(x)None
5LDRd, x+Load indirect and post incrementÎncarcare indirectă apoi post incrementare
Rd(x)
x x+1
None
6LDRd, -xLoad Indirect and pre decrementÎncărcare indirectă apoi pre decrementare
Rd(x)
x x-1
None
7LDRd, YLoad IndirectÎncărcare indirectăRd(Y)None
8LDRd, Y+Load Indirect and post incrementÎncărcare indirectă apoi post incrementare
Rd(Y)
Y Y+1
None
9LDRd, -YLoad Indirect and pre decrementÎncărcare indirectă apoi pre decrementare
Rd(Y)
YY-1
None
10LDDRd, Y+qLoad indirect with displacementÎncarcare indirectă cu deplasamentRd(Y+q)None
11LDRd, ZLoad indirectÎncarcă indirectRd(Z)None
12LDRd, Z+Load indirect and post incrementÎncarcă indirect apoi post incrementare
Rd(Z)
ZZ+1
None
13LDRd, -ZLoad indirect and pre decrementÎncarcă indirect apoi pre decrementare
Rd(Z)
ZZ-1
None
14LDDRd, Z+qLoad indirect with deplacementIncarcă indirect cu deplasamentRd(Z+q)None
15STSk, RrStore Direct to RAMStochează direct in RAM(k) RrNone
16STX, RrStore IndiretStochează indirect(X) RrNone
17    STX+, RrStore Indirect and post incrementStocează indirect apoi post incrementare
Rr(X)
X X+1
None
18STX-, RrStore Indirect and pre decrementStochează indirect apoi pre decrementează
Rr(X)
XX-1
None
19STDX+q, RrStore indirect with deplacementStocează indirect cu deplasamentRr(X+q)None
20STY, RrStore indirectStochează indirect(Y) RrNone
21STY+, RrStore indirect and post incrementStocheză indirect si post incrementează
Rd(Y)
Y Y+1
None
22STY-, RrStore indirect and pre decrementStochează indirect şi pre decrementează
Rd(Y)
YY-1
None
23STRd, Y+qStore indirect with displacementStochează indirectă cu deplasamentRd(Y+q)None
24STRd, ZStore IndiretStochează indirectRd(Z)None
25STRd, Z+Store indirect and post incrementStochează indirect apoi pre decrementare
Rd(Z)
ZZ+1
None
26STZ-, RrStore indirect and pre decrementStochează indirect apoi pre decrementează
Rd(Z)
ZZ-1
None
27STRd, Z+qStore indirect with deplacementStocează indirect cu deplasamentRr(Z+q)None
28LPM

Load program memoryÎncărcarea memoriei de programR0(Z)None
29INRd, PLoad on I/O Port to RegisterÎncarcă datele din portul I/O în registruRdPNone
30OUTP, PrStore Register to I/O portStochează datele din registru în Portul I/OPRdNone
31PUSHRrPush Register on StackPune registrul în stivăSTACKRdNone
32POPRdPop Register from StackScoate registrul din stivăRdSTACKNone

    • Comenzile de transfer a controlului executiei
    NrComandaOperanziiDescriereaTraducereaOperaţiaFlags





    23CPRd, RkCompareComparareRd-RkZ,C,N,V,H
    24CPCRd, RkCompare with carryCompară cu bitul de transportRd-Rk-CZ,C,N,V,H
    25CPIRd, kCompare with ImmediateCompară cu o constantăRd-KZ,C,N,V,H
    26RJMPkRelative JumpSalt relativ la kPCPC+K+1None
    27IJMPkIndirect JumpSalt indirect la kPCZNone
    28JUMPkJumpSalt necondiţionatPC KNone
    29RCALLkRelative CallSalt relativ la subrutinăPCPC+K+1None
    30ICALLkIndirect CallSalt indirect la subrutinăPCZNone
    31CALLkCallApelare rutinăPC KNone
    32RETkReturn from subrutineReturnare din subrutinăPCstackNone
    33RETIkReturn from IntrerruptReturnare din întreruperePCstackI
    34CPSERd, RkCompare skip if equalCompară skip daca e egalIf Rd=Rk then PCPC+2 (or 3)None
    35SBRCRr, bSkip if Bit in Register is ClearSare dacă bitul din registru este 0If Rr (b)=0 then PCPC    + 2 (or 3)None
    36SBRSRr, bSkip if Bit in Register is SetSare dacă bitul din registru este setatIf Rr (b)=1 then PCPC    + 2 (or 3)None
    37SBICP,bSkip if Bit I/O is clearSare dacă bitul din registrul I/O este ştersIf I/O (P,b)=0 then PCPC    + 2 (or 3)None
    38SBISP, bSkip if Bit I/O is setSare dacă bitul din registrul I/O este setatIf I/O (P,b)=1 then PCPC    + 2 (or 3)None
    39BRBSs, kBranch If Bit in SREG is SetSare dacă bitul din registrul SREG este setat
    If SREG=1 then
    PCPC+k+1
    None
    40BRBCs, kBranch If Bit in SREG in ClearedSare dacă bitul din registrul SREG este şters
    If SREG=0 then
    PCPC+k+1
    None
    41BREQkBranch if EqualSalt la egalitateIf Rd=Rr(z=1) then PCPC+k+1None
    42BRNEkBranch if Not EqualSalt dacă nu este egalitateIf RdRr(z=0) then PCPC+k+1None
    44BRCSkBranch if carry setSare dacă transportul este setat
    If C=1 then
    PCPC+k+1
    None
    45BRCCkBranch if carry cleardSare dacă transportul este şters
    If C=0 then
    PCPC+k+1
    None
    46BRSHkBranch if Same or HigherSare dacă este egal sau mai mare
    If RdRr(C=0)    then
    PCPC+k+1
    None
    47BRLOkBranch if LowerSare dacă este mai mic
    If Rd<Rr(C=1)    then
    PCPC+k+1
    None
    48BRMIkBranch if MinusSare dacă este minus
    If N=1 then
    PCPC+k+1
    None
    49BRPLkBranch if PlusSare dacă este +
    If N=0 then
    PCPC+k+1
    None
    50BRGEkBranch if Greater or EqualSare dacă este mai mare sau egal cu bitul transportuluiF RdRr (NV=0)then PCPC+k+1None
    51BRLTkBranch if Less then (Signed)Sare dacă este mai mic decât , (cu semn)F Rd<Rr (N1=0)then PCPC+k+1None
    52BRHSkBranch if Half Carry flag is setSare dacă jumătate din constanta flagului este setată
    If H=1 then
    PCPC+k+1
    None
    53BRHCkBranch is Half Carry flag is clearedSare dacă jumătate dn constanta flagului este ştears
    If H=0 then
    PCPC+k+1
    None
    54BRTSkBranch if T flag is setSare dacă flagul T este setat
    If T=1 then
    PCPC+k+1
    None
    55BRTCkBranch if T flag is clearedSare dacă flagul T este şters
    If T=0 then
    PCPC+k+1
    None
    55BRVSkBranch if Overflow is setSare dacă fluxul de date este setat
    If V=1 then
    PCPC+k+1
    None
    56BRVCkBrach if Overflow is clearedSare dacă fluxul de date este şters
    If V=0 then
    PCPC+k+1
    None
    57BRIEkBranch if Intrerrupt is setSare dacă întreruperea este setată
    If I=1 then
    PCPC+k+1
    None
    58BRICkBranch if Intrerrupt is clearedSare dacă întreruperea este ştearsă
    If V=0 then
    PCPC+k+1
    None

      • 4. Comenzi de control al sistemului

      29 NOP

      No operation Nici o operaţie

      None
      30 SLEEP

      Sleep Regimul adormire

      None
      31 WDR

      Wathdog Reset Setare regimului wathdog

      None