Hardware Xor για ακίδες εξόδου σε Microcontrollers AVR

author
0 minutes, 31 seconds Read

Γνωρίζατε ότι πολλές μάρκες AVR έχουν έναν τύπο υλικού αποκλειστικής ή (XOR) επιλογή όταν αφορά τα επίπεδα λογικής των πείρων εξόδου; Αν κοιτάξετε στο δελτίο δεδομένων (η παραπάνω εικόνα είναι ένα στιγμιότυπο οθόνης από ένα φύλλο δεδομένων Attiny13) θα βρείτε μια ενότητα για την εναλλαγή του PIN. Αποδεικνύεται ότι εάν ορίσετε μια θύρα ως έξοδο, η λογική γραφής ενός στον αντίστοιχο μητρώο PIN θα αλλάξει τα επίπεδα λογικής αυτού. Αυτό είναι πραγματικά εύκολο να παραμεληθεί αν γράφετε στο C, αλλά εργάζομαι για να μάθω ένα κομμάτι της γλώσσας συναρμολόγησης και βρήκα ότι αυτό είναι πολύ χρήσιμο. Συνεχίστε να διαβάζετε μετά το διάλειμμα και θα σας πω πώς συνέβη σε αυτές τις πληροφορίες και τι είναι καλό για.

Τόσο πρώτα μακριά, ας μιλήσουμε για το γιατί αυτό δεν έχει σημασία πολύ αν γράφετε στον κώδικα C. Συνήθως, αν θέλετε να αλλάξετε κάποιες καρφίτσες εξόδου, απλά θα γράψετε ένα one-liner που Xor’s με ένα bitmask:

1
Portb ^ = 0xff;

Αυτό είναι ένα κομμάτι του C Shortand (μάθετε πολλά περισσότερα για αυτό από τη σειρά tutorial μου) που εκτελεί το Xor στα τρέχοντα επίπεδα εξόδου και γράφει το αποτέλεσμα πίσω στη θύρα. Αλλά το ίδιο πράγμα μπορεί να γίνει στο υλικό γράφοντας το bitmask στο μητρώο PINB:

1
PINB = 0xff;

Δεν ενδιαφέρεστε πραγματικά, επειδή είναι μόνο μία γραμμή κώδικα. Στην πραγματικότητα είναι πιθανότατα απλούστερο να xor το λιμάνι επειδή έχει πολύ πιο νόημα εννοιολογικά. Αλλά ο μεταγλωττιστής μπορεί να καταλήξει χρησιμοποιώντας πολύ περισσότερους κύκλους από ό, τι εάν είχατε γράψει στο μητρώο PIN.

Συνέβη σε αυτή τη λειτουργία, επειδή αναβοσβήσαμε μερικές λυχνίες LED ως έναν τρόπο να μάθουν τον συναρμολόγητή. Είχα αυτό το μπερδεμένο κώδικα σε μια ρουτίνα υπηρεσίας διακοπής:

1
2
3
4
ldi myreg, 0xff
Στο εσωτερικό, το portb
or intreg, myreg
Out Port, Intreg

Φορτεί ένα bitmask σε ένα μητρώο, φορτώνει στην τρέχουσα λογική από το PORT σε άλλο μητρώο, εκτελεί ένα Xor των δύο και γράφει το αποτέλεσμα πίσω στο PORTB. Αυτό διαρκεί τέσσερις κύκλους και απαιτεί δύο μητρώα. Η εναλλαγή των bits είναι μια τέτοια στοιχειώδη λειτουργία που ήμουν έκπληκτος Δεν υπήρχε μια εντολή στα bits xor απευθείας έτσι άρχισα να ψάχνω γύρω. I came across this short article over at AVR Freaks which clued me into the bit toggle feature. Τώρα ήμουν σε θέση να μειώσω τον κωδικό μου συναρμολόγησης ως εξής:

1
2
ldi intreg2, 0xff; teedarity χρήση intreg2 ως μάσκα δυαδικών ψηφίων
out PINB, intReg2   ;writing to PINB effectivley does an exclusive OR on PORTB

Αυτό έχει ως αποτέλεσμα την ίδια πράξη, αλλά διαρκεί μόνο δύο κύκλους και απαιτεί τη χρήση μόνο ενός μητρώου.

What I found many interesting is that no matter how much I use AVR chips, there ‘s never a shortage of surprises waiting to be found in the datasheet.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *