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

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

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

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

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

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

Embedded Systems Laboratory LAB 06 CLKS-a

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

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

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

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

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

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

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

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

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

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

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

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

WDT και Power Up timer

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

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

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

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

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

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

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

Περιεχόµενα. I Βασικές Γνώσεις 1

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

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

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

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

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

δειγμα ΠΕΡΙΕΧΟΜΕΝΑ 2. Τεχνολογία και P.L.C Βλέποντας το Hardware του Twido P.L.C Γενική δοµή ενός συστήµατος αυτοµατισµού 14

Σηµαντικές παρατηρήσεις σχετικά µε το backround:

Ενότητα 4. Εισαγωγή στην Πληροφορική. Αναπαράσταση δεδοµένων. Αναπαράσταση πληροφορίας. υαδικοί αριθµοί. Χειµερινό Εξάµηνο

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

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

Σελίδα 1 από 12. Απαντήσεις στο φυλλάδιο 55. Ερώτηση 1 η : Ένα υπολογιστικό σύστηµα αποτελείται από:

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

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο

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

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

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

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

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

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο

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

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

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

ΑΣΚΗΣΗ 3 ΑΣΚΗΣΗ 3. Μηχανικοί ιακόπτες. Αρχιτεκτονική Η/Υ ΗΜΟΣ ΜΠΟΛΑΝΑΚΗΣ

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

ΤΕΙ Κρήτης, Παράρτηµα Χανίων

Σηµαντικές παρατηρήσεις σχετικά µε το backround:

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

Μοντέλα. χαρακτηριστικά χωρίς να συνοδεύεται από λεπτοµέρειες.

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο

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

Αρχιτεκτονική Μικροεπεξεργαστών MIPS-32. Αρχείο καταχωρητών και Χάρτης Μνήµης

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

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

ΗΥ220: Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Πανεπιστήµιο Κρήτης Χειµερινό Εξάµηνο

ίοδοι Εκποµπής Φωτός

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

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

Ψηφιακή Επεξεργασία Σήματος

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

Εργαστήριο ΙΑΧΕΙΡΙΣΗ ΜΝΗΜΗΣ

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

Εφαρµογές Πληροφορικής Υπολογιστών. Κεφάλαιο 3 Το υλικό του υπολογιστή

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

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

8051 Interrupt Ports. Name Alternate Function

; Οι HL δείχνουν την επόµενη θέση µνήµης MVI A, 38H CMP H JNZ DO_FLMEM ; POP B. ; Ανάκτηση καταχωρητών απο το σωρό.

ΣΥΣΚΕΥΕΣ ΑΠΟΘΗΚΕΥΣΗΣ (ΜΝΗΜΗ)

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

THERMOMETER TC-101 ΕΓΧΕΙΡΙ ΙΟ ΕΓΚΑΤΑΣΤΑΣΗΣ ΚΑΙ ΧΡΗΣΗΣ. 7/12/2011 AUTOGUARD-PG Σελ.1 7/12/2011 AUTOGUARD-PG Σελ.2

Η συχνότητα f των παλµών 0 και 1 στην έξοδο Q n είναι. f Qn = 1/(T cl x 2 n+1 )

Κεφάλαιο Το υπολογιστικό σύστημα Η εξέλιξη του ανθρώπου πραγματοποιήθηκε χάρη στην ικανότητά στον χειρισμό εργαλείων.

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

Μετρήσεις και συλλογή δεδομένων (Data acquisition) με μικροελεγκτές. Εισαγωγή στο Arduino. Ηλεκτρομηχανολογικός εξοπλισμός διεργασιών

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

Γνωριμία με το Arduino

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

ΨΗΦΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Γ ΕΠΑΛ 14 / 04 / 2019

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

Το εσωτερικό ενός PC. Τεχνολογία Η/Υ & Πληροφοριών - 05 Κεντρική μονάδα Χουρδάκης Μανόλης

Εργαστήριο 3 ΟΡΓΑΝΩΣΗ ΤΗΣ ΚΜΕ. Εισαγωγή

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

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

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

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

Μάθημα 3.8 Τεχνικές μεταφοράς δεδομένων Λειτουργία τακτικής σάρωσης (Polling) Λειτουργία Διακοπών DMA (Direct Memory Access)

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

Transcript:

Περιεχόµενα Τίτλος Σελ. Θεωρία : Θεωρητική εισαγωγή στους µικροελεγκτές MSP430...... 6 Μικροελεγκτές γενικά....................................... 6 Μικροελεγκτές vs. Μικροεπεξεργαστές.................. 6 Οικογένειες MSP430........................................ 7 ez430-f2013 και βασική πλακέτα......................... 10 IAR Embedded Workbench................................ 11 RF επικοινωνία µε το ez430-rf2500..................... 12 Χαµηλού κόστους γνωριµία µε τους MSP430............ 12 Άσκηση 1 η : Εισαγωγή στην οικογένεια µικροελεγκτών MSP430F20xx...... 14 Αρχιτεκτονική MSP430..................................... 15 Καταχωρητές................................................. 16 ιευθυνσιοδότηση........................................... 17 Μνήµη......................................................... 18 Τρόποι λειτουργίας.......................................... 21 Περιφερειακά................................................. 23 Μακροεντολές................................................ 23 Άσκηση....................................................... 23 Άσκηση 2 η : Εισαγωγή στο eζ430-f2013 µε χρήση του IAR Embedded Workbench, ενός αναπτυξιακού περιβάλλοντος για τα MSP430................................................................ 24 Παρουσίαση και Εγκατάσταση ez430.................... 25 Έναρξη IAR Embedded Workbench...................... 25 ηµιουργία νέου project.................................... 26 Ρυθµίσεις-Compiling........................................ 27 Debugging.................................................... 28 Άσκηση........................................................ 29 Άσκηση 3 η : Λειτουργίες Εισόδου εξόδου (Digital I/O)........................ 30 Εισαγωγή...................................................... 31 Καταχωρητές................................................. 31 Παραδείγµατα................................................ 33 Άσκηση........................................................ 34 Άσκηση 4 η : Αριθµητικές και λογικές πράξεις Εφαρµογές................... 36 Πράξεις µε τις ψηφιακές εισόδους......................... 37 Λειτουργία πληκτρολογίου 4x4............................ 38 Άσκηση........................................................ 40 Άσκηση 5 η : Σήµατα διακοπής (Interrupts)....................................... 42 Εισαγωγή...................................................... 43 Καταχωρητές................................................. 43 Παραδείγµατα................................................ 44 Άσκηση........................................................ 47 Άσκηση 6 η : Χρονιστές / Απαριθµητές (Timers)................................. 48 Εισαγωγή...................................................... 49 Basic Clock Module......................................... 49 Watchdog timer.............................................. 51 Timer A........................................................ 51 Capture-Compare modes.................................... 52-4 -

Καταχωρητές................................................. 53 Σήµατα διακοπής............................................. 54 Παραδείγµατα................................................ 54 Άσκηση........................................................ 58 Άσκηση 7 η : Μετατροπέας αναλογικού σήµατος σε ψηφιακό µε Σίγµα έλτα ιαµόρφωση (SD16)......................................... 60 A/DC Γενικά.................................................. 61 Σίγµα έλτα ιαµόρφωση(σ )-Block ιάγραµµα...... 61 Καταχωρητές του SD16_A................................. 62 Modes - Temp Sensor....................................... 63 Παραδείγµατα................................................ 64 Άσκηση........................................................ 65 Άσκηση 8 η : Σειριακή επικοινωνία(usi).......................................... 66 Εισαγωγή...................................................... 67 SPI............................................................. 67 I 2 C.............................................................. 68 Καταχωρητές................................................. 68 Παραδείγµατα................................................ 68 Άσκηση........................................................ 75 Άσκηση 9 η : Εισαγωγή στην RF επικοινωνία µε χρήση του ez430 - RF2500...................................................... 76 Εισαγωγή-Παρουσίαση του ez430-rf2500............. 77 Εγκατάσταση του ez430-rf2500......................... 78 Εισαγωγή στον ποµποδέκτη CC2500..................... 78 Sensor Monitor Visualizer.................................. 79 SimpliciTI..................................................... 80 Παραδείγµατα................................................ 81 Άσκηση........................................................ 84 Παράρτηµα 1 ο : Εισαγωγή στο Code Composer Studio (CCStudio) IDE...... 86 Εισαγωγή στο Code Composer Studio v4 (IDE)........ 87 Εγκατάσταση................................................. 87 Έναρξη CCStudio............................................ 87 ηµιουργία νέου project Ρυθµίσεις..................... 88 Debugging.................................................... 91 Σχόλια......................................................... 91 Παράρτηµα 2 ο : Οδήγηση οθόνης υγρών κρυστάλλων 2x16...................... 92 Εισαγωγή...................................................... 93 Pinout.......................................................... 93 Εντολές........................................................ 94 Αρχικοποίηση και σύνδεση................................. 95 LCD driver header for MSP430(ο κώδικας)............. 96 Παράρτηµα 3 ο : Βοηθητικές πλακέτες PCB......................................... 100 Εισαγωγή...................................................... 101 Κεντρική πλακέτα προγραµµατισµού..................... 101 Πλακέτα πληκτρολογίου 4x4(keypad).................... 102 Πλακέτα προγραµµατισµού MSP430x20x DIP.......... 103 Βιβλιογραφία Χρησιµοποιούµενη βιβλιογραφία.................................... 104 Έγγραφα και βιβλία.......................................... 104 Internet Sites.................................................. 104-5 -

Μικροελεγκτές γενικά Ο µικροελεγκτής είναι ένας τύπος επεξεργαστή, ουσιαστικά µια παραλλαγή µικροεπεξεργαστή, ο οποίος µπορεί να λειτουργήσει µε ελάχιστα εξωτερικά εξαρτήµατα, λόγω των πολλών ενσωµατωµένων υποσυστηµάτων που διαθέτει. Χρησιµοποιείται ευρύτατα σε όλα τα ενσωµατωµένα συστήµατα (embedded systems) ελέγχου χαµηλού και µεσαίου κόστους, όπως αυτά που χρησιµοποιούνται σε αυτοµατισµούς, ηλεκτρονικά καταναλωτικά προϊόντα (από ψηφιακές φωτογραφικές µηχανές έως παιχνίδια), ηλεκτρικές συσκευές και κάθε είδους αυτοκινούµενα τροχοφόρα οχήµατα. Με τη µείωση του µεγέθους, του κόστους, και της κατανάλωσης ισχύος έναντι ενός µικροεπεξεργαστή, οι µικροελεγκτές καθιστούν οικονοµικό τον έλεγχο (ηλεκτρονικά) στις πολλές περισσότερες διαδικασίες. Μικροελεγκτές vs. Μικροεπεξεργαστές Στους σύγχρονους µικροεπεξεργαστές για µη ενσωµατωµένα συστήµατα (πχ τους µικροεπεξεργαστές των προσωπικών υπολογιστών), δίνεται έµφαση στην υπολογιστική ισχύ. Η ευελιξία ανάπτυξης διαφορετικών εφαρµογών είναι µεγάλη, καθώς η λειτουργικότητα του τελικού συστήµατος καθορίζεται από τα εξωτερικά περιφερειακά τα οποία διασυνδέονται µε την κεντρική µονάδα (µικροεπεξεργαστή), η οποία δεν είναι εξειδικευµένη. Αντίθετα, στους µικροεπεξεργαστές για ενσωµατωµένα συστήµατα (µικροελεγκτές), οι οποίοι έχουν µικρότερες ή και µηδαµινές δυνατότητες συνεργασίας µε εξωτερικά περιφερειακά, αυτού του είδους, η ευελιξία είναι περιορισµένη, καθώς και η υπολογιστική ισχύς. Οι µικροελεγκτές δίνουν έµφαση στο µικρό αριθµό ολοκληρωµένων κυκλωµάτων που απαιτείται για τη λειτουργία µιας συσκευής, το χαµηλό κόστος και την εξειδίκευση. Αναλυτικά, τα πλεονεκτήµατα των µικροελεγκτών είναι: Αυτονοµία, µέσω της ενσωµάτωσης σύνθετων περιφερειακών υποσυστηµάτων όπως µνήµες και θύρες επικοινωνίας. Έτσι πολλοί µικροελεγκτές δεν χρειάζονται κανένα άλλο ολοκληρωµένο κύκλωµα για να λειτουργήσουν. Η ενσωµάτωση περιφερειακών σηµαίνει ευκολότερη υλοποίηση εφαρµογών λόγω των απλούστερων διασυνδέσεων. Επίσης, οδηγεί σε χαµηλότερη κατανάλωση ισχύος, µεγιστοποιώντας τη φορητότητα και ελαχιστοποιεί το κόστος της συσκευής στην οποία ενσωµατώνεται ο µικροελεγκτής. Χαµηλό κόστος. Μεγαλύτερη αξιοπιστία, και πάλι λόγω των λιγότερων διασυνδέσεων. Μειωµένες εκποµπές ηλεκτροµαγνητικών παρεµβολών και µειωµένη ευαισθησία σε αντίστοιχες παρεµβολές από άλλες ηλεκτρικές και ηλεκτρονικές συσκευές. Το πλεονέκτηµα αυτό προκύπτει από το µικρότερο αριθµό και µήκος εξωτερικών διασυνδέσεων καθώς και τις χαµηλότερες ταχύτητες λειτουργίας. Περισσότεροι διαθέσιµοι ακροδέκτες για ψηφιακές εισόδους-εξόδους (για δεδοµένο µέγεθος ολοκληρωµένου κυκλώµατος), λόγω της µη δέσµευσής τους για τη σύνδεση εξωτερικών περιφερειακών. Μικρό µέγεθος συνολικού υπολογιστικού συστήµατος. - 6 -

Οικογένειες MSP430 Οικογένεια MSP430x1xx Η οικογένεια MSP430x1xx είναι η βασική σειρά των MSP430 χωρίς ενσωµατωµένο οδηγό για οθόνη υγρών κρυστάλλων(lcd). Είναι γενικά µικρότερα από της οικογένειας MSP430x3xx. Έχοντας Flash ή ROM µνήµη προσφέρουν 8 MIPS, 1.8 3.6 V τάση λειτουργίας, µέχρι 60 KB Flash, καθώς και ένα ευρύ φάσµα της αναλογικών και ψηφιακών περιφερειακών. Χαρακτηριστικά ισχύος χαµηλά µέχρι... o 0.1 µa RAM retention o 0.7 µa real-time clock mode o 200 µa / MIPS active o Feature Fast Wake-Up From Standby Mode in <6 µs Χαρακτηριστικά Συσκευών o Μνήµη Flash: 1 60 KB o Μνήµη ROM: 1 16 KB o Μνήµη RAM: 512 B 10 KB o Επιλογές GPIO: 14, 22, 48 pins o Επιλογές ADC: Slope, 10 & 12-bit SAR Ενσωµατωµένα περιφερειακά o Analog Comparator o DMA o Hardware Multiplier o SVS o 12-bit DAC Οικογένεια MSP430x2xx Οι µικροελεγκτές της οικογένειας MSP430F2xx είναι παρόµοιοι µε της οικογένειας MSP430x1xx, αλλά λειτουργούν µε χαµηλότερη κατανάλωση ενέργειας, υποστηρίζοντας µέχρι και 16 MHz λειτουργίας. Έχουν και πιο σταθερό ενσωµατωµένο ρολόι (±2%) που τους δίνει την επιλογή να µην χρησιµοποιούν εξωτερικό κρύσταλλο. Έχοντας Flash ή ROM µνήµη προσφέρουν 1.8 3.6 V τάση λειτουργίας. Έχουν ενσωµατωµένο ταλαντωτή (VLO), εσωτερικούς pull-up/pulldown αντιστάτες και επιλογές και λίγων GPIO. Χαρακτηριστικά ισχύος χαµηλά µέχρι... o µa RAM retention o 0.3 µa Standby mode (VLO) o 0.7 µa real-time clock mode o 220 µa / MIPS active o Feature Ultra-Fast Wake-Up From Standby Mode in <1 µs Χαρακτηριστικά Συσκευών o Μνήµη Flash: 1 120 KB o Μνήµη RAM: 128 B 8 KB o Επιλογές GPIO: 10, 16, 24, 32, 48, 64 pins o Επιλογές ADC: Slope, 10 & 12-bit SAR, 16-bit Sigma Delta Ενσωµατωµένα περιφερειακά o Analog Comparator - 7 -

o Hardware Multiplier o DMA o SVS o 12-bit DAC o Op Amps Οικογένεια MSP430xG2xx Στην οικονοµική οικογένεια MSP430G2xx προσφέρονται συσκευές µε µνήµες flash µε 16 MIPS και 1.8 3.6 V τάσης λειτουργίας. Έχουν ενσωµατωµένο ταλαντωτή (VLO), εσωτερικούς pull-up/pull-down αντιστάτες και επιλογές και λίγων GPIO. Γενικά προσφέρουν απόδοση 16-bit σε τιµές 8-bit. Χαρακτηριστικά ισχύος χαµηλά µέχρι...2.2v o µa RAM retention o 0.4 µa Standby mode (VLO) o 0.7 µa real-time clock mode o 220 µa / MIPS active o Ultra-Fast Wake-Up From Standby Mode in <1 µs Χαρακτηριστικά Συσκευών o Μνήµη Flash: 0.5 2 KB o Μνήµη RAM: 128 B o Επιλογές GPIO: 10, 16, 24 pins o Επιλογές ADC: Slope, 10-bit SAR Ενσωµατωµένα περιφερειακά o Analog Comparator Οικογένεια MSP430x3xx Η οικογένεια MSP430x3xx είναι η πιο παλιά και σχεδιάστηκε για φορητές εφαρµογές έχοντας ενσωµατωµένο οδηγό για οθόνη υγρών κρυστάλλων(lcd). εν υποστηρίζει µνήµη EEPROM, µόνο ROM και UV-διαγράψιµη και µιας φοράς προγραµµατιζόµενη EPROM. Οι επόµενες οικογένειες υποστηρίζουν µόνο flash και ROM µνήµες. Τάση λειτουργίας 2.5 5.5 V και µνήµες µέχρι 32 KB ROM. Χαρακτηριστικά ισχύος χαµηλά µέχρι... o µa RAM retention o 0.9 µa real-time clock mode o 160 µa / MIPS active o Feature Fast Wake-Up From Standby Mode in <6 µs Χαρακτηριστικά Συσκευών o Μνήµη ROM: 2 32 KB o Μνήµη RAM: 512 B 1 KB o Επιλογές GPIO: 14, 40 pins o Επιλογές ADC: Slope, 14-bit SAR Ενσωµατωµένα περιφερειακά o Οδηγός LCD o Hardware Multiplier - 8 -

Οικογένεια MSP430x4xx Οι συσκευές στην οικογένεια MSP430x4xx είναι παρόµοιες µε της MSP430x3xx, και ενσωµατώνουν επίσης οδηγό για LCD, αλλά είναι µεγαλύτερες και πιο ικανές. Έχοντας Flash ή ROM µνήµη προσφέρουν 8-16 MIPS σε 1.8 3.6 V τάση λειτουργίας, ενσωµατώνουν FLL και SVS. Ιδανικά για χαµηλής ισχύος µετρητικά συστήµατα και ιατρικές εφαρµογές. Χαρακτηριστικά ισχύος χαµηλά µέχρι... o µa RAM retention o 0.7 µa real-time clock mode o 200 µa / MIPS active o Feature Fast Wake-Up From Standby Mode in <6 µs Χαρακτηριστικά Συσκευών o Flash/ROM Options: 4 kb 120 KB o RAM Options: 256 B 8 KB o GPIO Options: 14, 32, 48, 56, 68, 72, 80 pins o ADC Options: Slope, 10 &12-bit SAR, 16-bit Sigma Delta Ενσωµατωµένα περιφερειακά o Οδηγός LCD o Analog Comparator o 12-bit DAC o DMA o Hardware Multiplier o Op Amp o USCI Modules Οικογένεια MSP430x5xx Οι συσκευές της οικογένειας MSP430x5xx δουλεύουν µέχρι 25 MHz, έχουν µνήµη flash µέχρι 256 kb και µνήµη RAM µέχρι 16 kb. Έχουν ελάχιστη κατανάλωση φτάνοντας επιδόσεις όπως 25 MIPS σε 1.8-3.6 V τάση λειτουργίας (165 ua/mips). Ενσωµατώνει ένα µοναδικό περιφερειακό διαχείρισης ενέργειας για απόλυτα χαµηλή. Πολλές συσκευές έχουν ενσωµατωµένο οδηγό για USB. Χαρακτηριστικά ισχύος χαµηλά µέχρι... o µa RAM retention o 2.5 µa real-time clock mode o 165 µa / MIPS active o Feature Fast Wake-Up From Standby Mode in <5 µs Χαρακτηριστικά Συσκευών o Flash Options: up to 256 KB o RAM Options: up to 16 KB o ADC Options: 10 & 12-bit SAR Ενσωµατωµένα περιφερειακά o USB o Analog Comparator o DMA o Hardware Multiplier o RTC o USCI o 12-bit DAC - 9 -

ez430-f2013 και βασική πλακέτα Το ez430-f2013 είναι ένα πλήρες αναπτυξιακό εργαλείο παρέχοντας το κατάλληλο υλικό και λογισµικό για την αξιολόγηση του MSP430F2013 σε µια βολική µορφή USB stick που χρησιµοποιεί SpyBiWire προγραµµατιστή (2 pins σε αντίθεση µε το κλασικό JTAG που χρησιµοποιεί 4 pins).προσφέρει και τα 14 pins του MSP430F2013 έτοιµα για χρήση και σύνδεση. Για την καλύτερη κατανόηση, ευκολία και λειτουργικότητα σχεδιάστηκε η βασική πλακέτα για την τοποθέτηση του ez430-f2013 και τον έλεγχό του. Στην πλακέτα αυτή έχει τοποθετηθεί µια βάση για την τοποθέτηση του ez430-f2013 καθώς και µια σειρά από buttons για το port 1 του µικροελεγκτή σε συνδυασµό µε led για τον οπτικό έλεγχο των προγραµµάτων. - 10 -

IAR Embedded Workbench Το IAR Embedded Workbench για τους µικροελεγκτές MSP430 είναι ένα ολοκληρωµένο περιβάλλον ανάπτυξης (IDE) για τον προγραµµατισµό και την αποσφαλµάτωση ενσωµατωµένων εφαρµογών. Ο περιορισµός του κώδικα σε C / C++ είναι 4 KΒ για τις παραδοσιακές συσκευές MSP430 και 8 KΒ για MSP430X συσκευές µε > 60KB Flash. Με πολύ οικείο γραφικό περιβάλλον και πληθώρα επιλογών βοηθά στην κατανόηση του κώδικα από το χρήστη. - 11 -

RF επικοινωνία µε το ez430-rf2500 Το ez430-rf2500 είναι ένα ολοκληρωµένο αναπτυξιακό εργαλείο που περιλαµβάνει όλο το υλικό και το λογισµικό που απαιτείται για την λειτουργία ενός ασύρµατου συστήµατος µε τους MSP430 σε ένα USB stick. Χρησιµοποιεί τον MSP430F22x4 και τον CC2500, έναν πολυκάναλο ποµποδέκτη RF για χαµηλής ισχύος ασύρµατες εφαρµογές. Ο USB προγραµµατιστής του ez430-rf2500 προσφέρει έναν ελεγκτή UART δηµιουργώντας µια θύρα για απευθείας σειριακή επικοινωνία µε το αναπτυξιακό. Επίσης µπορεί να προγραµµατίσει και τις εκδόσεις των ez430-f2013 και ez430-f2012. Στο πακέτο του RF2500 περιέχεται ότι χρειάζεται για µια πρώτη γνωριµία στα ασύρµατα δίκτυα αισθητήρων(wsn). Χαµηλού κόστους γνωριµία µε τους MSP430 Με έναν πρόχειρο υπολογισµό µπορούµε να δούµε πως για µια ολοκληρωµένη επαφή µε τους MSP430 µέσα από µια σειρά ασκήσεων χρησιµοποιώντας τα αναπτυξιακά εργαλεία που παρουσιάστηκαν παραπάνω, το λογισµικό, την βασική πλακέτα που σχεδιάστηκε γι αυτό το σκοπό αλλά και προσθέτοντας κάποια εξαρτήµατα ακόµα όπως:buzzer, keypad, σερβοκινητήρας, LCD κλπ ez430-f2013 $20.00 17 ez430-rf2500 $49.00 41 IAR Embedded Workbench Kickstart (4KB) Free Κεντρική πλακέτα προγραµµατισµού(pcb και υλικά) Περίπου 20 Άλλα εξαρτήµατα Μέχρι 20 ΣΥΝΟΛΟ 98-12 -

- 13 -

- 14 -

Αρχιτεκτονική 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-15 -

Καταχωρητές 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. - 16 -

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

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

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

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

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

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

Περιφερειακά Μπορούµε να αναφερθούµε και να κατατάξουµε τα περιφερειακά συστήµατα της οικογένειας µικροελεγκτών MSP430 σε 4 κατηγορίες: 1. Timers Basic Clock Module / Basic Timer1 / 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. Επιπρόσθετα περιφερειακά LCD Modules Op-amps Η οµάδα των MSP430 που θα ασχοληθούµε εµφανίζεται στον παρακάτω πίνακα. Μακροεντολές εικ.15 Οι µακροεντολές εµφανίζονται στον προγραµµατισµό των µικροελεγκτών. Τόσο στην C αλλά και στην Assembly, όπως θα δούµε στα επόµενα εργαστηριακά µαθήµατα πρέπει να ορίσουµε τη βιβλιοθήκη µακροεντολών του µικροελεγκτή που θα προγραµµατίσουµε, την οποία θα πρέπει να είµαστε σε θέση να διαβάζουµε κατανοώντας τους ορισµούς των καταχωρητών και τις τιµές τους. Άσκηση 1. Αναγνωρίστε από το datasheet του µικροελεγκτή που θα χρησιµοποιηθεί στις επόµενες εργαστηριακές ασκήσεις τα πλήρη ηλεκτρικά χαρακτηριστικά και καταγράψτε τα. 2. Αναγνωρίστε από το User s Guide του µικροελεγκτή που θα χρησιµοποιηθεί στις επόµενες εργαστηριακές ασκήσεις τα περιφερειακά που υποστηρίζει και καταγράψτε τα. - 23 -

- 24 -

Παρουσίαση του 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 - 25 -

ηµιουργία νέου 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 - 26 -

Ρυθµίσεις-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-27 -

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-28 -

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-29 -

- 30 -

Εισαγωγή Οι µικροελεγκτές 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). - 31 -

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 θα ασχοληθούµε σε επόµενο εργαστήριο. - 32 -

Παραδείγµατα 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); - 33 -

Άσκηση 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=χρόνος διάρκειας παύλας. - 34 -

- 35 -

- 36 -

Πράξεις µε τις ψηφιακές εισόδους Στην άσκηση αυτή θα ασχοληθούµε µε αριθµητικές αλλά και λογικές πράξεις µε τον 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-37 -

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

Ο κώδικας που το υλοποιεί σε 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); - 39 -

ΑΣΚΗΣΗ 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. Τέλος τροποποιείστε ξανά και τυπώστε το ονοµατεπώνυµό σας µε λατινικούς χαρακτήρες. - 40 -

- 41 -

- 42 -

Εισαγωγή Τα σήµατα διακοπής συνιστούν, ουσιαστικά, µια τεχνική αντίδρασης του µικροεπεξεργαστή. Σύµφωνα µε αυτήν, η 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 θα ασχοληθούµε στο επόµενο µάθηµα θα δούµε κάποια παραδείγµατα που έχουν να κάνουν µε τα σήµατα διακοπής του που ορίζονται σχετικά εύκολα. - 43 -

Παραδείγµατα Ορισµός του 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. Το πώς ορίζονται οι ρουτίνες υπηρέτησης των σηµάτων διακοπής - 44 -

Παράδειγµα 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 - 45 -

Παράδειγµα 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 - 46 -

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

- 48 -

Εισαγωγή Όταν µιλάµε για χρονιστές/απαριθµητές (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 - 49 -

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

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 τρόπους λειτουργίας: - 51 -

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. - 52 -

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

Σήµατα ιακοπής Ανάλογα µε τη λειτουργία του χρονιστή µπορούµε να χρησιµοποιήσουµε/λάβουµε διαφορετικά σήµατα διακοπής. 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-54 -

Παράδειγµα 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 ; ;------------------------------------------------------------------------------- - 55 -

; 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 - 56 -

Παράδειγµα 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 - 57 -

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. Εφαρµόστε στο αναπτυξιακό και σχολιάστε τη λειτουργία τους. - 58 -

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

- 60 -

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 - 61 -

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

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

Παραδείγµατα Παράδειγµα 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; - 64 -

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 σε ότι χρειάζεται. - 65 -

- 66 -

Εισαγωγή Στην εισαγωγή των µικροελεγκτών 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: - 67 -

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) - 68 -

{ 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 - 69 -

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-70 -

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 - 71 -

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) { - 72 -

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 - 73 -

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 - 74 -

Άσκηση 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. είτε τη λειτουργία του στην πράξη. - 75 -

- 76 -

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

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

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. Ας δούµε σε βαθύτερο επίπεδο τι γίνεται: - 79 -

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 δικτύου - 80 -

Παραδείγµατα Για τη δηµιουργία ενός 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. - 81 -

Παράδειγµα 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. - 82 -

Παράδειγµα 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); - 83 -

