3. AVR status register

Όπως όλοι οι άλλοι μικροελεγκτές, έτσι και ο AVR έχει ένα καταχωρητή κατάστασης (stature register) που στην ουσία είναι μια ομάδα 8-bits που λειτουργούν σαν σημαίες. Ο καταχωρητής κατάστασης του AVR αποτελείται από ένα σύνολο σημαιών για το χειρισμό αριθμητικών συνθηκών, όπως το carry bit. Σε αυτή την ενότητα θα αναφερθούμε στα bits αυτού του καταχωρητή και θα δώσουμε διάφορα παραδείγματα.

Παρακάτω ακολουθεί μια σύντομη εξήγηση των flag bits του καταχωρητή κατάστασης:

C, the carry flag Αυτή η σημαία τίθεται σε 1 όταν υπάρχει κρατούμενο από το D7. Αυτό το bit επηρεάζεται μετά από μια 8-bit πρόσθεση ή αφαίρεση.

Ζ the zero flag H zero flag επιρεάζεται από το αποτέλεσμα μιας αριθμητικής ή λογικής πράξης. Αν το αποτέλεσμα της πράξης είναι μηδέν, τότε Ζ = 1, αλλιώς Ζ = 0 αν το αποτέλεσμα είναι διαφορετικό από 0.

Ν the negative flag Η δυαδική αναπαράσταση των προσημασμένων αριθμών χρησιμοποιεί το bit D7 σαν bit προσήμου. Η negative flag επιρεάζεται από το αποτέλεσμα μιας αριθμητικής πράξης. Εάν το D7 bit του αποτελέσματος μιας πράξης είναι «μηδέν» τότε Ν=0 και το αποτέλεσμα της πράξης είναι θετικός αριθμός. Εάν το D7 bit είναι «ένα» τότε Ν=1 και το αποτέλεσμα είναι αρνητικός αριθμός. Οι σημαίες Ν και V χρησιμοποιούνται για προσημασμένες αριθμητικές πράξεις.

V the overflow flag Αυτή η σημαία τίθεται σε 1 όταν το αποτέλεσμα μιας αριθμητικής πράξης με προσημασμένους αριθμούς έχει μεγάλη τιμή προκαλώντας το σημαντικό bit να υπερχειλίσει στο bit προσήμου. Γενικά η carry flag C χρησιμοποιείται για την ανίχνευση λαθών σε αριθμητικές πράξεις με μη προσημασμένους αριθμούς, ενώ η overflow V χρησιμοποιείται για την ανίχνευση λαθών σε αριθμητικές πράξεις με προσημασμένους αριθμούς.

S the Sign bit Αυτή η σημαία είναι το αποτέλεσμα του αποκλειστικού Η των Ν και V σημαιών.

Η Half carry flag Εάν υπάρχει κρατούμενο από το D3 στο D4 κατά την διάρκεια μιας ADD ή SUB πράξης αυτό το bit τίθεται σε 1 αλλιώς τίθεται σε 0. Η σημαία Η χρησιμοποιείται από πράξεις μεταξύ BCD δεδομένων.

Επίδραση της εντολής ADD στα bits του status register

Τώρα θα εξετάσουμε την επίδραση της εντολής ADD στα flag bits C, H και Ζ του καταχωρητή κατάστασης. Μερικά παραδείγματα επεξηγούν περισσότερο την λειτουργία των flag bits. Αν και τα υπόλοιπα bits V, S και N του καταχωρητή κατάστασης επηρεάζονται από την εντολή ADD, όμως για την ώρα θα επικεντρωθούμε στις σημαίες C, H και Ζ. Οι άλλες σημαίες εξετάζονται σε επόμενη ενότητα διότι λειτουργούν σε αριθμητικές πράξεις με προσημασμένους αριθμούς.

Παράδειγμα 1:  

Βρείτε την κατάσταση των σημαιών C, H και Ζ μετά την πρόσθεση των 0x38 και 0x2F στις επόμενες εντολές:
LDI  R16,  0x38
LDI  R17,  0x2F
ADD   R16,  R17    ;   add  R17  to  R16

Λύση
 $38         0011 1000
