Άσκηση 2 η : Εισαγωγή στο eζ430-f2013 με χρήση του IAR Embedded Workbench, ενός αναπτυξιακού περιβάλλοντος για τα MSP430

Σχετικά έγγραφα
Σελ. Θεωρία : Θεωρητική εισαγωγή στους µικροελεγκτές MSP430. Τίτλος

ΜΕΡΟΣ 1. Διακοπές (Interrupts)

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα

Μαθαίνοντας το hardware του αναπτυξιακού

Καθολική Σειριακή Διεπιφάνεια (Universal Serial Interface)

Κεφάλαιο 3 Αρχιτεκτονική Ηλεκτρονικού Τμήματος (hardware) των Υπολογιστικών Συστημάτων ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

Προγραμματισμός σε C και προγραμματισμός Μακροεντολών με τον ΕΖ430

Έλεγχος με Μικροϋπολογιστές Εργαστήριο ενσωματωμένων συστημάτων

WDT και Power Up timer

ΒΑΣΙΚΕΣ ΠΛΗΡΟΦΟΡΙΕΣ. Τίτλος Μαθήματος. Διαλέξεις - Θεωρητική Διδασκαλία, Εποπτευόμενο Εργαστήριο Επίδειξη, Μελέτες (Projects)

ΠΕΡΙΕΧΟΜΕΝΑ ΚΕΦΑΛΑΙΟ I: ΕΙΣΑΓΩΓΗ ΣΤΑ ΗΛΕΚΤΡΟΝΙΚΑ

Μικροεπεξεργαστές. Σημειώσεις Μαθήματος Υπεύθυνος: Δρ Άρης Παπακώστας,

ΔΙΑΧΥΤΑ ΚΑΙ ΕΝΣΩΜΑΤΩΜΕΝΑ ΣΥΣΤΗΜΑΤΑ

10. Πληκτρολόγιο matrix 4x4

Embedded Systems Laboratory LAB 06 CLKS-a

ΕΙΣΑΓΩΓΗ. Αρχιτεκτονική Η/Υ ΗΜΟΣ ΜΠΟΛΑΝΑΚΗΣ

ΕΡΓΑΣΤΗΡΙΟ 4 ΕΙΣΑΓΩΓΗ ΣΤΟN ARDUINO: ΨΗΦΙΑΚΗ ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ

Μηχανοτρονική. Τμήμα Μηχανικών Παραγωγής και Διοίκησης 7 ο Εξάμηνο,

ΕΡΓΑΣΤΗΡΙΟ ΜΙΚΡΟΕΛΕΓΚΤΩΝ

ΑΣΚΗΣΗ 1 (22 Νοεμβρίου 2017)

ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ

Κεφάλαιο 4 Σύνδεση Μικροεπεξεργαστών και Μικροελεγκτών ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

12. Διακοπές Interrupts (IRQ)

Αρχιτεκτονική υπολογιστών

Ενσωµατωµένα Υπολογιστικά Συστήµατα (Embedded Computer Systems)

Ι ΑΣΚΩΝ ΚΑΘΗΓΗΤΗΣ: ΚΑΘΗΓΗΤΗΣ ΕΦΑΡΜΟΓΩΝ. ΤΕΙ ΥΤΙΚΗΣ ΜΑΚΕ ΟΝΙΑΣ

Ενσωµατωµένα Συστήµατα

Μέτρηση Θερμοκρασίας με τον αισθητήρα TMP36. Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων. Βασική δομή ενός προγράμματος στο LabVIEW.

1. Περιβάλλον εργασίας παραδείγματα σύνταξης

Συστήματα Μικροεπεξεργαστών

Στοιχεία αρχιτεκτονικής μικροεπεξεργαστή

Είναι το πρωτόκολλο RS232 που χρησιμοποιείται στις σειριακές θύρες COM με τη διαφορά ότι εκτελείται σε επίπεδο τάσεων TTL. 2

10. Πληκτρολόγιο matrix 4x4

Εργαστηριακή Άσκηση 4: Ιεραρχική σχεδίαση και προσχεδιασμένοι πυρήνες

2. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΤΩΝ ΘΥΡΩΝ ΕΙΣΟ ΟΥ/ΕΞΟ ΟΥ ΤΟΥ PIC16F877-ΑΡΙΘΜΗΤΙΚΕΣ ΕΝΤΟΛΕΣ

Ενσωματωμένα Συστήματα

Έλεγχος με Μικροϋπολογιστές Εργαστήριο ενσωματωμένων συστημάτων

ΠΕΡΙΕΧΟΜΕΝΑ ΕΙΣΑΓΩΓΗ... 11

Εφαρμογές Σειριακής Επικοινωνίας

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 2 USB και Σειριακή Επικοι- νωνία Σ Σειριακή Επικοινωνία

ΑΣΚΗΣΗ 2 (29 Νοεμβρίου 2016)

ΑΝΑLOG TO DIGITAL CONVERTER (ADC)

Γενική οργάνωση υπολογιστή «ΑΒΑΚΑ»

Έλεγχος με Μικροϋπολογιστές Εργαστήριο ενσωματωμένων συστημάτων

Σελίδα 1 από 11. Απαντήσεις στο φυλλάδιο 57 Ερώτηση: 1 η : Οι ακροδέκτες αυτοί χρησιµοποιούνται για:

ε. Ένα κύκλωμα το οποίο παράγει τετραγωνικούς παλμούς και απαιτείται εξωτερική διέγερση ονομάζεται ασταθής πολυδονητής Λ

Ερωτήσεις θεωρίας MY. Μέρος Α. Υλικό.

«ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΕΣ» ΕΣΩΤΕΡΙΚΗ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΕΣ

ΡΟΜΠΟΤΙΚΗ ΜΕ ARDUINO - ARDUINO ΚΑΙ ΗΧΟΣ I. Δημιουργός: Δρ.Αθανάσιος Μπαλαφούτης Επιβλέπων: Πετεινάτος Ηλίας Υποψήφιος Διδάκτωρ

Προγραμματισμο ς σε Arduino

ΕΦΑΡΜΟΓΕΣ ΤΗΛΕΠIΚΟΙΝΩΝΙΑΚΩΝ ΔΙΑΤΑΞΕΩΝ

Εγκατάσταση του Arduino IDE

Οδηγώντας μια οθόνη υγρών κρυστάλλων Liquid Crystal Display

Εφαρμογές μικροελεγκτών

Προηγμένοι Μικροεπεξεργαστές. Φροντιστήριο 4 Real Mode Interrupts

ΡΟΜΠΟΤΙΚΗ. ΕΡΓΑΣΙΑ ΠΑΝΩ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΝΧΤ ΚΑΙ ΤΑ ΠΡΩΤΟΚΟΛΛΑ ΕΠΙΚΟΙΝΩΝΙΑΣ BLUETOOTH, I2C και serial communication

Ι ΑΣΚΩΝ ΚΑΘΗΓΗΤΗΣ: ΚΑΘΗΓΗΤΗΣ ΕΦΑΡΜΟΓΩΝ ΠΑΡΑΡΤΗΜΑ ΚΑΣΤΟΡΙΑΣ ΤΕΙ ΥΤΙΚΗΣ ΜΑΚΕ ΟΝΙΑΣ

Μάθημα 8: Επικοινωνία Συσκευών με τον Επεξεργαστή

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΠΕΡΙΓΡΑΦΗ ΥΛΙΚΟΥ AVR 1. ΕΙΣΑΓΩΓΗ 1.1 ΓΕΝΙΚΗ ΔΟΜΗ 1.2 ΟΙΚΟΓΕΝΕΙΕΣ 1.3 ΤΥΠΟΙ 1.4 ΕΡΓΑΛΕΙΑ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Σχεδίαση Ψηφιακών Συστημάτων. Ενότητα: ΚΑΤΑΧΩΡΗΤΕΣ - ΑΠΑΡΙΘΜΗΤΕΣ

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 1. Arduino + LabVIEW: Μέτρηση Έντασης Φωτός με Φωτοαντίσταση. Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων

MIPS Interactive Learning Environment. MILE Simulator. Version 1.0. User's Manual

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ

Αντιγραφή με χρήση της γυάλινης επιφάνειας σάρωσης

Βασικές Έννοιες της Πληροφορικής

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

Κεντρική Μονάδα Επεξεργασίας (ΚΜΕ) Τμήματα ΚΜΕ (CPU) Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (Ι)

για τις ρυθμίσεις LabView μέσα από το κανάλι και του καλωδίου USB.

Πλακέτα Arduino. 1ο ΕΠΑΛ Περάματος - 7ο ΕΚ Πειραιά

ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων

OGO! - Ενσωματωμένες λειτουργίες που «μετράνε»! Αυτοματισμοί εύκολα, γρήγορα & οικονομικά

Οργάνωση Υπολογιστών (Ι)

Εργαστηριακές ασκήσεις λογικών κυκλωμάτων 11 A/D-D/A

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

Electronics μαζί με τα συνοδευτικά καλώδια και το αισθητήριο θερμοκρασίας LM335 που περιέχονται

Δομημένος Προγραμματισμός

Οργάνωση Υπολογιστών (IΙI)

Συστήματα Αυτομάτου Ελέγχου

ΕΡΓΑΣΤΗΡΙΟ 6 ΟΔΗΓΗΣΗ ΑΠΕΙΚΟΝΙΣΕΩΝ SSD ΚΑΙ LCD

Μικροεπεξεργαστές. Σημειώσεις Μαθήματος Υπεύθυνος: Δρ Άρης Παπακώστας,

ΔΙΑΧΥΤΑ ΚΑΙ ΕΝΣΩΜΑΤΩΜΕΝΑ ΣΥΣΤΗΜΑΤΑ

ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΚΑΙ ΠΟΛΙΤΙΣΜΟΥ ΔΙΕΥΘΥΝΣΗ ΑΝΩΤΕΡΗΣ ΚΑΙ ΑΝΩΤΑΤΗΣ ΕΚΠΑΙΔΕΥΣΗΣ ΥΠΗΡΕΣΙΑ ΕΞΕΤΑΣΕΩΝ ΠΑΓΚΥΠΡΙΕΣ ΕΞΕΤΑΣΕΙΣ 2014

Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

ΜΑΘΗΜΑ: ΜΙΚΡΟΕΛΕΓΚΤΕΣ

ΕΙΔΙΚΟΤΗΤΑ: ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Εργαστήριο Δομής και Λειτουργίας Μικροϋπολογιστών. Βοήθημα εκτέλεσης εργαστηριακής άσκησης 5: Εξωτερικές διακοπές του 8051

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Εφαρμογές Arduino Σεμινάριο Ηλεκτρονικού Τομέα

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM).

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 5. Ρυθμίζοντας τη Φορά Περιστροφής. Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων

ΠΕΡΙΕΧΟΜΕΝΑ 1. Υπορουτίνες Μαθηµατικών Πράξεων 1.1. Προσηµασµένοι και απροσήµαστοι αριθµοί 1.2. Μετατροπές προσηµασµένων και απροσήµαστων αριθµών

Αρχιτεκτονική Υπολογιστών

Τ.Ε.Ι. ΚΡΗΤΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΙΑΣ. Ασκήσεις 1-2 Εισαγωγή

Σκοπός. Προγραμματίζοντας τον Arduino ΙΙ Εντολή Εκχώρησης & Εντολές. Συλλογή & Επεξεργασία Δεδομένων. Πρόγραμμα. Εντολές Επεξεργασίας Δεδομένων

8051 Interrupt Ports. Name Alternate Function