Το παραπάνω παράδειγµα είναι µια ολοκληρωµένη σύνθεση 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. είτε τη λειτουργία του. Εξηγήστε µε διάγραµµα ροής. Βελτιστοποιήστε αν χρειάζεται χρησιµοποιώντας και τις παραπάνω γραµµές κώδικα. - 84 -

- 85 -

- 86 -

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

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

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

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 αφού συνδέσουµε κατάλληλα τον µικροελεγκτή που θα προγραµµατίσουµε και βλέπουµε την παρακάτω οθόνη: - 90 -

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, το οποίο είναι δοκιµασµένο και σταθερό στο χρόνο. - 91 -

- 92 -

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

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

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

Ή πιο απλά : Καθυστέρηση τουλάχιστον 15mS Send the first init value (0x30) Καθυστέρηση τουλάχιστον 4,1mS Send second init value (0x030) Καθυστέρηση τουλάχιστον 100nS Send third init value (0x30) Καθυστέρηση τουλάχιστον 1mS Select bus width (0x20 for 4-bit) Καθυστέρηση τουλάχιστον 1mS Select bus width (0x28 for 4-bit) Καθυστέρηση τουλάχιστον 1mS Send (0x0E) Καθυστέρηση τουλάχιστον 1mS Send (0x06) Καθυστέρηση τουλάχιστον 1mS Send (0x01) 1 η γραµµή 8 bit 1 η γραµµή 4 bit 2 η γραµµή 4 bit Display on/cursor on Κύλιση κειµένου δεξιά Clear LCD Υπάρχει βέβαια και πιο εύκολος τρόπος να υπολογίσουµε τις καθυστερήσεις σωστά προκειµένου να στείλουµε την επόµενη εντολή. Η οθόνη όσο εκτελεί την κάθε εντολή έχει ενεργοποιηµένο αυτό που ονοµάζουµε (busy Flag) το οποίο είναι πρακτικά το Data Bus 7 ή DB7 ή D7. ηµιουργούµε λοιπόν µια ρουτίνα που να ελέγχει πότε απενεργοποιείτε το busy Flag για να στείλει την επόµενη εντολή. LCD driver header for MSP430(ο κώδικας) Ο παρακάτω κώδικας µπορεί να αποθηκευτεί ως lcd.h και να χρησιµοποιηθεί σαν include στον κώδικά µας που θέλουµε να εµφανίζει δεδοµένα σε µια lcd π.χ. #include <msp430x20x3.h> #include <lcd.h> void main( void ) { lcd_init (); putstr("hello"); line2(); putstr("world"); Περιέχει υπορουτίνες για ότι µπορεί να χρειαστούµε για να χειριστούµε µια lcd όπως: void lcd_init (void); //Αρχικοποίηση void lcd_cmd (char cmd); //Στέλνει εντολή void lcd_data (char dat); //Τυπώνει έναν χαρακτήρα void putstr (char *str); //Τυπώνει λέξη στην θέση που βρίσκεται ο κέρσορας void int_str (int i,char *s); //Μετατρέπει Integer to String void line2 (void); //Πηγαίνει τον κέρσορα στην γραµµή 2 void wr_buffer (void); //Γράφει ότι περιέχει ο buffer(32 θέσεις µνήµης) void clr_buffer (void); // ιαγράφει τις θέσεις µνήµης του buffer void delay (void); //Η καθυστέρηση όπως περιγράφηκε παραπάνω - 96 -

/* MSP430 LCD. P1.5 RS (4) P1.7 E (6) P1.0 D4 (11) P1.1 D5 (12) P1.2 D6 (13) P1.3 D7 (14) GND GND (1) and R/W (5) Vcc Vcc (2) potentiometer needed at the contrast pin (3) */ #include <msp430x20x3.h> #define LCD_EN 0x80 //P1.7 #define LCD_RS 0x20 //P1.5 #define lcd_port P1OUT #define INPUT P1DIR=0x00 #define OUTPUT P1DIR=0xFF #define CLEAR_LCD lcd_cmd (0X01) //Clears the LCD // Global Variable declarations char disp[32]; // Buffer to hold characters to be displayed on the LCD void lcd_init (void); //Initialization of the LCD void lcd_cmd (char cmd); //Send command to LCD void lcd_data (char dat); //Print one character void putstr (char *str); //Print string from current cursor location void int_str (int i,char *s); //Convert Integer to String void line2 (void); //Takes cursor to line 2 of LCD void wr_buffer (void); //Write the message buffer onto the LCD void clr_buffer (void); //Clears message Buffer to blank spaces void delay (void); //The delay function void lcd_init (void){ //Initialization of the LCD OUTPUT; lcd_port = 0xFF; delay(); lcd_port = 0x03+LCD_EN; lcd_port = 0x03; delay(); lcd_port = 0x03+LCD_EN; lcd_port = 0x03; delay(); lcd_port = 0x03+LCD_EN; lcd_port = 0x03; delay(); lcd_port = 0x02+LCD_EN; lcd_port = 0x02; delay(); lcd_cmd(0x28); // 4-bit mode - 2 line - 5x7 font. lcd_cmd(0x0e); // Display no cursor - no blink. lcd_cmd(0x06); // Automatic Increment - No Display shift. lcd_cmd(0x80); // Address DDRAM with 0 offset 80h. CLEAR_LCD; INPUT; - 97 -