+$2F         0010 1111
----         ---------
$67          0110 0111         R16 = 0x67

C=0   διότι δεν υπάρχει κρατούμενο πέρα από το D7 bit
H = 1 διότι υπάρχει κρατούμενο από το D3 στο D4 bit
Z = 0  διότι το R16 (το αποτέλεσμα) έχει μη μηδενική τιμή μετά την πρόσθεση.

Παράδειγμα 2:  

Βρείτε την κατάσταση των σημαιών C, H και Ζ μετά την πρόσθεση των 0x9C και 0x64 στις επόμενες εντολές:
LDI  R20,  0x9C
LDI  R21,  0x64
ADD   R20,  R21    ;   add  R21  to  R20

Λύση
 $9C             1001 1100
+$64             0110 0100
----             ---------
$100             0000 0000        R20 = 00

C = 1  διότι υπάρχει κρατούμενο πέρα από το D7 bit
H = 1 διότι υπάρχει κρατούμενο από το D3 στο D4 bit
Z = 1  διότι το R16 (το αποτέλεσμα) έχει μηδενική τιμή μετά την πρόσθεση.

Παράδειγμα 3:

 Βρείτε την κατάσταση των σημαιών C, H και Ζ μετά την πρόσθεση των 0x88 και 0x93 στις επόμενες εντολές:
LDI  R20,  0x88
LDI  R21,  0x93
ADD   R20,  R21    ;   add  R21  to  R20

Λύση
 $88             1000 1000
+$93             1001 0011
----             ---------
$11B             0001 1011                 R20 = 0x1Β

C = 1  διότι υπάρχει κρατούμενο πέρα από το D7 bit
H = 0 διότι δεν υπάρχει κρατούμενο από το D3 στο D4 bit
Z = 0  διότι το R16 (το αποτέλεσμα) έχει μη μηδενική τιμή μετά την πρόσθεση

Δεν επηρεάζουν οι εντολές όλες τις σημαίες

Μερικές εντολές επηρεάζουν και τα έξι flag bits του status register και συγκεκριμένα τις C, H, Z, S, V και N (π.χ. ADD). Όμως υπάρχουν εντολές που δεν επηρεάζουν όλα τα flag bits. Οι εντολές φόρτωσης ανήκουν σε αυτή την κατηγορία. Επίσης και οι λογικές εντολές δεν επηρεάζουν όλες τις σημαίες του καταχωρητή κατάστασης.

Τύποι σταθερών

O AVR assembler δέχεται αριθμούς εκφρασμένους σε τύπους όπως σε δυαδική, δεκαδική ή δεκαεξαδική μορφή.

1] Δυαδικοί αριθμοί: Για να χειριστούμε δυαδικούς αριθμούς στον κώδικα μας πρέπει να τοποθετήσουμε τους χαρακτήρες 0b ή 0Β μπροστά από τον δυαδικό αριθμό. Π.χ

LDI R16, 0b10001011  ; φορτώνει την δυαδική τιμή 0b10001011 στον καταχωρητή R16

2] Δεκαδικοί αριθμοί: Για να ορίσουμε ένα δεκαδικό αριθμό τον χρησιμοποιούμε όπως έχει. Π.χ

LDI R17, 24  ; φορτώνει τον δεκαδικό αριθμό 24 στον καταχωρητή R17

3] Δεκαεξαδικοί αριθμοί: Για να ορίσουμε δεκαεξαδικούς αριθμούς τοποθετούμε το 0x ή $ μπροστά από τον δεκαεξαδικό αριθμό

LDI R16, 0x77 ; φορτώνει τον δεκαξαδικό αριθμό 0x77 στον καταχωρητή R16
LDI R17, $88  ; φορτώνει την δεκαεξαδική τιμή $88 στον καταχωρητή R17

4] ASCII χαρακτήρες Για να αναπαραστήσουμε ASCII δεδομένα στον AVR assembler απλά χρησιμοποιούμε μονά εισαγωγικά στον χαρακτήρα. Π.χ

LDI R20, ‘9’   ;  R20 = 0x39 which is hex number for ASCII ‘9’