Οδηγίες προγραμματισμού MOTORLINE EVO 60 & 100 Μηχανισμός για γκαραζόπορτες οροφής

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Παραδείγματα Assembly (Μέρος

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Transcript:

Περιεχόμενα Τίτλος...... Άσκηση 1 η : Εισαγωγή στην οικογένεια μικροελεγκτών MSP430F20xx 3 Αρχιτεκτονική MSP430..................................... 4 Καταχωρητές................................................. 5 Διευθυνσιοδότηση........................................... 6 Μνήμη......................................................... 8 Τρόποι λειτουργίας.......................................... 10 Περιφερειακά................................................. 12 Μακροεντολές................................................ 12 Άσκηση....................................................... 12 Άσκηση 2 η : Εισαγωγή στο eζ430-f2013 με χρήση του IAR Embedded Workbench, ενός αναπτυξιακού περιβάλλοντος για τα MSP430...... 13 Παρουσίαση και Εγκατάσταση ez430.................... 14 Έναρξη IAR Embedded Workbench...................... 14 Δημιουργία νέου project.................................... 15 Ρυθμίσεις-Compiling........................................ 16 Debugging.................................................... 17 Άσκηση........................................................ 18 Άσκηση 3 η : Λειτουργίες Εισόδου εξόδου (Digital I/O)...... 19 Εισαγωγή...................................................... 20 Καταχωρητές................................................. 20 Παραδείγματα................................................ 22 Άσκηση........................................................ 23 Άσκηση 4 η : Αριθμητικές και λογικές πράξεις Εφαρμογές...... 24 Πράξεις με τις ψηφιακές εισόδους......................... 25 Λειτουργία πληκτρολογίου 4x4............................ 26 Άσκηση........................................................ 28 Άσκηση 5 η : Σήματα διακοπής (Interrupts)...... 29 Εισαγωγή...................................................... 30 Καταχωρητές................................................. 30 Παραδείγματα................................................ 31 Άσκηση........................................................ 34 Άσκηση 6 η : Χρονιστές / Απαριθμητές (Timers)...... 35 Εισαγωγή...................................................... 36 Basic Clock Module......................................... 36 Watchdog timer.............................................. 38 Timer A........................................................ 38 Capture-Compare modes.................................... 39 Καταχωρητές................................................. 40 Σήματα διακοπής............................................. 41 Παραδείγματα................................................ 41 Άσκηση........................................................ 45 Άσκηση 7 η : Μετατροπέας αναλογικού σήματος σε ψηφιακό με Σίγμα Δέλτα Διαμόρφωση (SD16)...... 47 A/DC Γενικά.................................................. 48 Σίγμα Δέλτα Διαμόρφωση(ΣΔ)-Block Διάγραμμα...... 48 Σελ. - 1 -

Καταχωρητές του SD16_A................................. 49 Modes - Temp Sensor....................................... 50 Παραδείγματα................................................ 51 Άσκηση........................................................ 52 Άσκηση 8 η : Σειριακή επικοινωνία(usi)...... 53 Εισαγωγή...................................................... 54 SPI............................................................. 54 I 2 C.............................................................. 55 Καταχωρητές................................................. 55 Παραδείγματα................................................ 55 Άσκηση........................................................ 62 Άσκηση 9 η : Εισαγωγή στην RF επικοινωνία με χρήση του ez430 - RF2500...... 63 Εισαγωγή-Παρουσίαση του ez430-rf2500............. 64 Εγκατάσταση του ez430-rf2500......................... 65 Εισαγωγή στον πομποδέκτη CC2500..................... 65 Sensor Monitor Visualizer.................................. 66 SimpliciTI..................................................... 67 Παραδείγματα................................................ 68 Άσκηση........................................................ 71 Παράρτημα 1 ο : Εισαγωγή στο Code Composer Studio (CCStudio) IDE...... 72 Εισαγωγή στο Code Composer Studio v4 (IDE)........ 73 Εγκατάσταση................................................. 73 Έναρξη CCStudio............................................ 73 Δημιουργία νέου project Ρυθμίσεις..................... 74 Debugging.................................................... 77 Σχόλια......................................................... 77 Παράρτημα 2 ο : Οδήγηση οθόνης υγρών κρυστάλλων 2x16...................... 78 Εισαγωγή...................................................... 79 Pinout.......................................................... 79 Εντολές........................................................ 80 Αρχικοποίηση και σύνδεση................................. 81 LCD driver header for MSP430(ο κώδικας)............. 82-2 -

- 3 -

Αρχιτεκτονική MSP430F20xx Στο κεφάλαιο αυτό παρουσιάζουμε τα βασικά χαρακτηριστικά της οικογένειας μικροεπεξεργαστών msp430x20xx της εταιρίας Texas Instruments. Oι μικροεπεξεργαστές της οικογένειας αυτής διαθέτουν 16-bit RISC αρχιτεκτονική, ποικιλία περιφερειακών και ευέλικτο σύστημα χρονισμού καθώς επίσης και προγραμματιζόμενη μνήμη FLASH, η οποία καθιστά εύκολες και γρήγορες τις αλλαγές στον κώδικα. Η διασύνδεση πραγματοποιείται με αρχιτεκτονική von Neumann, όπου οι δίαυλοι ΜΑΒ και MDB για την μνήμη διευθυνσιοδότησης και δεδομένων, είναι κοινοί. Ορισμένες από τις περιφερειακές συσκευές που υποστηρίζονται είναι ένας 12-bit A/D μετατροπέας, timers, USART(s), ένας Watchdog timer, ένας πολλαπλασιαστής υλικού, κ.α. Τα χαρακτηριστικά τους αυτά τους καθιστούν κατάλληλους για διάφορες και απαιτητικές εφαρμογές. Εξίσου σημαντική είναι η δυνατότητα των επεξεργαστών αυτών να καταναλώνουν λιγότερα από 250 μα σε ενεργό τρόπο λειτουργίας, ενώ μπορούν να αφυπνιστούν σε λιγότερο από 6 μs. Σε κατάσταση αναμονής η κατανάλωση είμαι μικρότερη από 2 μα. Συνεπώς οι msp430 είναι κατάλληλοι για φορητές εφαρμογές με απαίτηση για πολύ μικρή κατανάλωση. εικ.1 Block διάγραμμα του MSP430F20x3-4 -

Καταχωρητές H CPU υποστηρίζει χαρακτηριστικά ειδικά σχεδιασμένα για τις σύγχρονες προγραμματιστικές τεχνικές όπως η υποστήριξη υψηλού επιπέδου γλωσσών προγραμματισμού σαν τη C. Ορισμένα από τα χαρακτηριστικά αυτά είναι: 1. RISC αρχιτεκτονική 27 εντολών και 7 μεθόδων διευθυνσιοδότησης. 2. Πλήρης πρόσβαση στους καταχωρητές συμπεριλαμβανομένων του μετρητή κατάστασης(pc), του καταχωρητή κατάστασης(sr) και του δείκτη στοίβας(sp). 3. Κάθε εντολή μπορεί να χρησιμοποιηθεί με κάθε μέθοδο διευθυνσιοδότησης. 4. Λειτουργίες καταχωρητή ενός κύκλου. 5. Ο 16bit δίαυλος διευθύνσεων επιτρέπει απευθείας πρόσβαση σε ολόκληρη τη μνήμη και άμεσο χειρισμό όλων των λέξεων. 6. Η γεννήτρια σταθερών παρέχει τις έξι πιο εύχρηστες άμεσες σταθερές μειώνοντας έτσι τις ανάγκες σε κώδικα. 7. Άμεση μεταφορά από μνήμη σε μνήμη, χωρίς τη μεσολάβηση καταχωρητή. 8. Format εντολών και διευθύνσεων τόσο για χειρισμό λέξεων όσο και bytes. H CPU διαθέτει 16 καταχωρητές των 16bit. Οι καταχωρητές R0,R1,R2 και R3 έχουν ειδικές λειτουργίες ενώ οι καταχωρητές R4- R15 είναι για γενική χρήση. Ο R0 χρησιμοποιείται σαν μετρητής προγράμματος (PC) και η λειτουργία του είναι να δείχνει την επόμενη προς εκτέλεση εντολή. Ο R1 χρησιμοποιείται σαν δείκτης στοίβας. Η λειτουργία του είναι να αποθηκεύει τη διεύθυνση επιστροφής από κάποια υπορουτίνα ή από ρουτίνα εξυπηρέτησης διακοπής. Οι τρόποι λειτουργίας του μικροελεγκτή ελέγχονται από την τιμή που θα έχει ο R2 στον οποίο θα αναφερθούμε παρακάτω. εικ.2 Καταχωρητές MSP430 Mε τους καταχωρητές R2 και R3 παράγονται έξι σταθερές που χρησιμοποιούνται ευρέως στον προγραμματισμό, ώστε να μη χρειάζεται επιπλέον κώδικας. Οι υπόλοιποι 12 καταχωρητές χρησιμοποιούνται για γενικό σκοπό. Μπορούν να χρησιμοποιηθούν σαν καταχωρητές δεδομένων, δείκτες διευθύνσεων ή να περιέχουν κάποιες τιμές και μπορούν να προσπελαστούν με εντολές λέξης ή byte. - 5 -

Μέθοδοι Διευθυνσιοδότησης Εντολές Υπάρχουν 7 μέθοδοι για τον τελεστή πηγής και άλλοι 4 για τον τελεστή προορισμού, οι οποίοι μπορούν να διευθυνσιοδοτήσουν τον πλήρη χώρο διευθύνσεων εικ.3 Μέθοδοι διευθυνσιοδότησης MSP430 Το πλήρες σετ εντολών αποτελείται από 27 βασικές εντολές και άλλες 24 που εξομοιώνονται. Τα format των βασικών εντολών είναι: 1. Διπλού τελεστή 2. Απλού τελεστή 3. Άλματος Όλες οι εντολές απλού ή διπλού τελεστή μπορεί να είναι είτε λέξης είτε byte. Λυτό καθορίζεται από την κατάληξη.b ή.w. Οι εντολές byte χρησιμοποιούνται για να προσπελάσουν bytes δεδομένων ή περιφερειακών. Οι εντολές λέξης χρησιμοποιούνται για να προσπελάσουν λέξεις δεδομένων ή περιφερειακών. - 6 -

εικ.4 εικ.5 εικ.6 Οι εντολές εξομοίωσης κάνουν τον κώδικα πιο εύκολο να διαβαστεί και να γραφτεί, αλλά αντικαθίστανται αυτόματα από τον assembler με βασικές εντολές χωρίς να χαθούν κύκλοι εντολών. - 7 -

εικ.7 Περισσότερα για τις εντολές(κύκλοι εντολών κλπ) μπορείτε να βρείτε στο MSP430x2xx Family User s Guide Μνήμη Οι μικροελεγκτές MSP430 έχουν τον ίδιο χώρο διευθύνσεων για τους καταχωρητές, τη flash memory/rom, τη RAM και τα περιφερειακά. Αυτό έχει σαν αποτέλεσμα να χρησιμοποιούν τις ίδιες εντολές για προσπέλαση στη μνήμη και τα περιφερειακά. Τα δεδομένα μπορούν να προσπελαστούν είτε με εντολές λέξεων είτε με εντολές byte. Ο κώδικας εκτελείται από την μνήμη RAM - 8 -

εικ.8 Τα bytes τοποθετούνται σε άρτιες ή περιττές διευθύνσεις, όμως οι λέξεις τοποθετούνται μόνο σε άρτιες διευθύνσεις. Επομένως όταν χρησιμοποιούμε εντολές λέξεων, μόνο άρτιες διευθύνσεις μπορούν να χρησιμοποιηθούν. Το χαμηλής τάξης byte της λέξης βρίσκεται πάντα σε άρτια διεύθυνση. Το υψηλής τάξης byte βρίσκεται στην επόμενη περιττή διεύθυνση από τη διεύθυνση της λέξης. Για παράδειγμα εάν η λέξη δεδομένων τοποθετείται στη διεύθυνση xxx6h τότε το χαμηλής τάξης byte της λέξης τοποθετείται στη διεύθυνση xxx6h και το υψηλής τάξης byte της λέξης τοποθετείται στη διεύθυνση xxx7h. εικ.9-9 -

Τρόποι λειτουργίας Η οικογένεια MSP430 έχει σχεδιαστεί για εφαρμογές με σημαντικές απαιτήσεις για εξαιρετικά χαμηλή κατανάλωση ρεύματος. Γι αυτό το λόγο χρησιμοποιεί διαφορετικούς τρόπους (low-power) λειτουργίας. Οι τρόποι αυτοί λειτουργίας λαμβάνουν υπόψη τρείς σημαντικές ανάγκες: 1. Χαμηλή κατανάλωση. 2. Ελαχιστοποίηση της κατανάλωσης των περιφερειακών. 3. Ταχύτητα και ευελιξία των δεδομένων. εικ.10 εικ.11-10 -

εικ.12 Διάφορες τεχνικές οδηγούν σε ακόμη χαμηλότερη κατανάλωση ενέργειας. Βασικά προσπαθούμε να μεγιστοποιήσουμε την παραμονή στην κατάσταση LPM3. Η κατανάλωση στην κατάσταση αυτή είναι μικρότερη από 2 μa με όλες τις διακοπές ενεργές και λειτουργία ρολογιού. Τα περιφερειακά ενεργοποιούνται μόνο όταν είναι απαραίτητο. εικ.13 εικ.14-11 -

Περιφερειακά Μπορούμε να αναφερθούμε και να ξεχωρίσουμε τα περιφερειακά συστήματα σε 4 κατηγορίες: 1. Timers Basic Timer / Real-Time Clock(RTC) Watchdog (WDT/+) Timer_A / Timer_B 2. Communication Interfaces Universal Serial Interface(USI) o I 2 C/SPI Universal Serial Communication Interface(USCI) o USCI_A (UART/IrDA/SPI) o USCI_B (I 2 C/SPI) 3. ADCs Comparator_A/Slope ADC ADC10 ADC12 SD16/ SD16_A 4. Extras LCD Modules Op-amps Η ομάδα των MSP430 που θα ασχοληθούμε εμφανίζεται στον παρακάτω πίνακα. Μακροεντολές εικ.15 Οι μακροεντολές εμφανίζονται στον προγραμματισμό των μικροελεγκτών. Τόσο στην C αλλά και στην Assembly, όπως θα δούμε στα επόμενα εργαστηριακά μαθήματα πρέπει να ορίσουμε τη βιβλιοθήκη μακροεντολών του μικροελεγκτή που θα προγραμματίσουμε, την οποία θα πρέπει να είμαστε σε θέση να διαβάζουμε κατανοώντας τους ορισμούς των καταχωρητών και τις τιμές τους. Άσκηση 1. Αναγνωρίστε από το datasheet του μικροελεγκτή που θα χρησιμοποιηθεί στις επόμενες εργαστηριακές ασκήσεις τα πλήρη ηλεκτρικά χαρακτηριστικά και καταγράψτε τα. 2. Αναγνωρίστε από το User s Guide του μικροελεγκτή που θα χρησιμοποιηθεί στις επόμενες εργαστηριακές ασκήσεις τα περιφερειακά που υποστηρίζει και καταγράψτε τα. - 12 -

- 13 -

Παρουσίαση του ez430-f2013 Το ez430-f2013 είναι ένα πλήρες αναπτυξιακό εργαλείο παρέχοντας το κατάλληλο υλικό και λογισμικό για την αξιολόγηση του MSP430F2013 σε μια βολική μορφή USB stick που χρησιμοποιεί SpyBiWire προγραμματιστή (2 pins σε αντίθεση με το κλασικό JTAG που χρησιμοποιεί 4 pins) Προσφέρει και τα 14 pins του MSP430F2013 έτοιμα για χρήση και σύνδεση. Θα χρησιμοποιήσουμε την αναπτυξιακή πλακέτα που υπάρχει στο εργαστήριο για τις παρακάτω ασκήσεις. Εγκατάσταση του ez430-f2013 1. Αφού έχετε εγκαταστήσει το IAR Embedded Workbench (τοποθετήστε το CD που περιέχεται στο πακέτο και ακολουθήστε τα βήματα στο μενού που ανοίγει) τοποθετήστε το ez430-f2013 σε μια θύρα USB του Η/Υ. 2. Όταν ξεκινήσει ο οδηγός της εγκατάστασης νέου υλικού δώστε σαν κατάλογο εύρεσης προγράμματος οδήγησης τον: C:\Program Files\IAR Systems\Embedded Workbench 4.0\430\drivers\TIUSBFET\WinXP Έναρξη IAR Embedded Workbench Για να ανοίξουμε το IAR Embedded Workbench: Έναρξη όλα τα προγράμματα IAR Systems IAR Embedded Workbench KickStart for MSP430 V4 IAR Embedded Workbench - 14 -

Δημιουργία νέου project IAR Embedded Workbench integrated development environment (IDE) Η δομή του IAR Embedded Workbench αποτελείται ιεραρχικά από: Workspace (που περιέχει project-projects) Project (που περιέχει file-files) File εικ. 1 Όταν ανοίγει το πρόγραμμα υπάρχει ήδη ένα έτοιμο Workspace 2. Create new project in current workspace 3. Empty project OK 4. Save(π.χ. project1) εικ. 2 εικ. 3 5. File Save Workspace(π.χ. tutorials) Save - 15 -

Ρυθμίσεις-Compiling 6. Καλό θα ήταν σε αυτό το σημείο να κάνουμε τις ρυθμίσεις αρχικοποίησης της συσκευής μας ώστε να συνεργάζεται με το project. Δεξί κλικ στο project1 Debug Options ή Menu Project Options και κάνουμε τις ρυθμίσεις όπως στο σχήμα. εικ. 4 Για να επιλέξουμε αν θέλουμε να περάσουμε το πρόγραμμα στον μικροελεγκτή ή αν θέλουμε να κάνουμε προσομοίωση μόνο στον υπολογιστή επιλέγουμε την κατάλληλη επιλογή στην καρτέλα Debugger FET Debugger Πρόγραμμα στον μικροελεγκτή ή Simulator Προσομοίωση και ΟΚ. εικ. 5 7. Στη συνέχεια πρέπει να προσθέσουμε αρχεία με τον εκτελέσιμο κώδικα(είτε σε Assembly, είτε σε C ή C++). Δεξί κλικ στο project1 Debug Add Add Files. Έστω ότι προσθέτουμε το αρχείο msp430x20x3_p1_01.c και το βλέπουμε στον editor(δεξί μεγάλο παράθυρο) με διπλό κλικ. εικ. 6 8. Τώρα είμαστε έτοιμοι να κάνουμε compile:project Rebuild all. Προσέχουμε για λάθη στο παράθυρο μηνυμάτων!!!! εικ. 7-16 -

9. Συνεχίζουμε με Project Debug όπου βλέπουμε την παρακάτω οθόνη Debugging εικ. 8 Μπορούμε να ξεχωρίσουμε τα επιμέρους τμήματα, εκτός από αυτά που ήδη γνωρίζουμε, σε: Γραμμή εργαλείων ροής του προγράμματος(για το Debug) Disassembly Το Disassembly είναι ένα από τα πολλά «εργαλεία» που μπορούμε να δούμε μέσω του μενού View Τα πιο χρήσιμα εργαλεία και οι περιγραφές τους είναι: Breakpoints Δείχνει τα σημεία ελέγχου που έχουμε ορίσει στο debugging Disassembly Ο κώδικάς μας μεταφρασμένος σε assembly Memory Γραφική απεικόνιση της μνήμης του μικροελεγκτή Register Οι καταχωρητές του μικροελεγκτή ανά ομάδες Watch Βλέπουμε τιμές μεταβλητών/καταχωρητών Locals Δείχνει αυτόματα τιμές για τοπικές μεταβλητές Auto Δείχνει αυτόματα τιμές ανάλογα με τη ροή του προγράμματος Live Watch Παίρνει δείγματα συνέχεια για μεταβλητές/καταχωρητές, ακόμα και κατά τη διάρκεια εκτέλεσης του προγράμματος Quick Watch Ένα γρήγορο δείγμα τιμής μεταβλητής /καταχωρητή Call Stack Εικονική αναπαράσταση του σωρού ανά ρουτίνες Terminal I/O Τερματικό εισόδου/εξόδου Stack Απεικόνιση του σωρού του μικροελεγκτή Η γραμμή εργαλείων με τα στοιχεία της μας επιτρέπουν τον έλεγχο του Debug. Τα στοιχεία και οι επιμέρους λειτουργίες τους είναι: εικ. 9-17 -

10. Όπως βλέπουμε ο κέρσορας βρίσκεται στην πρώτη εκτελέσιμη γραμμή του προγράμματός. Έχουμε δύο επιλογές: Άμεση εκτέλεση Βηματική εκτέλεση 11. Βηματική εκτέλεση προγράμματος Ανοίγουμε το μενού των καταχωρητών από το View Register Πατώντας το Next statement βλέπουμε ότι εκτελέστηκε η πρώτη γραμμή του προγράμματος και ο έλεγχος πέρασε στη δεύτερη γραμμή που είναι έτοιμη να εκτελεστεί. 12. Σε κάθε εντολή μπορούμε να ελέγχουμε τους καταχωρητές που εμπλέκονται, οι οποίοι εμφανίζονται με έντονο χρώμα στο μενού Registers 13. Για να σταματήσουμε τη διαδικασία του Debugging πατάμε Άσκηση 1. Πραγματοποιείστε τα παραπάνω βήματα ρυθμίζοντας κατάλληλα το IAR Embedded Workbench για να κάνετε προσομοίωση στον MSP430F2013. Τρέξτε βηματικά το πρόγραμμα και παρατηρείστε τις εγγραφές που γίνονται στους καταχωρητές. 2. Επαναλάβετε τα βήματα μεταφέροντας το πρόγραμμα στον μικροελεγκτή. Καταγράψτε διαφορές. 3. Ανοίξτε το Workspace Flashing the LED από το παράθυρο στην εκκίνηση του IAR Embedded Workbench(εικ. 1). Example applications Flashing the LED Open Επιλέξτε τον κατάλογο που θα αποθηκευτούν τα αρχεία που θα δημιουργηθούν Select Επιλέξτε κατάλληλο Project (εικ. 10) για τον μικροελεγκτή MSP430CG4619 και κάντε προσομοίωση με βηματική εκτέλεση. 4. Επιλέξτε από το Flashing the LED το κατάλληλο πρόγραμμα σε γλώσσα C για τον μικροελεγκτή του ez430. (χρησιμοποιείστε πρόγραμμα ρυθμισμένο για προγραμματιστή με SpyBiWire. εικ. 10-18 -

- 19 -

Εισαγωγή Οι μικροελεγκτές MSP430 έχουν μέχρι 8 ψηφιακές βαθμίδες εισόδου-εξόδου (I/O-ports), P1 έως P7. Κάθε port αποτελείται από 8 I/O pins. Κάθε I/O pin ρυθμίζεται ανεξάρτητα από τα υπόλοιπα σαν είσοδος ή έξοδος και μπορούμε να διαβάσουμε ή να γράψουμε την τιμή του ανεξάρτητα από τα άλλα. Επίσης μπορούμε να ορίζουμε στο καθένα εσωτερικούς αντιστάτες(pullup/pulldown). Τα P1 και P2 έχουν δυνατότητα σημάτων διακοπής(interrupts). O F2013, με τον οποίο κατά βάση θα ασχοληθούμε, έχει μόνο τα P1 και P2 διαθέσιμα. Από αυτά μπορούμε να διαχειριστούμε συνολικά 10 pins, τα 8 του P1 και τα P2.6 και P2.7 από το P2. Οι λειτουργίες των ports ορίζονται από τις τιμές των αντίστοιχων καταχωρητών. Καταχωρητές 1. PxIN Η τιμή των bits του καταχωρητή αντιστοιχεί στην τιμή που έχουν τα bits του port στην είσοδό τους όταν έχουν ρυθμιστεί ως είσοδοι. Bit=0 λογικό 0(low input) Bit=1 λογικό 1(high input) 2. PxOUT Η τιμή των bits του καταχωρητή αντιστοιχεί στην τιμή που πάρουν τα bits του port στην έξοδό τους όταν έχουν ρυθμιστεί ως έξοδοι χωρίς εσωτερικούς αντιστάτες. Bit=0 λογικό 0(low output) Bit=1 λογικό 1(high output) Με εσωτερικούς αντιστάτες ενεργοποιημένους:. Bit=0 pulldown αντιστάτης Bit=1 pullup αντιστάτης 3. PxDIR Η τιμή των bits του καταχωρητή ορίζουν το κάθε pin σαν είσοδο(input) ή έξοδο(output). - 20 -

Bit=0 input Bit=1 output 4. PxSEL Κάποια από τα pins έχουν εκτός από την κύρια λειτουργία τους (Ι/Ο) και δευτερεύουσες λειτουργίες μιας και χρησιμοποιούνται από περιφερειακές διατάξεις. Η τιμή των bits του καταχωρητή ορίζουν τη λειτουργία του αντίστοιχου pin: κύρια, δευτερεύουσα. Bit=0 κύρια λειτουργία pin Bit=1 δευτερεύουσα λειτουργία pin 5. PxREN Η τιμή των bits του καταχωρητή ενεργοποιεί/απενεργοποιεί στο κάθε pin τους εσωτερικούς αντιστάτες. Bit=0 ανενεργοί εσωτερικοί αντιστάτες Bit=1 ενεργοί εσωτερικοί αντιστάτες εικ. 1 εικ. 2 Με τους υπόλοιπους καταχωρητές που έχουν να κάνουν με τα σήματα διακοπής των port θα ασχοληθούμε σε επόμενο εργαστήριο. - 21 -

Παραδείγματα 1. Αναβοσβήνει στο port 1 το pin 0 (P1.0) με assembly #include "msp430x20x3.h" ;------------------------------------------------------------------------------- ORG 0F800h ; Program Reset ;------------------------------------------------------------------------------- RESET mov.w #0F80h,SP ; Initialize stack pointer StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT SetupP1 bis.b #001h,&P1DIR ; P1.0 output Mainloop xor.b #001h,&P1OUT ; Toggle P1.0 Wait mov.w #050000,R15 ; Delay to R15 L1 dec.w R15 ; Decrement R15 jnz L1 ; Delay over? jmp Mainloop ; Again ;------------------------------------------------------------------------------- ; Interrupt Vectors ;------------------------------------------------------------------------------- ORG 0FFFEh ; MSP430 RESET Vector DW RESET ; END 2. Αναβοσβήνει στο port 1 το pin 0 (P1.0) με C #include <msp430x20x3.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR = 0x01; // Set P1.0 to output direction for (;;) { volatile unsigned int i; P1OUT ^= 0x01; // Toggle P1.0 using exclusive-or i = 50000; // Delay do (i--); while (i!= 0); - 22 -

Άσκηση 1. Παρατηρήστε τα παραδείγματα. Καταγράψτε τις διαφορές και τις ομοιότητες ανάμεσα στα δύο προγράμματα και εντοπίστε τη δομή της κάθε γλώσσας προγραμματισμού. 2. Δημιουργήστε ένα workspace στο IAR Embedded Workbench με το όνομα askhsh3 Προσθέστε ένα project για assembly με όνομα askhsh3-asm στο workspace askhsh3 και τοποθετήστε τον κώδικα του παραδείγματος 1 στο αρχείο asm.s43 Προσθέστε ένα project για C με όνομα askhsh3-c στο workspace askhsh3 και τοποθετήστε τον κώδικα του παραδείγματος 2 στο αρχείο main.c Εντοπίστε τους χώρους μνήμης που ορίζουν τα δύο προγράμματα και καταγράψτε τα όριά τους. Τρέξτε βηματικά και τα δύο. Παρατηρήστε και καταγράψτε τι κάνουν τα προγράμματα. 3. Αλλάξτε την καθυστέρηση στα προγράμματα σύμφωνα με τον Α.Μ. σας και ρυθμίστε κατάλληλα ώστε να ανάβει/σβήνει pin στο P1 σύμφωνα με το πρώτο ψηφίου του Α.Μ. σας(π.χ. Α.Μ.=28816=delay και θα ανάβει/σβήνει το P1.2) 4. Ρυθμίστε κατάλληλα ώστε να ανάβουν/σβήνουν μονά ή ζυγά pinς στο P1 σύμφωνα με το τελευταίο ψηφίου του Α.Μ. σας(π.χ. Α.Μ.=28816 θα ανάβουν/σβήνουν τα ζυγά pins του P1, δηλ P1.0,2,4,6) 5. Τροποποιείστε τα προγράμματα κατάλληλα ώστε να υλοποιούν το εξής πρόγραμμα: Έστω Α.Μ. 28816 το οποίο έχει 5 ψηφία με ψηφίο0=6 ψηφίο4=2. Όπου ψηφίοx εκτός ορίων παίρνουμε ψηφίοx/2(ακέραιος) εικ.3 6. Δημιουργήστε κατάλληλο πρόγραμμα το οποίο θα προσομοιώνει το σήμα κινδύνου SOS. Υπενθυμίζουμε: εικ. 4 Χρησιμοποιήστε σαν έξοδο την P1.0 και αν t=χρόνος διάρκειας τελείας τότε 3*t=χρόνος διάρκειας παύλας. - 23 -

- 24 -

Πράξεις με τις ψηφιακές εισόδους Στην άσκηση αυτή θα ασχοληθούμε με αριθμητικές αλλά και λογικές πράξεις με τον MSP430 σε assembly αλλά και C. Μερικές από τις εντολές αριθμητικών και λογικών πράξεων στην assembly: ADD - Add without carry ADDC - Add with carry SUB - Sub without carry SUBC - Sub with carry AND - Logical AND XOR - Logical XOR RRC- Rotate right with carry RLC- Rotate left with carry INC- Increment by 1 DEC- Decrement by 1 Έστω ότι θέλουμε να προσθέσουμε δύο δεκαεξαδικούς αριθμούς(35η και 27Η) και το αποτέλεσμα να το δούμε σαν έξοδο στο P1: Σε assembly: Σε C:...... mov.b #35h,R4 int a=0x27; mov.b #27h,R5 int b=0x35; add R4,R5 a=a+b;...... bis.b R5,&P1OUT P1OUT = a;...... Ενημερωθείτε για τις εντολές αριθμητικών πράξεων τόσο από το πρώτο μέρος του φυλλαδίου, όσο και από το MSP430x2xx Family User s Guide Ενημερωθείτε για τον τρόπο που χειρίζεται η C αριθμητικές και λογικές πράξεις Λειτουργία πληκτρολογίου 4x4 Μια ολοκληρωμένη ιδέα για να κατανοήσουμε τη χρήση των πράξεων γενικότερα σε Ι/Ο είναι το πληκτρολόγιο γενικής χρήσης(keypad) σαν αυτό που χρησιμοποιείται στα τηλέφωνα, σε συναγερμούς, τηλεχειριστήρια κλπ. εικ.1 Keypad 3 x 4-25 -

Στα πλαίσια της άσκησης παρουσιάζουμε ένα keypad 4x4 με τις παρακάτω συνδέσεις και πλήκτρα: Το οποίο λειτουργεί βάση του επόμενου διαγράμματος ροής: εικ.2-26 -

Ο κώδικας που το υλοποιεί σε C: #include <msp430x20x3.h> #include <stdio.h> int scan(void); int nextkey(char pr1); char const KEY[4][4] = {{'7','8','9','F', {'4','5','6','E', {'1','2','3','D', {'0','A','B','C'; void main( void ) {char press; WDTCTL = WDTPW + WDTHOLD; P1OUT = 0x00; P1DIR = 0xF0; while(1) {press = scan(); printf("%c",press); nextkey(press); int scan(void) {int i,j; char pressed=' '; P1OUT = 0x10; for( i = 0; i < 4; i++) { int k=1; for( j = 0; j < 4; j++) {if (P1IN == P1OUT + k) {pressed=key[i][j]; break; k=(k<<1); if( pressed!= ' ' ) break; P1OUT = (P1OUT << 1); return(pressed); int nextkey(char pr1) {char press2; while(1) {press2 = scan(); if( pr1 == press2 ) { else break; return(0); - 27 -

ΑΣΚΗΣΗ 1. Αφού ενημερωθείτε για τις εντολές αριθμητικών και λογικών πράξεων στην assembly δημιουργήστε ένα Workspace στο IAR Workbench για την άσκηση και σε αυτό εισάγετε projects που θα δείχνουν τη λειτουργία της κάθε μιας από της εντολές: SUB, CMP, DADD, SWPB, INV. Παρατηρήστε τη συμπεριφορά τους στο debugger και σχολιάστε. 2. Ενημερωθείτε για τις αντίστοιχες εντολές στη C και δημιουργήστε αντίστοιχο Workspace με το προηγούμενο με projects σε C. Παρατηρήστε τη συμπεριφορά τους στο debugger και σχολιάστε. 3. Γράψτε κατάλληλο πρόγραμμα το οποίο θα ελέγχει την είσοδο στο P1 και : Α)Αν είναι ενεργοποιημένη η είσοδος P0.0 να ενεργοποιείται η P0.6 Α)Αν είναι ενεργοποιημένη η είσοδος P0.1 να ενεργοποιείται η P0.7 ΝΑ γραφεί σε assembly και C και να ελεγχθεί η λειτουργία τους 4. Ενημερωθείτε για τις επαναληπτικές δομές καθώς και για τις δομές δεδομένων στη C και μετά περιγράψτε τη λειτουργία του παρακάτω προγράμματος: #include "msp430x20x3.h" #include "stdio.h" void main(void){ int i,j,tmp; int a[20]= {0x000C,0x0C62,0x0180,0x0D4A,0x00F0,0x0CCF,0x0C35,0x096E,0x02E4, 0x0BDB,0x0788,0x0AD7,0x0AC9,0x0D06,0x00EB,0x05CC,0x0AE3,0x05B7, 0x001D,0x0000; for (i=0; i<19; i++){ for (j=0; j<19-i; j++){ if (a[j+1] < a[j]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; printf("changed %d",a[j]); printf(" with %d",a[j+1]); printf("\n"); for(int i = 0; i < 20; ++i){ printf("%d",a[i]); printf("\n"); while(1); 5. Εξηγήστε το διαγράμματος ροής του πληκτρολογίου 4x4. Εξομοιώστε και ελέγξτε τη λειτουργία του. Τροποποιείστε τον κώδικα κατάλληλα ώστε να μπορεί ύστερα από σωστή πληκτρολόγηση να εμφανίζει τις φράσεις ELECTRONICS DEPARTMENT και T.E.I. PIREA. Τέλος τροποποιείστε ξανά και τυπώστε το ονοματεπώνυμό σας με λατινικούς χαρακτήρες. - 28 -

- 29 -

Εισαγωγή Τα σήματα διακοπής συνιστούν, ουσιαστικά, μια τεχνική αντίδρασης του μικροεπεξεργαστή. Σύμφωνα με αυτήν, η CPU διακόπτει τη συνηθισμένη λειτουργία της, για να ανταποκριθεί αποτελεσματικά σε ασύγχρονα γεγονότα ιδιαίτερης σημασίας. Τέτοια γεγονότα μπορεί να είναι η διακοπή τροφοδοσίας, ένας συναγερμός, η παρέλευση ενός καθορισμένου χρονικού διαστήματος ή ακόμα δεδομένα έτοιμα για αποστολή από/σε κάποια περιφερειακή διάταξη κ.α. Στο υπολογιστικό σύστημα των MSP430 αναγνωρίζουμε τριών ειδών σήματα διακοπής: 1. System Reset 2. (Non) - maskable NMI (Υποχρεωτικό σήμα διακοπής) 3. Maskable (Προγραμματιζόμενο σήμα διακοπής) Τα οποία υπηρετούνται βάση του παρακάτω διαγράμματος: Καταχωρητές εικ.1 P1 και P2 Interrupts Κάθε pin στα P1 και P2 έχουν δυνατότητα ενεργοποίησης σημάτων διακοπής ρυθμιζόμενα από τους καταχωρητές PxIFG, PxIE, και PxIES 1. PxIFG Bit=0 δεν εκκρεμεί σήμα διακοπής Bit=1 εκκρεμεί σήμα διακοπής 2. PxIES Bit=0 Ο PxIFG έχει ορίζεται για μετάβαση 0 1 Bit=1 Ο PxIFG έχει ορίζεται για μετάβαση 1 0 3. PxIE Κάθε PxIE bit ενεργοποιεί το αντίστοιχο PxIFG bit Bit=0 Σήμα διακοπής απενεργοποιημένο Bit=1 Σήμα διακοπής ενεργοποιημένο Watchdog Timer Interrupts Αν και με τον Watchdog timer θα ασχοληθούμε στο επόμενο μάθημα θα δούμε κάποια παραδείγματα που έχουν να κάνουν με τα σήματα διακοπής του που ορίζονται σχετικά εύκολα. - 30 -

Παραδείγματα Ορισμός του P1.4 ώστε να δημιουργεί ένα σήμα διακοπής για μετάβασή του από 1 σε 0 και υπηρέτησή του αλλάζοντας την κατάσταση του P1.0 Παράδειγμα 1(assembly) #include "msp430x20x3.h" ;------------------------------------------------------------------------------- ORG 0F800h ; Program Reset ;------------------------------------------------------------------------------- RESET mov.w #0280h,SP ; Initialize stack pointer StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT SetupP1 mov.b #001h,&P1DIR ; P1.0 output, else input mov.b #010h,&P1OUT ; P1.4 set, else reset bis.b #010h,&P1REN ; P1.4 pullup bis.b #010h,&P1IE ; P1.4 Interrupt enabled bis.b #010h,&P1IES ; P1.4 hi/low edge bic.b #010h,&P1IFG ; P1.4 IFG Cleared ; Mainloop bis.w #LPM4+GIE,SR ; LPM4, enable interrupts nop ; Required only for debugger ; ;------------------------------------------------------------------------------- P1_ISR; Toggle P1.0 Output ;------------------------------------------------------------------------------- xor.b #001h,&P1OUT ; P1.0 = toggle bic.b #010h,&P1IFG reti ; P1.4 IFG Cleared ; Return from ISR ; ;------------------------------------------------------------------------------- ; Interrupt Vectors ;------------------------------------------------------------------------------- ORG 0FFFEh ; MSP430 RESET Vector DW RESET ; ORG 0FFE4h ; P1.x Vector DW P1_ISR ; END Στο παραπάνω παράδειγμα βλέπουμε: 1. Τον τρόπο με τον οποίο ορίζονται οι καταχωρητές για να υπηρετηθεί ένα σήμα διακοπής στο P1.4 2. Τον τρόπο που ορίζουμε τις καταστάσεις χαμηλής κατανάλωσης στον MSP430 3. Το πώς ορίζονται οι ρουτίνες υπηρέτησης των σημάτων διακοπής - 31 -

Παράδειγμα 1(C) #include <msp430x20x3.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR = 0x01; // P1.0 output, else input P1OUT = 0x10; // P1.4 set, else reset P1REN = 0x10; // P1.4 pullup P1IE = 0x10; // P1.4 interrupt enabled P1IES = 0x10; // P1.4 Hi/lo edge P1IFG &= ~0x10; // P1.4 IFG cleared _BIS_SR(LPM4_bits + GIE); #pragma vector=port1_vector interrupt void Port_1(void) { P1OUT ^= 0x01; P1IFG &= ~0x10; // Enter LPM4 w/interrupt // Port 1 interrupt service routine // P1.0 = toggle // P1.4 IFG cleared Τις περισσότερες φορές απενεργοποιούμε τον watchdog timer. Στα παρακάτω παραδείγματα θα δούμε τι γίνεται όταν δεν τον απενεργοποιούμε και τον χρησιμοποιήσουμε για να δημιουργεί σήματα διακοπής. Παράδειγμα 2(C) #include <msp430x20x3.h> void main(void) { WDTCTL = WDT_MDLY_32; IE1 = WDTIE; P1DIR = 0x01; _BIS_SR(LPM0_bits + GIE); #pragma vector=wdt_vector interrupt void watchdog_timer(void) { P1OUT ^= 0x01; // Set Watchdog Timer interval to ~30ms // Enable WDT interrupt // Set P1.0 to output direction // Enter LPM0 w/ interrupt // Watchdog Timer interrupt routine // Toggle P1.0 using exclusive-or - 32 -

Παράδειγμα 2(assembly) #include "msp430x20x3.h" ;------------------------------------------------------------------------------- ORG 0F800h ; Program Reset ;------------------------------------------------------------------------------- RESET mov.w #0280h,SP ; Initialize stackpointer SetupWDT mov.w #WDT_MDLY_32,&WDTCTL ; WDT ~30ms interval bis.b #WDTIE,&IE1 ; Enable WDT interrupt SetupP1 bis.b #001h,&P1DIR ; P1.0 output Mainloop bis.w #CPUOFF+GIE,SR ; CPU off, enable interrupts nop ; Required only for debugger ;------------------------------------------------------------------------------- WDT_ISR; Toggle P1.0 ;------------------------------------------------------------------------------- xor.b #001h,&P1OUT ; Toggle P1.0 reti ; ;------------------------------------------------------------------------------- ORG 0FFFEh ; MSP430 RESET Vector DW RESET ; ORG 0FFF4h ; WDT Vector DW WDT_ISR ; END Παράδειγμα 3(C) #include <msp430x20x3.h> void main(void) { WDTCTL = WDT_ARST_1000; P1DIR = 0x01; P1OUT ^= 0x01; // Toggle P1.0 _BIS_SR(LPM3_bits); Παράδειγμα 3(assembly) // Set Watchdog Timer timeout 1s // Set P1.0 to output #include "msp430x20x3.h" ;------------------------------------------------------------------------------- ORG 0F800h ; Program Reset ;------------------------------------------------------------------------------- RESET mov.w #0280h,SP ; Initialize stackpointer SetupWDT mov.w #WDT_ARST_1000,&WDTCTL ;Watchdog timeout 1s bis.b #001h,&P1DIR ; P1.0 output xor.b #001h,&P1OUT ; Toggle P1.0 bis.w #LPM3,SR ; Mainloop jmp $ ;------------------------------------------------------------------------------- ORG 0FFFEh ; MSP430 RESET Vector DW RESET ; END - 33 -

Άσκηση 1. Ενημερωθείτε από το manual του μικροελεγκτή για τον αλγόριθμο υπηρέτησης των σημάτων διακοπής. Σχεδιάστε το διάγραμμα ροής του. 2. Εξηγήστε αναλυτικά τη λειτουργία του παραδείγματος 1 και τροποποιείστε κατάλληλα ώστε να ενεργοποιεί σήματα διακοπής στη μετάβαση 0 σε 1. 3. Δημιουργείστε κατάλληλο workspace για την άσκηση με projects τα παραδείγματα 2 & 3(σε assembly και C). Σχολιάστε τη λειτουργία τους. 4. Τροποποιείστε κατάλληλα το παράδειγμα 3 αλλάζοντας την καθυστέρηση δημιουργίας σήματος διακοπής. - 34 -

- 35 -

Εισαγωγή Όταν μιλάμε για χρονιστές/απαριθμητές (timers) σε μικροελεγκτές εννοούμε εκείνες τις μονάδες που μας επιτρέπουν να μετράμε χρόνο, δηλ. να απαριθμούμε την τιμή ενός καταχωρητή έως ότου φτάσει αυτή είτε σε μια δεδομένη τιμή, είτε στη μέγιστη τιμή που μπορεί να πάρει, είτε μηδενιστεί. Γενικότερα είναι ένα πολύ σημαντικό εργαλείο σε εφαρμογές που θέλουμε να λειτουργούν σε πραγματικό χρόνο. Μας προσφέρουν κάποιες ευκολίες σε ενσωματωμένες εφαρμογές όπως: 1. Εύκολη μέτρηση συγκεκριμένου χρόνου με ακρίβεια 2. Αυτόματο περιοδικό ξύπνημα του μικροελεγκτή 3. Αλλάζοντας τις απλές καθυστερήσεις με χρήση ενός timer μπορούμε να «κοιμίζουμε» τον μικροελεγκτή για χαμηλότερη κατανάλωση ενέργειας. Στην οικογένεια των MSP430x2xx μπορούμε να δούμε τα παρακάτω περιφερειακά χρονιστών/απαριθμητών: 1. Basic Clock Module+ BCS+ 2. Watchdog Timer WDT+ 3. Timer_A Basic Clock Module+ (BCS+) / Block Διάγραμμα Είναι το βασικό σύστημα που ορίζει το χρονισμό του μικροελεγκτή και υποστηρίζει 3 διαφορετικά σήματα για το χρονισμό του: 1. Εξωτερικός κρύσταλλος. Υποστηρίζονται ανάλογα το μοντέλο είτε χαμηλής συχνότητας με δύο επιλογές (LF:32768 Ηz και HF:400KHz - 16 ΜΗz) (LFXT1CLK), είτε μεγαλύτερης συχνότητας (400KHz - 16 ΜΗz) (XT2CLK), είτε και τα δύο. 2. Εσωτερικός ψηφιακός ταλαντωτής (DCOCLK) 3. Εσωτερικός ταλαντωτής χαμηλής συχνότητας (περίπου 12 ΚΗz) (VLOCLK) Τα οποία οδηγούν ελεγχόμενα από το πρόγραμμα 3 διαφορετικούς χρονιστές για τη λειτουργία του μικροελεγκτή: 1. ACLK: Βοηθητικό ρολόι για τα περιφερειακά. Οδηγείται είτε από το LFXT1CLK, είτε από το VLOCLK. 2. MCLK: Κύριο ρολόι για την CPU. Οδηγείται από ένα από τα LFXT1CLK, VLOCLK, XT2CLK ή DCOCLK. 3. SMCLK: Δευτερεύον ρολόι. Οδηγείται από ένα από τα LFXT1CLK, VLOCLK, XT2CLK ή DCOCLK. Στην αρχική κατάσταση του μικροελεγκτή το ACLK οδηγείται από το LFXT1CLK σε LF και τα MCLK και SMCLK οδηγούνται από τον DCOCLK με συχνότητα περίπου 1 ΜΗz - 36 -

Το DCOCLK ρυθμίζεται βάση τριών καταχωρητών: 1. RSELx: ορίζει την γραφική ορισμού 2. DCOx : ορίζει μία από τις 8 περιοχές πάνω στην RSELx 3. MODx: επιλέγουμε από 5 τιμές ανάμεσα σε DCOx και DCOx+1 Κάθε μικροελεγκτής έχει ορισμένες τιμές έτοιμες σαν ορισμένες σταθερές στο λεξιλόγιό του. π.χ. για τον F2013 οι τιμές CALDCO_8MHZ και CALBC1_8MHZ στους καταχωρητές BCSCTL1 και DCOCTL δίνουν συχνότητα 8 ΜΗz για το DCOCLK. - 37 -

Watchdog Timer WDT+ / Block Διάγραμμα Είναι ένας χρονιστής που έχει σαν ρόλο τον έλεγχο του προγράμματος και σε περίπτωση που κάτι δεν δουλεύει σωστά και έχει κολλήσει κάνει επαναφορά του μικροελεγκτή και του προγράμματος(reset). Χαρακτηριστικά: 1. Λειτουργία χρονιστή(timer) ή ελεγκτή(watchdog) 2. 4 προγραμματιζόμενα χρονικά διαστήματα ελέγχου 3. Έλεγχος του ακροδέκτη RST/NMI και της λειτουργίας του. 4. Επιλογή ρολογιού οδήγησης για τον WDT+ Στην αρχική κατάσταση του μικροελεγκτή το WDT+ λειτουργεί σαν ελεγκτής (watchdog mode) οδηγούμενος από το DCOCLK και κάνει reset τον μικροελεγκτή κάθε 32768 κύκλους εντολής. Timer_A Εισαγωγή / Block Διάγραμμα Χαρακτηριστικά: 1. Υποστηρίζει 4 τρόπους λειτουργίας: - 38 -

2. Επιλογή σήματος χρονισμού από το πρόγραμμα 3. Μέχρι 3 προγραμματιζόμενους καταχωρητές capture/compare 4. Δυνατότητα εξόδων με προγραμματιζόμενα PWM σήματα 5. Δυνατότητα ελεγχόμενων interrupt 6. Ασύγχρονη είσοδος και έξοδος σημάτων Capture / Compare Βlocks Το capture block χρησιμοποιείται για να μετρήσουμε την περίοδο χρονικών γεγονότων. Το compare block χρησιμοποιείται σαν γεννήτρια παλμών ή σημάτων διακοπής σε δεδομένες χρονικές στιγμές. Το σήμα εξόδου από τα capture/compare blocks μπορεί να προγραμματιστεί ως ένα από 8 modes. Με δεδομένα τους 3 ενεργούς τρόπους λειτουργίας του Timer_A παρακάτω βλέπουμε τις κυματομορφές εξόδου για τα 8 modes. - 39 -

Καταχωρητές - 40 -

Σήματα Διακοπής Ανάλογα με τη λειτουργία του χρονιστή μπορούμε να χρησιμοποιήσουμε/λάβουμε διαφορετικά σήματα διακοπής. 1. Capture mode : Το CCIFG (capture/compare interrupt flag) ενεργοποιείται όταν η τιμή του timer καταγραφθεί στον καταχωρητή TACCRx. 2. Compare mode : Το CCIFG ενεργοποιείται όταν η τιμή του μετρητή TAR γίνει ίση με την τιμή που θέσουμε στον καταχωρητή TACCRx. 3. Γενικότερα μπορούμε να ορίσουμε την τιμή του CCIFG μέσα από το πρόγραμμα Παραδείγματα Παράδειγμα 1(BCS+) #include <msp430x20x3.h> void main(void) { WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer if (CALBC1_1MHZ ==0xFF CALDCO_1MHZ == 0xFF) {while(1); BCSCTL1 = CALBC1_1MHZ; // Set range 1 MHz DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation P1DIR = 0x13; // P1.0,1 and P1.4 outputs P1SEL = 0x11; // P1.0,4 ACLK, SMCLK output while(1) { P1OUT = 0x02; // P1.1 = 1 P1OUT &= ~0x02; // P1.1 = 0-41 -

Παράδειγμα 2(WDT+) Βλέπουμε τι γίνεται όταν δεν απενεργοποιούμε τον watchdog timer. #include <msp430x20x3.h> void main(void) { P1DIR = 0x01; // Set P1.0 to output P1OUT ^= 0x01; // Toggle P1.0 _BIS_SR(LPM4_bits); // Stop all clocks Παράδειγμα 3(WDT+) Επίδειξη δυνατοτήτων του watchdog timer. #include <msp430x20x3.h> void main(void) { // WDT is clocked by fsmclk (1 MHz) WDTCTL = WDT_MRST_32; // ~32ms interval (default) //WDTCTL = WDT_MRST_8; // ~8ms //WDTCTL = WDT_MRST_0_5; // ~0.5ms //WDTCTL = WDT_MRST_0_064; // ~0.064ms // WDT is clocked by faclk (32 KHz) //WDTCTL = WDT_ARST_1000; // 1000ms //WDTCTL = WDT_ARST_250; // 250ms //WDTCTL = WDT_ARST_16; // 16ms //WDTCTL = WDT_ARST_1_9; // 1.9ms P1DIR = 0x01; P1OUT ^=0x01; _BIS_SR(LPM0_bits + GIE); // Enter LPM3 w/interrupt Παράδειγμα 4(WDT+) #include "msp430x20x3.h" ;------------------------------------------------------------------------------- ORG 0F800h ; Program Reset ;------------------------------------------------------------------------------- RESET mov.w #0280h,SP ; Initialize stackpointer Setup mov.w #WDT_ADLY_250,&WDTCTL ; WDT 250ms, ACLK bis.b #WDTIE,&IE1 ; Enable WDT interrupt SetupP1 bis.b #001h,&P1DIR ; P1.0 output ; Mainloop bis.w #LPM3+GIE,SR ; Enter LPM3, interrupts enabled nop ; Required only for debugger ;------------------------------------------------------------------------------- WDT_ISR ;Toggle P1.0 ;------------------------------------------------------------------------------- xor.b #001h,&P1OUT ; Toggle P1.0 reti ; ;------------------------------------------------------------------------------- - 42 -

; Interrupt Vectors ;------------------------------------------------------------------------------- ORG 0FFFEh ; MSP430 RESET Vector DW RESET ; ORG 0FFF4h ; WDT Vector DW WDT_ISR ; END Παράδειγμα 5(Timer_A) Toggle P1.1/TA0, Up Mode, 32kHz ACLK #include <msp430x20x3.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; P1DIR = 0x02; P1SEL = 0x02; CCTL0 = OUTMOD_4; CCR0 = 10-1; TACTL = TASSEL_1 + MC_1; _BIS_SR(LPM3_bits); // Stop WDT // P1.1 output // P1.1 option select // CCR0 toggle mode // ACLK, upmode // Enter LPM3 w/interrupt Παράδειγμα 6(Timer_A) Toggle P1.0-2, Cont. Mode, DCO SMCLK P1.1 = CCR0 ~ 1MHz/(2*200) ~2500Hz P1.2 = CCR1 ~ 1MHz/(2*1000) ~500Hz P1.0 = overflow ~ 1MHz/(2*65536) ~8Hz #include <msp430x20x3.h> void main(void) {WDTCTL = WDTPW + WDTHOLD; P1SEL = 0x06; P1DIR = 0x07; CCTL0 = OUTMOD_4 + CCIE; CCTL1 = OUTMOD_4 + CCIE; TACTL = TASSEL_2 + MC_2 + TAIE; _BIS_SR(LPM0_bits + GIE); // Stop WDT // P1.1 - P1.2 option select // P1.0 - P1.2 outputs // CCR0 toggle, interrupt enabled // CCR1 toggle, interrupt enabled // SMCLK, Contmode, int enabled // Enter LPM0 w/ interrupt #pragma vector=timera0_vector interrupt void Timer_A0 (void) { CCR0 += 200; // Add Offset to CCR0 // Timer A0 interrupt service routine #pragma vector=timera1_vector interrupt void Timer_A1(void) {switch( TAIV ) {case 2: CCR1 += 1000; break; // Add Offset to CCR1 case 10: P1OUT ^= 0x01; break; // Timer_A2 Interrupt Vector (TAIV) // Timer_A3 overflow - 43 -

Παράδειγμα 7(Timer_A) Toggle P1.1/TA0, Up/Down Mode, 32 khz ACLK P1.1 = 32768/20 = 1.6384 khz #include <msp430x20x3.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; P1DIR = 0x02; P1SEL = 0x02; CCTL0 = OUTMOD_4; CCR0 = 5; TACTL = TASSEL_1 + MC_3; _BIS_SR(LPM3_bits); // Stop WDT // P1.1 output // P1.1 option select // CCR0 toggle mode // ACLK, up-down mode // Enter LPM3 Παράδειγμα 8(Timer_A) Γεννήτρια συχνοτήτων χρησιμοποιώντας τον Timer_A2 σε up mode, reset/set(pwm) #include <msp430x20x3.h> void main( void ) { void d0(); void re(); // Δήλωση Υπορουτινών void mi(); void fa(); void sol(); void la(); void si(); WDTCTL = WDTPW WDTHOLD; P1DIR = BIT2; // Έξοδος bit για buzzer P1SEL = BIT2; // Ενεργοποίηση του bit2 για TA0 CCTL1 = OUTMOD_7; // Reset/set for(;;) { while(p1in!= 0x00) // Είναι κάτι πατημένο? { if( P1IN == BIT0 ) {d0(); if( P1IN == BIT1 ) {re(); if( P1IN == BIT3 ) {mi(); if( P1IN == BIT4 ) {fa(); if( P1IN == BIT5 ) {sol(); if( P1IN == BIT6 ) {la(); if( P1IN == BIT7 ) {si(); TACTL = MC_0; // Κλείσε τον Timer - 44 -