void lcd_cmd (char cmd){ //Send command to LCD OUTPUT; lcd_port = ((cmd >> 4) & 0x0F) LCD_EN; lcd_port = ((cmd >> 4) & 0x0F); lcd_port = (cmd & 0x0F) LCD_EN; lcd_port = (cmd & 0x0F); delay(); INPUT; void lcd_data (char dat){ //Print one character OUTPUT; lcd_port = (((dat >> 4) & 0x0F) LCD_EN LCD_RS); lcd_port = (((dat >> 4) & 0x0F) LCD_RS); lcd_port = ((dat & 0x0F) LCD_EN LCD_RS); lcd_port = ((dat & 0x0F) LCD_RS); delay(); INPUT; void putstr (char *str){ while (*str){ lcd_data(*str++); void int_str(int i,char *s){ char *p; p=s; if(i >= 200) p[0]= 2; else if(i >= 100) p[0]= 1; else p[0]= 0; p[2]=i%10; i-=p[2]; i/=10; p[1]=i%10; p[3] = 0; p[2]+=0x30; p[1]+=0x30; p[0]+=0x30; //Print string from current cursor location //Convert Integer to String void line2 (void){ lcd_cmd (0XC0); delay(); //Takes cursor to line 2 of LCD - 98 -

void wr_buffer (void){ //Write the message buffer onto the LCD char index; CLEAR_LCD; for(index = 0; index < 16; index++){ lcd_data(disp[index]); line2(); for(index = 16; index < 32; index++){ lcd_data(disp[index]); void clr_buffer (void){ for(char x = 0; x <32; x++) disp[x] = ' '; //Clears message Buffer to blank spaces void delay (void){ INPUT; while(0x08 & P1IN) OUTPUT; //The delay function - 99 -

- 100 -

Εισαγωγή Για την καλύτερη κατανόηση των ασκήσεων και για ευκολία και λειτουργικότητα σχεδιάστηκαν τρία PCB. Το πρώτο είναι η βασική πλακέτα για την τοποθέτηση του ez430-f2013 και τον έλεγχό του, το δεύτερο είναι ένα keypad 4x4 για την αντίστοιχη εφαρµογή και το τρίτο είναι µια βάση για τους MSP430x20x σε DIP14 πακέτο η οποία µας επιτρέπει τον προγραµµατισµό τους µέσω του προγραµµατιστή του ez430 και συνδυάζεται µε την βασική µας πλακέτα. Κεντρική πλακέτα προγραµµατισµού Στην πλακέτα αυτή έχει τοποθετηθεί µια βάση για την τοποθέτηση του ez430-f2013 καθώς και µια σειρά από buttons για το port 1 του µικροελεγκτή σε συνδυασµό µε led για τον οπτικό έλεγχο των προγραµµάτων. Επίσης, έχει τοποθετηθεί ένας κρύσταλλος 32768Ηz για τον χρονισµό του µικροελεγκτή όταν ζητηθεί από το πρόγραµµα όπως και ένα ποτενσιόµετρο αν ζητηθεί είσοδος τάσης στο port(περισσότερο για τη µετατροπή αναλογικού σε ψηφιακό σήµα). Τέλος υπάρχει µια µπαταρία τύπου CR2032(3.3V) για την τροφοδοσία του µικροελεγκτή όπως και ένα κύκλωµα τροφοδοσίας που δέχεται από εξωτερικό τροφοδοτικό 5V στον αντάπτορα στο κάτω µέρος και µέσω του σταθεροποιητή τροφοδοτεί το κύκλωµα µε 3.3V. - 101 -

Πλακέτα πληκτρολογίου 4x4(keypad) Η πλακέτα αυτή σχεδιάστηκε για την πραγµατοποίηση της εφαρµογής του πληκτρολογίου 4x4 της άσκησης 4 και συνδέεται µέσω µιας καλωδιοταινίας µε την κεντρική πλακέτα. - 102 -

Πλακέτα προγραµµατισµού MSP430x20x DIP Η πλακέτα αυτή δέχεται στη βάση της πάνω όψης µικροελεγκτές MSP430 σε DIP14 που µέσω των pins αριστερά µπορούν να προγραµµατιστούν από τον προγραµµατιστή του ez430-f2013. Επίσης µέσω των pins στην κάτω όψη τοποθετείται στην κεντρική πλακέτα για την ευκολία και των έλεγχο του προγραµµατισµού. Τέλος µε ένα jumper στο κάτω µέρος επιλέγουµε την τροφοδοσία του µικροελεγκτή(usb οριζόντια) - 103 -