void d0() { CCR0 = 1003-1; // Περίοδος CCR1 = 501; // Duty Cycle 50% TACTL = TASSEL_2 MC_1; // Up mode, SMCLK void re() { CCR0 = 894-1; CCR1 = 447; TACTL = TASSEL_2 MC_1; void mi() { CCR0 = 796-1; CCR1 = 398; TACTL = TASSEL_2 MC_1; void fa() { CCR0 = 750-1; CCR1 = 375; TACTL = TASSEL_2 MC_1; void sol() { CCR0 = 669-1; CCR1 = 335; TACTL = TASSEL_2 MC_1; void la() { CCR0 = 596-1; CCR1 = 298; TACTL = TASSEL_2 MC_1; void si() { CCR0 = 532-1; CCR1 = 266; TACTL = TASSEL_2 MC_1; Άσκηση 1. Ενημερωθείτε από το User s Guide της οικογένειας μικροελεγκτών MSP430x2xx για τα περιφερειακά που αναφέρθηκαν στην εισαγωγή της άσκησης(bcs+, WDT+, Timer_A2). Χαρακτηριστικά, λειτουργία, καταχωρητές. 2. Ενημερωθείτε από το Datasheet του μικροελεγκτή MSP430x20x για τα pins που συσχετίζονται με τα BCS+, WDT+ και Timer_A2. 3. Δημιουργείστε κατάλληλο workspace με project το παράδειγμα 1. Εφαρμόστε στο αναπτυξιακό και σχολιάστε τη λειτουργία του. Μετρήστε τις συχνότητες που δημιουργήθηκαν. Ύστερα τροποποιήστε το πρόγραμμα με εναλλακτικές συχνότητες λειτουργίας και μετρήστε ξανά τις συχνότητες. 4. Δημιουργείστε κατάλληλο workspace με projects τα παραδείγματα 2, 3 & 4. Εφαρμόστε στο αναπτυξιακό και σχολιάστε τη λειτουργία τους. - 45 -

Τροποποιήστε το παράδειγμα 2 αλλάζοντας με τους υπόλοιπους δυνατούς συνδυασμούς και σχολιάστε. Εξηγήστε πως λειτουργεί το παράδειγμα 3 και που μπορεί να χρησιμοποιηθεί. 5. Δημιουργείστε κατάλληλο workspace με projects τα παραδείγματα 5, 6 & 7. Καταλάβετε πως εγγράφονται οι καταχωρητές για διαφορετικές λειτουργίες και πως υπηρετούνται σήματα διακοπής του Timer_A2. Τροποποιείστε τους καταχωρητές κατά βούληση. Εφαρμόστε στο αναπτυξιακό και σχολιάστε τη λειτουργία τους. 6. Δημιουργείστε κατάλληλο workspace με projects το παράδειγμα 8. Εφαρμόστε στο αναπτυξιακό και σχολιάστε τη λειτουργία του. Δημιουργήστε νέο κώδικα με βάση το παράδειγμα 8 που θα εναλλάσσει τις συχνότητες αυτόματα κάθε 1 sec δηλ. ΝΤΟ-ΡΕ-ΜΙ-ΦΑ-ΣΟΛ-ΛΑ-ΣΙ-ΝΤΟ... 7. Ενημερωθείτε για τη χρήση και λειτουργία των σερβοκινητήρων. Ύστερα δημιουργήστε κατάλληλο κώδικα που θα φτιάχνει τις παρακάτω κυματομορφές. Χρησιμοποιείστε τον Timer_A2 σε κατάλληλο mode και κυματομορφή εξόδου. Ρυθμίστε κατάλληλα τους καταχωρητές για την περίοδο και το εύρος του παλμού. Ρυθμίστε στον κώδικά σας την επιλογή του παλμού στην έξοδο ανάλογα του button που θα πατηθεί. - 46 -

- 47 -

A/DC Γενικά Όταν μιλάμε για έναν μετατροπέα αναλογικού σήματος σε ψηφιακό (A/D ή A to D) εννοούμε μια ηλεκτρονική διάταξη που δέχεται συνεχή αναλογικά σήματα και τα μετατρέπει σε διακριτούς αριθμούς. Η αντίστροφη διαδικασία ονομάζεται μετατροπή ψηφιακού σήματος σε αναλογικό. Πρακτικά ένας A/D δέχεται μια συνεχή τάση και τη μετατρέπει σε έναν ψηφιακό αριθμό ανάλογα με το μέγεθος της τάσης. Σίγμα Δέλτα Διαμόρφωση (ΣΔ) - Block Διάγραμμα Η διαμόρφωση ΣΔ είναι μια τεχνική κωδικοποίησης σημάτων χρησιμοποιώντας διαμόρφωση πυκνότητας παλμού(pdm). Χρησιμοποιείται σε διάφορες εφαρμογές όπως A/D, D/A, συνθέτες συχνότητας, switching τροφοδοτικά και έλεγχος κινητήρων. Χρησιμοποιώντας ΣΔ σε έναν A/D μπορούμε να πετύχουμε υψηλή ανάλυση. Σε ένα απλοποιημένο σχηματικό διάγραμμα με Σ/Δ για A/D βλέπουμε έναν ελεγχόμενο από τάση ταλαντωτή και ένα μετρητή των παλμών του ταλαντωτή. Επειδή η ανατροφοδότηση του ταλαντωτή έχει τη μορφή της συνάρτησης Dirac ή Δ και ο μετρητής συνήθως αναγράφεται ως Σ, προκύπτει και το Σ/Δ. Πολλές φορές στην πράξη χρησιμοποιούνται 2 ης και μεγαλύτερης τάξης διαμορφωτές. Στον MSP430F2013 υπάρχει ενσωματωμένος ένας μετατροπέας A/D με Σ/Δ προσφέροντας : Ανάλυση 16 bit Σ/Δ Μέχρι 8 διαφορικές αναλογικές είσοδοι Ενσωματωμένο αισθητήριο θερμοκρασίας Ελεγχόμενη από τον χρήστη τάση αναφοράς 1,2V - 48 -

Επειδή το SD16_A module έχει σχεδιαστεί για να ικανοποιεί εφαρμογές χαμηλής κατανάλωσης όταν δεν κάνει A/D μετατροπή, απενεργοποιείται και ενεργοποιείται ξανά στην επόμενη μετατροπή. Προσοχή: Η εσωτερική τάση αναφοράς δεν απενεργοποιείται αυτόματα!!! Καταχωρητές του SD16_A - 49 -

Modes - Temp Sensor Αναφέρθηκε παραπάνω ότι υποστηρίζονται μέχρι 8 αναλογικές είσοδοι. Απ αυτές οι 5 πρώτες (Α0-Α4) είναι ελεύθερες για εξωτερική χρήση ενώ από τις υπόλοιπες η Α5 είναι ένας διαιρέτης της τάσης, η Α6 είναι ένα αισθητήριο θερμοκρασίας και η Α7 είναι ένα βραχυκύκλωμα που χρησιμοποιείται όταν χρειάζεται καλιμπράρισμα. Επίσης ανάλογα την εφαρμογή μπορούμε να επιλέξουμε τη σχέση που θα έχει η αναλογική μας είσοδος με την ψηφιακή έξοδο από 3 διαφορετικές σχέσεις(modes) Για να χρησιμοποιήσουμε το ενσωματωμένο αισθητήριο θερμοκρασίας πρέπει να ορίσουμε τους κατάλληλους καταχωρητές: SD16INCHx = 110 και SD16REFON = 1 και για να πάρουμε πρακτικά αποτελέσματα πρέπει να γνωρίζουμε την απόκριση του αισθητηρίου από την παρακάτω γραφική. - 50 -

Παραδείγματα Παράδειγμα 1 Ανάβει το led στο P1.0 όταν η τάση στην αναλογική είσοδο Α1 είναι μεγαλύτερη από 0.3 V. #include <msp430x20x3.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR = 0x01; // Set P1.0 to output direction SD16CTL = SD16REFON + SD16SSEL_1;// 1.2V ref, SMCLK SD16INCTL0 = SD16INCH_1; // A1+/- SD16CCTL0 = SD16UNI + SD16IE; // 256OSR, unipolar, interrupt enable SD16AE = SD16AE2; // P1.1 A1+, A1- = VSS SD16CCTL0 = SD16SC; // Set bit to start conversion _BIS_SR(LPM0_bits + GIE); #pragma vector = SD16_VECTOR interrupt void SD16ISR(void) { if (SD16MEM0 < 0x7FFF) // SD16MEM0 > 0.3V?, clears IFG P1OUT &= ~0x01; else P1OUT = 0x01; Παράδειγμα 2 #include <msp430x20x3.h> #include <stdio.h> #define ADCDeltaOn 31 static unsigned int LastADCVal; void main(void) { BCSCTL2 = DIVS_3; WDTCTL = WDT_MDLY_32; IE1 = WDTIE; P1DIR = 0x01; // ~0.5 Deg C delta // holds ADC temperature result // SMCLK/8 // WDT Timer interval // Enable WDT interrupt // P1.0 to output direction SD16CTL = SD16REFON +SD16SSEL_1;// 1.2V ref, SMCLK SD16INCTL0 = SD16INCH_6; // A6+/- SD16CCTL0 = SD16SNGL + SD16IE ; // Single conv, interrupt _BIS_SR(LPM0_bits + GIE); // Enter LPM0 with interrupt #pragma vector=sd16_vector interrupt void SD16ISR(void) { int Celsius; if (SD16MEM0 <= LastADCVal + ADCDeltaOn) { Celsius = ((SD16MEM0-0x8000)/72)-273;//hex to Celsius convert P1OUT &= ~0x01; - 51 -

printf("%x %d\n",sd16mem0,celsius); //print results else { Celsius = ((SD16MEM0-0x8000)/72)-273;//hex to Celsius convert P1OUT = 0x01; // LED on LastADCVal = SD16MEM0; printf("%x %d\n",sd16mem0,celsius); //print results // Watchdog Timer interrupt service routine #pragma vector=wdt_vector interrupt void watchdog_timer(void) { SD16CCTL0 = SD16SC; // Start SD16 conversion Άσκηση 1. Ενημερωθείτε από το User s Guide της οικογένειας μικροελεγκτών MSP430x2xx για τα περιφερειακά που υποστηρίζουν A/D. 2. Ενημερωθείτε για τη διαμόρφωση Σ/Δ γενικά αλλά και ειδικά στους MSP430. Πως λειτουργεί, χαρακτηριστικά, block διάγραμμα, καταχωρητές, ενεργοποίηση, είσοδοι, μετατροπή, temp sensor. 3. Ενημερωθείτε για το πώς συντάσσεται και χρησιμοποιείται η εντολή printf στη γλώσσα C. Τι ορίσματα δέχεται και πως παραμετροποιείται. 4. Δημιουργείστε κατάλληλο workspace με project το παραδείγματα 1. Δείτε τον τρόπο που ορίζονται οι καταχωρητές. Σχολιάστε τη λειτουργία του. Τροποποιείστε κατάλληλα για τάσεις 0,2V και 0,5V και διαφορετικά modes εξόδου και δείτε στην πράξη τι αλλάζει. 5. Προσθέστε στο workspace για το ερώτημα 4 project με το παράδειγμα 2. Για να δείτε τη λειτουργία του ενεργοποιείστε το Terminal I/O όταν κάνετε debug. Σχολιάστε τη λειτουργία του και βρείτε το ποσοστό του σφάλματος στη μέτρηση, αν υπάρχει. Βρείτε πως διαμορφώνεται η εξίσωση μετατροπής της τιμής του A/D σε ο C. 6. Αν μπορείτε βελτιστοποιείστε το παράδειγμα 2 σε ότι χρειάζεται. - 52 -

- 53 -

Εισαγωγή Στην εισαγωγή των μικροελεγκτών MSP430 αναφέρθηκαν και τα περιφερειακά που υποστηρίζει. Θα ασχοληθούμε με τα περιφερειακά για σειριακή επικοινωνία που στην οικογένεια MSP430F20xx είναι ένα, το USI(Universal Serial Interface). Η καρδιά του USI αποτελείται από έναν shift register που σε συνδυασμό με το ενσωματωμένο υλικό στον μικροελεγκτή και ελάχιστο κώδικα από τον χρήστη μπορεί να ενεργοποιήσει είτε το SPI είτε το I 2 C πρωτόκολλο. SPI(Serial Peripheral Interface Bus) Το SPI είναι ένα σύγχρονο πρωτόκολλο σειριακής επικοινωνίας δύο κατευθύνσεων (full-duplex). Υποστηρίζει λειτουργία master/slave και η οικογένεια MSP430F20xx υποστηρίζει βασικά 3-wire αλλά και 4-wire SPI: - 54 -

I 2 C (Inter-Integrated Circuit) Το I2C είναι ένα σειριακό πρωτόκολλο επικοινωνίας. Υποστηρίζει λειτουργία πολλών master/slave και λειτουργεί με δύο σήματα(καλώδια). Καταχωρητές Παραδείγματα 1. SPI full-duplex 3-wire Master #include <msp430x20x3.h> void main(void) { volatile unsigned int i; WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1OUT = 0x10; // P1.4 set, else reset P1REN = 0x10; // P1.4 pullup P1DIR = 0x01; // P1.0 output, else input USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI master USICTL1 = USIIE; // Counter interrupt, flag remains set USICKCTL = USIDIV_4 + USISSEL_2; // /16 SMCLK USICTL0 &= ~USISWRST; // USI released for operation USISRL = P1IN; // init-load data P1DIR = 0x04; // Reset Slave P1DIR &= ~0x04; for (i = 0xFFF; i > 0; i--); // Time for slave to ready USICNT = 8; // init-load counter _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt // USI interrupt service routine #pragma vector=usi_vector interrupt void universal_serial_interface(void) - 55 -

{ if (0x10 & USISRL) P1OUT = 0x01; else P1OUT &= ~0x01; USISRL = P1IN; USICNT = 8; // re-load counter 2. SPI full-duplex 3-wire Slave #include "msp430x20x3.h" ;----------------------------------------------------------------------------- ORG 0F800h ; Program Reset ;----------------------------------------------------------------------------- RESET mov.w #0280h,SP ; Initialize stackpointer StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer SetupP1 mov.b #010h,&P1OUT ; P1.4 set, else bis.b #010h,&P1REN ; P1.4 pullup bis.b #001h,&P1DIR ;SetupUSI bis.b #USIPE7+USIPE6+USIPE5+USIOE,&USICTL0; Port, SPI slave bis.b #USIIE,&USICTL1 ; Counter interrupt, flag remains bic.b #USISWRST,&USICTL0 ; Enable USI mov.b &P1IN,&USISRL ; init-load TX data mov.b #08h,&USICNT ; init-load counter, clear flag ;Mainloop bis.b #LPM4+GIE,SR nop ; LPM4 w/ interrupts enabled ; Required for debugger only ; ;------------------------------------------------------------------------------ USI_ISR; ;------------------------------------------------------------------------------ mov.b &USISRL,R4 ; Temp save RX'ed char mov.b &P1IN,&USISRL ; mov.b #08h,&USICNT ; re-load counter, clear flag bic.b #01h,&P1OUT ; bit.b #010h,R4 ; jnc L2 ; L1 bis.b #01h,&P1OUT ; L2 reti ; Exit ISR ; ;------------------------------------------------------------------------------ ; Interrupt Vectors Used MSP430x20x2/3 ;------------------------------------------------------------------------------ ORG 0FFFEh ; MSP430 RESET Vector DW RESET ; ORG 0FFE8h ; USICNT DW USI_ISR ; END - 56 -

3. I 2 C Master Receiver, single byte #include "msp430x20x3.h" #define I2CState R4 #define slav_data R5 #define slav_add R6 ;------------------------------------------------------------------------------- RSEG CSTACK ; Define stack segment ;------------------------------------------------------------------------------- RSEG CODE ; Assemble to Flash memory EVEN ;------------------------------------------------------------------------------- RESET mov.w #SFE(CSTACK),SP ; Initialize stackpointer StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer CheckCal cmp.b #0FFh,&CALBC1_1MHZ ; Calibration constants erased? jeq Trap cmp.b #0FFh,&CALDCO_1MHZ jne Load Trap jmp $ ; Trap CPU!! Load mov.b &CALBC1_1MHZ,&BCSCTL1 ; Set DCO to 1MHz mov.b &CALDCO_1MHZ,&DCOCTL SetupP1 mov.b #0xC0,&P1OUT ; P1.6&P1.7 Pullups bis.b #0xC0,&P1REN ; P1.6&P1.7 Pullups mov.b #0xFF,&P1DIR ; unused pins as output SetupP2 mov.b #0x00,&P2OUT mov.b #0xFF,&P2DIR SetupUSI mov.b #USIPE6+USIPE7+USIMST+USISWRST,&USICTL0 ;Port, I2C master mov.b #USIIE+USII2C,&USICTL1 ; Counter interrupt, enable I2C mov.b #USIDIV_3+USISSEL_2+USICKPL,&USICKCTL ; SCL=SMCLK/8(~120KHz) bis.b #USIIFGCC,&USICNT ; bic.b #USISWRST,&USICTL0 ; Enable USI bic.b #USIIFG,&USICTL1 ; Clear pending flag clr.w I2CState clr.b slav_data mov.b #0x91,slav_add Mainloop bis.b #USIIFG,&USICTL1 ; Set flag and start communication bis.w #LPM0+GIE,SR ; Enter LPM0, enable interrupts nop ; Used for debugger call #Delay ; Delay between commn. cycles jmp Mainloop ;------------------------------------------------------------------------------- USI_ISR ; ;------------------------------------------------------------------------------- add.w I2CState,PC ; I2C State Machine jmp STATE0 jmp STATE2-57 -

jmp STATE4 jmp STATE6 jmp STATE8 jmp STATE10 STATE0 bis.b #0x01,&P1OUT ; LED on: sequence start clr.b &USISRL ; Generate start condition bis.b #USIGE+USIOE,&USICTL0 ; bic.b #USIGE,&USICTL0 ; & send address to slave mov.b slav_add,&usisrl ; and transmit address R/W =1 mov.b &USICNT,R8 ; Bit counter = 8, Tx adress and.b #0xE0,R8 add.b #0x08,R8 mov.b R8,&USICNT mov.w #2,I2CState ; Go to next state rx address (N)ACK bic.b #USIIFG,&USICTL1 ; clear pending flag reti STATE2 ; Receive Address Ack/Nack bit bic.b #USIOE,&USICTL0 ; SDA = input bis.b #0x01,&USICNT ; Bit counter = 1, rx (N)ACK mov.w #4,I2CState ; Go to next state, chk (N)ACK bic.b #USIIFG,&USICTL1 reti STATE4 ; Process Address (N)Ack & data Rx bit.b #0x01,&USISRL ; if NACK received jnc Data_Rx ; else ACK received bis.b #USIOE,&USICTL0 clr.b &USISRL bis.b #0x01,&USICNT ; bit counter = 1, SCL high, SDA low mov.w #10,I2CState ; Go to next state, generate stop bis.b #0x01,&P1OUT ; Turn on LED : error bic.b #USIIFG,&USICTL1 reti Data_Rx bis.b #8,&USICNT ; bit counter = 8, Rx data mov.w #6,I2CState ; goto next state: Test data, (N)ACK bic.b #0x1,&P1OUT ; LED off bic.b #USIIFG,&USICTL1 reti STATE6 ; Send Data (N)Ack bit bis.b #USIOE,&USICTL0 ; SDA = output cmp.b slav_data,&usisrl ; if data valid jnz Data_NACK ; data invalid, goto NACK loop clr.b &USISRL ; send ACK inc.b slav_data ; Increment slave data bic.b #0x01,&P1OUT ; LED off jmp STATE6_Exit Data_NACK mov.b #0xFF,&USISRL ; Send NACK bis.b #0x1,&P1OUT ; LED on:error - 58 -

STATE6_Exit bis.b #0x1,&USICNT ; Bit counter = 1, send NACK bit mov.w #8,I2CState ; goto next state, prep stop bic.b #USIIFG,&USICTL1 reti STATE8 ; Pre stop condition bis.b #USIOE,&USICTL0 ; SDA =output clr.b &USISRL bis.b #0x01,&USICNT ; Bit counter = 1, SCL high, SDA low mov.w #10,I2CState ; Go to next state, generate stop bic.b #USIIFG,&USICTL1 reti STATE10 ; Generate stop condition mov.b #0xFF,&USISRL ; USISRL=1 to release SDA bis.b #USIGE,&USICTL0 ; Transparent latch enabled bic.b #USIGE+USIOE,&USICTL0 ; Latch/SDA output disabled mov.w #0,I2CState ; Reset state machine for next Tx bic.w #LPM0,0(SP) ; Exit active for next transfer bic.b #USIIFG,&USICTL1 reti ;------------------------------------------------------------------------------- Delay ; Delay between communication cycles ;------------------------------------------------------------------------------- mov.w #0xFFFF,R7 DL1 dec.w R7 jnz DL1 ret ;------------------------------------------------------------------------------- ; Interrupt Vectors Used MSP430x2013 ;------------------------------------------------------------------------------- COMMON INTVEC ORG RESET_VECTOR ; MSP430 RESET Vector DW RESET ; ORG USI_VECTOR ; USICNT DW USI_ISR ; END 4. I 2 C Slave Transmitter, single byte #include <msp430x20x3.h> char SLV_Data = 0; // Variable for transmitted data char SLV_Addr = 0x90; // Address is 0x48<<1 for R/W int I2C_State = 0; // State variable void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog if (CALBC1_1MHZ ==0xFF CALDCO_1MHZ == 0xFF) { - 59 -

while(1); // If calibration constants erased // do not load, trap CPU!! BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P1OUT = 0xC0; // P1.6 & P1.7 Pullups P1REN = 0xC0; // P1.6 & P1.7 Pullups P1DIR = 0xFF; // Unused pins as outputs P2OUT = 0; P2DIR = 0xFF; USICTL0 = USIPE6+USIPE7+USISWRST; // Port & USI mode setup USICTL1 = USII2C+USIIE+USISTTIE; // Enable I2C mode & USI interrupts USICKCTL = USICKPL; // Setup clock polarity USICNT = USIIFGCC; // Disable automatic clear control USICTL0 &= ~USISWRST; // Enable USI USICTL1 &= ~USIIFG; // Clear pending flag _EINT(); while(1) { LPM0; // CPU off, await USI interrupt _NOP(); // Used for IAR //****************************************************** // USI interrupt service routine //****************************************************** #pragma vector = USI_VECTOR interrupt void USI_TXRX (void) { if (USICTL1 & USISTTIFG) // Start entry? { P1OUT = 0x01; // LED on: Sequence start I2C_State = 2; // Enter 1st state on start switch(i2c_state) { case 0: //Idle, should not get here break; case 2: //RX Address USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, RX Address USICTL1 &= ~USISTTIFG; // Clear start flag I2C_State = 4; // Go to next state: check address break; case 4: // Process Address and send (N)Ack if (USISRL & 0x01) // If read... SLV_Addr++; // Save R/W bit USICTL0 = USIOE; // SDA = output if (USISRL == SLV_Addr) // Address match? { USISRL = 0x00; // Send Ack P1OUT &= ~0x01; // LED off - 60 -

I2C_State = 8; else { USISRL = 0xFF; P1OUT = 0x01; I2C_State = 6; USICNT = 0x01; break; case 6: // Prep for Start condition USICTL0 &= ~USIOE; SLV_Addr = 0x90; I2C_State = 0; break; case 8: // Send Data byte USICTL0 = USIOE; USISRL = SLV_Data; USICNT = 0x08; I2C_State = 10; break; case 10: // Receive Data (N)Ack USICTL0 &= ~USIOE; USICNT = 0x01; I2C_State = 12; break; case 12: // Process Data Ack/NAck if (USISRL & 0x01) { P1OUT = 0x01; else { P1OUT &= ~0x01; SLV_Data++; // Prep for Start condition USICTL0 &= ~USIOE; SLV_Addr = 0x90; I2C_State = 0; break; USICTL1 &= ~USIIFG; // Go to next state: TX data // Send NAck // LED on: error // Go to next state: prep for next Start // Bit counter = 1, send (N)Ack bit // SDA = input // Reset slave address // Reset state machine // SDA = output // Send data byte // Bit counter = 8, TX data // Go to next state: receive (N)Ack // SDA = input // Bit counter = 1, receive (N)Ack // Go to next state: check (N)Ack // If Nack received... // LED on: error // Ack received // LED off // Increment Slave data // SDA = input // Reset slave address // Reset state machine // Clear pending flags - 61 -

Άσκηση 1. Ενημερωθείτε για τα σειριακά πρωτόκολλα SPI και I 2 C: αρχή λειτουργίας, σήματα και υλοποίηση. 2. Ενημερωθείτε από το User s Guide του μικροελεγκτή για τα περιφερειακά που υποστηρίζουν σειριακή επικοινωνία: ενεργοποίηση, λειτουργίες, καταχωρητές. 3. Δημιουργείστε κατάλληλο workspace για την άσκηση με projects τα παραδείγματα 1, 2, 3 & 4. Εφαρμόστε στο αναπτυξιακό και σχολιάστε τη λειτουργία τους. 4. Πραγματοποιήστε κατάλληλη συνδεσμολογία των αναπτυξιακών ανά δύο, έτσι ώστε να υποστηρίζουν το πρωτόκολλο SPI(3-wire). Ύστερα φορτώστε κατάλληλο κώδικα υλοποιώντας το πρωτόκολλο έχοντας master/slave σύνδεση. Δείτε τη λειτουργία του στην πράξη. 5. Πραγματοποιήστε κατάλληλη συνδεσμολογία των αναπτυξιακών ανά δύο, έτσι ώστε να υποστηρίζουν το πρωτόκολλο I 2 C(2-wire). Ύστερα φορτώστε κατάλληλο κώδικα υλοποιώντας το πρωτόκολλο έχοντας master/slave σύνδεση και μεταφορά δεδομένων από το master στο slave. Τροποποιήστε κατάλληλα για μεταφορά δεδομένων από το slave στο master.δείτε τη λειτουργία του στην πράξη. - 62 -

- 63 -

Εισαγωγή Παρουσίαση του ez430-rf2500 Το ez430-rf2500 είναι ένα ολοκληρωμένο αναπτυξιακό εργαλείο που περιλαμβάνει όλο το υλικό και το λογισμικό που απαιτείται για την λειτουργία ενός ασύρματου συστήματος με τους MSP430 σε ένα USB stick. Χρησιμοποιεί τον MSP430F22x4 και τον CC2500, έναν πολυκάναλο πομποδέκτη RF για χαμηλής ισχύος ασύρματες εφαρμογές. Ο USB προγραμματιστής του ez430-rf2500 προσφέρει έναν ελεγκτή UART δημιουργώντας μια θύρα για απευθείας σειριακή επικοινωνία με το αναπτυξιακό. Επίσης μπορεί να προγραμματίσει και τις εκδόσεις των ez430-f2013 και ez430- F2012. - 64 -

Εγκατάσταση του ez430-rf2500 1. Αφού έχουμε ήδη εγκαταστήσει το Sensor Monitor Visualizer (τοποθετήστε το CD που περιέχεται στο πακέτο και ακολουθήστε τα βήματα στο μενού που ανοίγει) τοποθετήστε το ez430- RF2500 σε μια θύρα USB του Η/Υ. 2. Τα Windows το εγκαθιστούν αυτόματα. 3. Επίσης βρίσκουν και ένα καινούριο υλικό, το MSP430 Application UART. 4. Στο παράθυρο της εγκατάστασης του καινούριου υλικού επιλέγουμε αυτόματη εγκατάσταση και είμαστε έτοιμοι να προχωρήσουμε. Εισαγωγή στον πομποδέκτη CC2500 Ο CC2500 συνδέεται και ελέγχεται μέσω ενός ελεγκτή SPI, Και στο RF2500 έτσι είναι συνδεδεμένο, έτοιμο για προγραμματισμό - 65 -

Sensor Monitor Visualizer Στο πακέτο του RF2500 περιέχεται ότι χρειάζεται για μια πρώτη γνωριμία στα ασύρματα δίκτυα αισθητήρων(wsn). Σ αυτό το παράδειγμα ορίζονται δύο συσκευές. Μία ως Access Point και μία ως End Device, οι οποίες διαβάζουν από τον ενσωματωμένο στον μικροελεγκτή αισθητήρα θερμοκρασίας δεδομένα, τα οποία στέλνονται στο Access Point και εκμεταλλεύονται από το υπάρχον λογισμικό στο πακέτο για την απεικόνιση του δικτύου. 1. Ανοίγουμε και αποθηκεύουμε τον φάκελο με τον κώδικα στην επιφάνεια εργασίας(από το CD που περιέχεται στο πακέτο) 2. Ανοίγουμε το workspace ez430-rf2500 Sensor Monitor Demo v1.xx.eww και επιλέγουμε ως ενεργό το project End Device. 3. Ρυθμίζουμε κατάλληλα και περνάμε το πρόγραμμα στη συσκευή. 4. Αφαιρούμε την πλακέτα από τον προγραμματιστή και τη συνδέουμε στη βάση με τις μπαταρίες. 5. Τοποθετούμε την άλλη πλακέτα στον προγραμματιστή, επιλέγουμε ως ενεργό το project Access Point. 6. Ρυθμίζουμε κατάλληλα και περνάμε το πρόγραμμα στη συσκευή. 7. Κλείνουμε το IAR Embedded Workbench αφήνοντας την συσκευή σε λειτουργία και τρέχουμε το ez430-rf2500 Sensor Monitor από την επιφάνεια εργασίας και ενεργοποιούμε την πλακέτα που τροφοδοτείται από τις μπαταρίες αλλάζοντας θέση στο jumper.βλέπουμε την παρακάτω εικόνα: Μπορούμε να ρυθμίζουμε περισσότερα από ένα End Device και τότε θα δούμε κάτι τέτοιο: Παραπάνω είδαμε ένα εικονικό περιβάλλον απόδοσης του δικτύου και των τιμών που λαμβάνει το Access Point. Ας δούμε σε βαθύτερο επίπεδο τι γίνεται: - 66 -

1. Έναρξη Όλα τα προγράμματα Βοηθήματα Επικοινωνίες HyperTerminal.exe 2. Name: Msp430 UART, επιλέγουμε το port που αντιστοιχεί στο MSP430 Application UART και ρυθμίζουμε ως εξής: SimpliciTI Το SimpliciTI είναι ένα πρωτόκολλο δικτύου RF για μικρά RF δίκτυα. Έχει σχεδιαστεί για εύκολη εφαρμογή και ανάπτυξη με τα RF αναπτυξιακά εργαλεία της Texas Instruments όπως το ez430-rf2500 υποστηρίζοντας τις οικογένειες πομποδεκτών CC1XXX/CC25XX/CC430. Όλα τα απαραίτητα εργαλεία(κώδικες κλπ) υπάρχουν διαθέσιμα και στο CD που περιέχεται στο πακέτο. Παράδειγμα ενός SimpliciTI δικτύου - 67 -

Παραδείγματα Για τη δημιουργία ενός project που να υποστηρίζει RF επικοινωνία στο IAR Embedded Workbench πρέπει να ενσωματώσουμε τους κατάλληλους οδηγούς. 1. Δημιουργούμε ένα project κατά τα γνωστά 2. Στις ρυθμίσεις για το project C/C++ Compiler Preprocessor προσθέτουμε τους απαραίτητους κώδικες από το SimpliciTI Additional include directories Defined symbols \bsp Board Support Package Οδηγοί αρχικοποίησης MRFI_CC2500 \bsp\drivers buttons & leds \bsp\boards\ez430rf Ορισμός συσκευής Ορισμός RF συσκευής \mrfi Minimal RF Interface Οδηγοί αρχικοποίησης 3. Δημιουργήστε την παρακάτω δομή για το project δημιουργώντας φακέλους και προσθέτοντας τα κατάλληλα αρχεία. 4. Προσθέστε τον κυρίως κώδικα π.χ. main.c στον φάκελο Application. - 68 -

Παράδειγμα 1 Ανάβει σταθερά τα δύο ενσωματωμένα led #include "msp430x22x4.h" int main( void ) { WDTCTL = WDTPW + WDTHOLD; P1DIR = 0x03; P1OUT = 0x03; while(1); Παράδειγμα 2 Αφού τοποθετηθεί σε τουλάχιστον δύο RF2500 και τροφοδοτηθούν τότε πατήστε το ενσωματωμένο button σε ένα από τα δύο. #include "mrfi.h" int main(void) { BSP_Init(); P1REN = 0x04; P1IE = 0x04; MRFI_Init(); MRFI_WakeUp(); MRFI_RxOn(); bis_sr_register(gie+lpm4_bits); void MRFI_RxCompleteISR() { P1OUT ^= 0x02; #pragma vector=port1_vector interrupt void Port_1 (void) { P1IFG &= ~0x04; mrfipacket_t packet; packet.frame[0]=8+20; MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED); P1OUT ^= 0x01; BSP_Init() MRFI_Init() Απενεργοποιεί τον watchdog timer, ορίζει συχνότητα λειτουργίας του MCLK στα 8MHz, τα Led σαν εξόδους και το button σαν είσοδο. Ενεργοποιεί την σύνδεση του μικροελεγκτή με τον πομποδέκτη (SPI) και αρχικοποιεί κατάλληλα τους καταχωρητές του CC2500. MRFI_WakeUp() Ξεκινά την RF επικοινωνία ενεργοποιώντας τον κρύσταλλο στο CC2500. - 69 -

Παράδειγμα 3 #include "radios/family1/mrfi_spi.h" #include "mrfi.h" uint8_t index_output = 9; mrfipacket_t packettosend; int main(void) {BSP_Init(); MRFI_Init(); P3SEL = 0x30; UCA0CTL1 = UCSSEL_2; UCA0BR0 = 0x41; UCA0BR1 = 0x3; UCA0MCTL = UCBRS_2; UCA0CTL1 &= ~UCSWRST; // P3.4,5 = USCI_A0 TXD/RXD // SMCLK // 9600 from 8Mhz // Initialize USCI state machine IE2 = UCA0RXIE; // Enable USCI_A0 RX interrupt MRFI_WakeUp(); MRFI_RxOn(); index_output=0; bis_sr_register(gie+lpm4_bits); void MRFI_RxCompleteISR() {uint8_t i; P1OUT ^= 0x02; mrfipacket_t packet; MRFI_Receive(&packet); char output[] = {" "; for (i=9;i<29;i++) { output[i-9]=packet.frame[i]; if (packet.frame[i]=='\r') {output[i-9]='\n'; output[i-8]='\r'; TXString(output, (sizeof output)); #pragma vector=usciab0rx_vector interrupt void USCI0RX_ISR(void) {char rx = UCA0RXBUF; uint8_t i; packettosend.frame[index_output]=rx; index_output++; if (rx=='\r' index_output==29) { packettosend.frame[0]=28; MRFI_Transmit(&packetToSend, MRFI_TX_TYPE_FORCED); index_output = 9; for(i=9;i<29;i++) { packettosend.frame[i]=' '; P1OUT ^= 0x01; P1OUT ^= 0x02; TXString(&rx, 1); - 70 -

Το παραπάνω παράδειγμα είναι μια ολοκληρωμένη σύνθεση RF επικοινωνίας. Ενεργοποιεί το ενσωματωμένο UART και στέλνει μηνύματα από ένα τερματικό παράθυρο στον buffer του CC2500, το οποίο με τη σειρά του το στέλνει στο άλλο CC2500 που προωθεί το μήνυμα σε ένα άλλο τερματικό παράθυρο. ΑΣΚΗΣΗ 1. Ενημερωθείτε από το manual του μικροελεγκτή για τα χαρακτηριστικά του(ηλεκτρικά χαρακτηριστικά, καταχωρητές, περιφερειακά). Ενημερωθείτε από το manual του πομποδέκτη για τα χαρακτηριστικά του(ηλεκτρικά χαρακτηριστικά, καταχωρητές, συχνότητα εκπομπής, ισχύς εκπομπής, περιφερειακά). Ενημερωθείτε για το πρωτόκολλο SimpliciTI. 2. Προτείνεται τρόπους υπολογισμού της κατανάλωσης ισχύος του αναπτυξιακού χρησιμοποιώντας τη βάση με τις μπαταρίες. 3. Δημιουργήστε κατάλληλο workspace για την άσκηση με project το παράδειγμα 1. Σε νέο project στο ίδιο workspace τροποποιείστε το παράδειγμα 1 έτσι ώστε να ενεργοποιούνται τα led όταν πατηθεί το ενσωματωμένο button. 4. Δημιουργήστε κατάλληλο workspace για RF επικοινωνία με project το παράδειγμα 2. Δείτε στην πράξη πως λειτουργεί ο κώδικας και εξηγήστε. Προτείνετε τρόπους βελτιστοποίησης. 5. Αφού ενημερωθήκατε για τη συχνότητα εκπομπής του αναπτυξιακού τροποποιείστε το project με το παράδειγμα 2 προσθέτοντας τις παρακάτω γραμμές κώδικα όπου χρειάζεται αφού τις συμπληρώσετε με τις κατάλληλες τιμές: #include "radios/family1/mrfi_spi.h".... mrfispiwritereg(channr,???? ); Εξηγήστε πως βοηθά αυτό στη λειτουργία του προγράμματος. 6. Αφού ενημερωθήκατε για τη εκπομπή ισχύς του πομποδέκτη τροποποιείστε το project με το παράδειγμα 2 προσθέτοντας τις παρακάτω γραμμές όπου χρειάζεται και ελέγξτε τη λειτουργία του για διάφορες τιμές: #include "radios/family1/mrfi_spi.h".... mrfispiwritereg(patable,???? ); Εξηγήστε πως επιδρά στη λειτουργία του πομποδέκτη. 7. Δημιουργήστε κατάλληλο workspace για RF επικοινωνία με project το παράδειγμα 3. Δείτε τη λειτουργία του. Εξηγήστε με διάγραμμα ροής. Βελτιστοποιήστε αν χρειάζεται χρησιμοποιώντας και τις παραπάνω γραμμές κώδικα. - 71 -

- 72 -

Εισαγωγή στο Code Composer Studio v4 (IDE) Το Code Composer Studio (CCStudio) είναι ένα ολοκληρωμένο περιβάλλον ανάπτυξης για DSPs και μικροελεγκτές της ΤΙ. Περιλαμβάνει μια σουίτα εργαλείων που χρησιμοποιούνται για την ανάπτυξη και τον εντοπισμό σφαλμάτων στις ενσωματωμένες εφαρμογές. Περιλαμβάνει μεταγλωττιστές για κάθε μία από τις οικογένειες της ΤΙ, συντάκτη πηγαίου κώδικα, εντοπισμό σφαλμάτων και πολλά άλλα χαρακτηριστικά. Το CCStudio παρέχει οικεία εργαλεία και επιτρέπει στον χρήστη να ξεκινήσει πιο γρήγορα από ποτέ και προσθέτει λειτουργικότητα στην εφαρμογή του χάρη στα εξελιγμένα εργαλεία του. Εγκατάσταση 1. Θα βρείτε το αρχείο εγκατάστασης του CCStudio είτε στο cd που περιέχεται στα αναπτυξιακά εργαλεία της TI είτε τη νεότερη έκδοση στο www.ti.com. 2. Έχει αρκετά εύκολο παραθυριακό setup Έναρξη CCStudio Για να ανοίξουμε το CCStudio: Έναρξη όλα τα προγράμματα Texas Instruments Code Composer Studio v4 Code Composer Studio v4 Core Edition - 73 -

Δημιουργία νέου project - Ρυθμίσεις Η δομή του CCStudio(όπως και του IAR IDE) αποτελείται ιεραρχικά από: Workspace (που περιέχει project-projects) Project (που περιέχει file-files) File Στην πρώτη οθόνη που βλέπουμε επιλέγουμε το φάκελο του workspace που θα εργαστούμε και έπειτα βλέπουμε την αρχική οθόνη του CCStudio. 1. File New CCS Project - 74 -

2. π.χ. New Project Next 3. Επιλέγουμε Full C/C++ Indexer Next - 75 -

4. Ορίζουμε στο παράθυρο τις ρυθμίσεις σύμφωνα με τον μικροελεγκτή που θέλουμε να προγραμματίσουμε. Αν το πρόγραμμα μας θα είναι σε assembly πρέπει να επιλέξουμε Treat as an Assembly-only project. 5. Finish Βλέπουμε το νέο project στο αριστερό παράθυρο του CCStudio. 6. Εισάγουμε το αρχείο με τον κώδικα που θέλουμε π.χ. msp430x20x3_1.c κάνοντας δεξί κλικ στο New project [Active Debug] Add Files to Project... msp430x20x3_1.c και Open. και το βλέπουμε με διπλό κλικ. 7. Τώρα είμαστε έτοιμοι να κάνουμε compile:menu Project Rebuild all. Προσέχουμε για λάθη στο παράθυρο μηνυμάτων!!!! 8. Συνεχίζουμε με Target Debug Active Project αφού συνδέσουμε κατάλληλα τον μικροελεγκτή που θα προγραμματίσουμε και βλέπουμε την παρακάτω οθόνη: - 76 -

Debugging Tα «εργαλεία» μπορούμε να τα δούμε μέσω του μενού View 1. Όπως βλέπουμε ο κέρσορας βρίσκεται στην πρώτη εκτελέσιμη γραμμή του προγράμματός. Έχουμε δύο επιλογές: Άμεση εκτέλεση Βηματική εκτέλεση 2. Βηματική εκτέλεση προγράμματος Ανοίγουμε το μενού των καταχωρητών από το View Registers Πρακτικά πατώντας Target Step Into βλέπουμε ότι εκτελέστηκε η πρώτη γραμμή του προγράμματος και ο έλεγχος πέρασε στη δεύτερη γραμμή που είναι έτοιμη να εκτελεστεί. 3. Σε κάθε εντολή μπορούμε να ελέγχουμε τους καταχωρητές που εμπλέκονται, οι οποίοι εμφανίζονται στο μενού Registers ανά ομάδες. 4. Για να σταματήσουμε τη διαδικασία του Debugging πατάμε Target Terminate All Σχόλια Γενικά το CCStudio είναι ένα αναπτυξιακό περιβάλλον με πολλές δυνατότητες. Σε σύγκριση με το IAR(IDE) υστερεί σε ένα βασικό κομμάτι, δεν υποστηρίζει simulation(προσομοίωση), αλλά υπερτερεί σε άλλα. Υποστηρίζει αυτόματη σύνδεση για νεότερες εκδόσεις διορθώνοντας τυχόν λάθη με πολύ καλή υποστήριξη, έχει πολύ καλό σύστημα βοήθειας για όλες τις λειτουργίες του και σε σχέση με το IAR(IDE) υποστηρίζει 16ΚΒ κώδικα στον compiler για C/C++. Γενικά στέκεται αρκετά καλά σε επίπεδο λειτουργιών και επιλογών του debugger δίνοντας την ευκολία που χρειάζεται με τα τόσα εργαλεία. Ας μην ξεχνάμε ότι βασίζεται στο γνωστό αναπτυξιακό περιβάλλον ανοιχτού κώδικα Eclipse, το οποίο είναι δοκιμασμένο και σταθερό στο χρόνο. - 77 -

- 78 -

Εισαγωγή Μια οθόνη υγρών κρυστάλλων (LCD), είναι μια λεπτή, επίπεδη ηλεκτρονική οθόνη που χρησιμοποιεί τις ιδιότητες των υγρών κρυστάλλων (LCS). Οι υγροί κρύσταλλοι δεν εκπέμπουν φως άμεσα. Απαιτείται επομένως μια φωτεινή πηγή για να λειτουργήσουν και γι αυτό έχουν χαρακτηριστεί ως «παθητικές» οθόνες. Οι πιο κοινές οθόνες LCD βασίζονται στην κλασική Hitachi HD44780 ή σε άλλες συμβατές με την HD44580. Παρακάτω, θα δούμε οθόνες LCD χαρακτήρων και τη διασύνδεση τους με τον μικροελεγκτή MSP430F2013 με 4-bit. Pinout Παρακάτω βλέπουμε το pinout για μια οθόνη χαρακτήρων LCD 2x16-79 -

Εντολές Από τον παραπάνω πίνακα βγαίνουν οι παρακάτω εντολές για πιο εύκολη μεταχείριση με τον μικροελεγκτή. - 80 -

Αρχικοποίηση και σύνδεση Ανάλογα με το μοντέλο μπορεί και να μπορεί να λειτουργήσει και με τροφοδοσία 3.7V. Αν δεν γίνεται αυτό θα πρέπει να χρησιμοποιηθεί κατάλληλη διάταξη(π.χ. buffer) για να λειτουργήσει με τάση 5V. Γενικά εκτός από την τροφοδοσία η σύνδεση με τον μικροελεγκτή γίνεται συνδέοντας μόνο 4-bits δεδομένων και 2 ακόμα για Enable/Register Select. Το Read/Write το συνδέουμε στο ground αφού μόνο γράφουμε. Παρακάτω βλέπουμε τη ρουτίνα αρχικοποίησης για λειτουργία 4-bit. - 81 -