Διπλωματική Εργασία του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών της Πολυτεχνικής Σχολής του Πανεπιστημίου Πατρών

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

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

WIRELESS SENSOR NETWORKS (WSN)

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

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

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

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

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

Κεφάλαιο 4 ο. Ο Προσωπικός Υπολογιστής

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

Μάθημα 5: To Μοντέλο Αναφοράς O.S.I.

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

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

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

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

ΕΦΑΡΜΟΓΕΣ ΠΛΗΡΟΦΟΡΙΚΗΣ. Α Γενικού Λυκείου (Μάθημα Επιλογής)

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

; Γιατί είναι ταχύτερη η λήψη και αποκωδικοποίηση των εντολών σταθερού μήκους;

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

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

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

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

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

Σειριακό Τερματικό Serial Terminal (Dumb Terminal)

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

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

- Δομή πλαισίου Ethernet - Πλαίσια Ethernet μεγάλου μεγέθους (Jumbo frames)

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

WDT και Power Up timer

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

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

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

ΕΠΙΚΟΙΝΩΝΙΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΕΣ INTERNET

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

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

Τεχνολογία Δικτύων Επικοινωνιών (Ενότητα Πρωτόκολλα και Αρχιτεκτονική Δικτύου)

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

ΨΗΦΙΑΚΑ ΣΥΣΤΗΜΑΤΑ ΚΑΡΑΓΚΙΑΟΥΡΗΣ ΝΙΚΟΛΑΟΣ

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

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

Μέθοδοι Ελέγχου Σφαλμάτων

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

Στοιχεία από την αρχιτεκτονική των μικροϋπολογιστών

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

Το ολοκληρωμένο κύκλωμα μιας ΚΜΕ. «Φέτα» ημιαγωγών (wafer) από τη διαδικασία παραγωγής ΚΜΕ

Πληροφορική Ι. Μάθημα 6 ο Εκτέλεση πράξεων, Αρχιτεκτονική Η/Υ. Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας

4.1.1 Πρωτόκολλο TCP - Δομή πακέτου

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

Το υλικό του υπολογιστή

ΚΕΦΑΛΑΙΟ 1: Τα είδη των Δικτύων Εισαγωγή

6.1 Καταχωρητές. Ένας καταχωρητής είναι μια ομάδα από f/f αλλά μπορεί να περιέχει και πύλες. Καταχωρητής των n ψηφίων αποτελείται από n f/f.

CTMU. => C = 50pF 10pF = 40 pf. C stray. d (C V ) I= I = C V. C= I t. Ι = dq dt

Εργαστήριο Εισαγωγής στη Σχεδίαση Συστημάτων VLSI

ΕΠΙΚΟΙΝΩΝΙΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΕΣ INTERNET

Πρότυπο Αναφοράς Open Systems Interconnection (OSI) Επικοινωνίες Δεδομένων Μάθημα 5 ο

ΜΙΚΡΟΕΛΕΓΚΤΗΣ PICAXE 18M2

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

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

Οργάνωση και Αρχιτεκτονική Υπολογιστών. Κεφάλαιο 7.4

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

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

- Εισαγωγή - Επίπεδα μνήμης - Ολοκληρωμένα κυκλώματα μνήμης - Συσκευασίες μνήμης προσωπικών υπολογιστών

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

Με τον όρο μνήμη αναφερόμαστε στα μέσα που χρησιμοποιούνται για την αποθήκευση προγραμμάτων και δεδομένων σε έναν υπολογιστή ή άλλη ψηφιακή

Κεφάλαιο 8. Αριθμητική Λογική μονάδα

Κεφάλαιο 7. ΕΠΑΛ Σύμης Εφαρμογές πληροφορικής Ερωτήσεις επανάληψης

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

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

Ψηφιακές Επικοινωνίες

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

1. Οργάνωση της CPU 2. Εκτέλεση εντολών 3. Παραλληλία στο επίπεδο των εντολών 4. Γραμμές διοχέτευσης 5. Παραλληλία στο επίπεδο των επεξεργαστών

Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

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

Κεφάλαιο 1 Ε Π Α Ν Α Λ Η Ψ Η. Αρχές Δικτύων Επικοινωνιών

Φουκαράκη Χρυσούλα - ΓΕΛ Γαζίου

Κατανεμημένα συστήματα και Επικοινωνία Πραγματικού Χρόνου

Σχήμα 1: TCP αποστολέας με παράθυρο αποστολέα = 1

ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ. Παράδοση Ασκήσεων Κεφάλαιο 2 Ασκήσεις 3,6,8,9,15,22,24,26. Γεωργόπουλος Άλκης Α.Μ.: 39 Κοντογιώργης Αναστάσιος A.M.

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

Κεφάλαιο 1 Ε Π Α Ν Α Λ Η Ψ Η

Κεφάλαιο 2.4: Εργασία με εικονίδια

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

Τρίτη Πρόοδος [110 μονάδες] Απαντήσεις

ΚΕΦΑΛΑΙΟ 1.7. Πρωτόκολλα και Αρχιτεκτονική Δικτύου

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

Τετάρτη 5-12/11/2014. ΣΗΜΕΙΩΣΕΙΣ 3 ου και 4 ου ΜΑΘΗΜΑΤΟΣ ΕΙΔΙΚΟΤΗΤΑ: ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΑΡΧΙΤΕΚΤΟΝΙΚΗ Η/Υ Α ΕΞΑΜΗΝΟ

Μαλούτα Θεανώ Σελίδα 1

ΑΣΚΗΣΕΙΣ ΠΟΛΛΑΠΛΗΣ ΕΠΙΛΟΓΗΣ ΓΙΑ ΤΗ ΘΕΩΡΙΑ

Διασύνδεση τοπικών δικτύων

Επαναληπτικές Ασκήσεις Μαθήματος

Μάθημα 5: Χαρακτηριστικά της Κ.Μ.Ε.

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

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

Περιεχόμενα. Κεφάλαιο 1 Εισαγωγή σε Έννοιες των Δικτύων Υπολογιστών Κεφάλαιο 2 Αξιοπιστία Κεφάλαιο 3 Αλγόριθμοι Πολλαπλής Πρόσβασης...

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Οργάνωση Υπολογιστών

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

Τμήμα Λογιστικής. Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. Μάθημα 8. 1 Στέργιος Παλαμάς

ΘΕΜΑ : ΨΗΦΙΑΚΑ ΗΛΕΚΤΡΟΝΙΚΑ DIGITAL ELECTRONICS

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

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

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ: Ηλεκτρονικής και υπολογιστών ΕΡΓΑΣΤΗΡΙΟ ΗΛΕΚΤΡΟΝΙΚΩΝ ΕΦΑΡΜΟΓΩΝ Διπλωματική Εργασία του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών της Πολυτεχνικής Σχολής του Πανεπιστημίου Πατρών Παπαπαύλου Χρήστου του Αλέκου Αριθμός Μητρώου: 6609 Θέμα «Ανάπτυξη Εκπαιδευτικού Συστήματος (Η/W, S/W) για δικτυακές εφαρμογές, βασισμένου σε μικροελεγκτή AVR» Επιβλέπων Κουμπιάς Σταύρος Αριθμός Διπλωματικής Εργασίας: 226609/2013-1-

-2-

ΠΙΣΤΟΠΟΙΗΣΗ Πιστοποιείται ότι η Διπλωματική Εργασία με θέμα «Ανάπτυξη Εκπαιδευτικού Συστήματος (Η/W, S/W) για δικτυακές εφαρμογές, βασισμένου σε μικροελεγκτή AVR» Του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών Παπαπαύλου Χρήστου Αριθμός Μητρώου: 6609 Παρουσιάστηκε δημόσια και εξετάστηκε στο Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών στις.../../ Ο Επιβλέπων Ο Διευθυντής του Τομέα Κουμπιάς Σταύρος Χούσος Ευθύμιος -3-

-4-

Αριθμός Διπλωματικής Εργασίας: Θέμα: «Ανάπτυξη Εκπαιδευτικού Συστήματος (Η/W, S/W) για δικτυακές εφαρμογές, βασισμένου σε μικροελεγκτή AVR» Φοιτητής: Παπαπαύλου Χρήστος Επιβλέπων: Κουμπιάς Σταύρος Περίληψη Στην παρούσα διπλωματική εργασία σχεδιάστηκε και υλοποιήθηκε ένα δίκτυο πραγματικού χρόνου με σκοπό την διασύνδεση μιας ομάδας μικροελεγκτών. Bασισμένος στο δίκτυο, αναπτύχθηκε ένας δικτυακός bootloader για μικροελεγκτές AVR και σχεδιάστηκε desktop εφαρμογή για την διεπαφή του χρήστη με το δίκτυο. Απώτερος σκοπός του εγχειρήματος αυτού είναι η χρήση του συστήματος από φοιτητές στο πλαίσιο των μαθημάτων μικροϋπολογιστών και συγκεκριμένα να διευκολύνει την ανάπτυξη δικτυακών εφαρμογών με μικροελεγκτές. Abstract At this diploma thesis a real-time network protocol was designed and implemented in order to interconnect a group of microcontrollers. Based at this protocol, a network bootloader was developed for AVR microcontrollers and a desktop application for the interface of the user with the network was developed. Ultimate goal of this work is to be used from students of microcomputer courses and specifically to facilitate the development of network applications with microcontrollers. -5-

-6-

Εισαγωγή Στο φυσικό επίπεδο του δικτύου (OSI 1) γίνεται χρήση της τυπικής σειριακής θύρας UART για την φυσική διασύνδεση των κόμβων σε τοπολογία δακτυλίου. Η επιλογή αυτή έγινε γιατί οι θύρες UART είναι διαδεδομένες τόσο στους προσωπικούς υπολογιστές, όσο και στις περισσότερες οικογένειες μικροελεγκτών, γεγονός που επιτρέπει την υλοποίηση του δικτύου για όλες αυτές τις οικογένειες. Για το επίπεδο σύνδεσης δεδομένων (OSI 2) σχεδιάστηκε και υλοποιήθηκε πρωτόκολλο τύπου δακτυλίου με χρήση σκυτάλης (token ring). Στα πλαίσια της διπλωματικής το πρωτόκολλο υλοποιήθηκε για μικροελεγκτές AVR και για προσωπικό υπολογιστή. Το γεγονός ότι το πρωτόκολλο υλοποιήθηκε τόσο για μικροελεγκτές όσο και για υπολογιστή, κάνει δυνατή την διασύνδεση των δύο παραπάνω σε κοινό δίκτυο. Σε συνδυασμό με την προγραμματιστική διεπαφή (API) που παρέχεται στους χρήστες διευκολύνεται σε μεγάλο βαθμό η ανάπτυξη δικτυακών εφαρμογών μικροελεγκτών κάνοντας χρήση του υπολογιστή σαν εργαλείο προγραμματισμού, αποσφαλμάτωσης αλλά και διασύνδεσης του χρήστη με τους μικροελεγκτές. Κατά την διαδικασία ανάπτυξης μιας εφαρμογής που στηρίζεται στην επικοινωνία των κόμβων ενός δικτύου, απαιτείται ο συνεχής προγραμματισμός κάθε κόμβου. Με τις συμβατικές μεθόδους προγραμματισμού, η συσκευή προγραμματισμού πρέπει να συνδεθεί σε κάθε έναν από τους κόμβους που απαρτίζουν το δίκτυο. Ο χρόνος που απαιτείται για αυτή την διαδικασία αυξάνεται γραμμικά καθώς αυξάνεται ο αριθμός των κόμβων του δικτύου. Αυτός ο χρόνος εξαλείφεται με χρήση ενός bootloader που βασίζεται στο δίκτυο για την επικοινωνία και τον προγραμματισμό των κόμβων. Ο προγραμματισμός με τον bootloader, σε αντίθεση με τις άλλες μεθόδους, δεν απαιτεί από πλευράς συνδεσμολογίας τίποτα περισσότερο από την ίδια την υποδομή του δικτύου. Στα πλαίσια αυτής της διπλωματικής, αξιοποιήθηκε το πρωτόκολλο που υλοποιήθηκε παραπάνω, για την ανάπτυξη ενός δικτυακού bootloader για μικροελεγκτές AVR. Ο προγραμματισμός εκτελείται από εφαρμογή προσωπικού υπολογιστή που αναπτύχθηκε επίσης στα πλαίσια αυτής της διπλωματικής, με την οποία ο χρήστης μπορεί να προγραμματίσει τους μικροελεγκτές του δικτύου, αλλά και να αλληλεπιδράσει με αυτούς γενικότερα. Τέλος, κατασκευάστηκαν τρία όμοια μικροϋπολογιστικά συστήματα με μικροελεγκτή AVR σε τυπωμένο κύκλωμα (PCB), ώστε να επιδειχθούν οι δυνατότητες του δικτύου και του Bootloader στην πράξη. Στο σημείο αυτό θα ήθελα να ευχαριστήσω θερμά τον κύριο Σταύρο Κουμπιά για την εμπιστοσύνη που μου έδειξε με την ανάθεση του συγκεκριμένου θέματος καθώς και για την βοήθειά του όπου αυτή ήταν απαραίτητη. Επίσης θέλω να ευχαριστήσω τον κύριο Παναγιώτη Μητρόπουλο για την πολύτιμη βοήθεια και τις συμβουλές του. Τέλος, δεν μπορώ να παραλείψω τις θερμές ευχαριστίες στον συνάδελφο και φίλο Στέλιο Συρίγο για την καθοριστική συμβολή του στην κατασκευή των τυπωμένων κυκλωμάτων. -7-

-8-

Πίνακας Περιεχομένων Εισαγωγή...7 1. Μικροελεγκτές AVR...13 1.1 Γενικά για τους μικροελεγκτές...13 1.1.α Διαφορές με μικροεπεξεργαστές...13 1.1.β Είσοδος-Έξοδος (I/O)...13 1.1.γ Μνήμη...13 1.2 Εφαρμογές...13 1.2.α Ενσωματωμένα συστήματα...13 1.2.β Εφαρμογές αυτοματισμού...14 1.2.γ Μηχανοκίνητες εφαρμογές...14 1.3 Αρχιτεκτονική AVR...14 1.3.α RISC...15 1.3.β Καταχωρητές...15 1.3.γ Σύνολο εντολών...15 1.4 Περιφερειακά AVR...16 1.4.α Περιφερειακά Εισόδου Εξόδου (I/O)...16 1.4.β Ταλαντωτής...16 1.5 Μνήμες AVR...17 1.5.α FLASH...17 1.5.β EEPROM...17 1.5.γ SRAM...17 1.6 Διευθυνσιοδότηση...18 1.6.α Χώροι διευθύνσεων...18 1.6.β Διευθυνσιοδότηση μνήμης δεδομένων...18 1.6.γ Διευθυνσιοδότηση μνήμης προγράμματος...20 1.7 Προγραμματισμός...21 1.7.α Assemblers...21 1.7.β C Compilers...21 1.7.γ Fuse bits...21 1.7.δ Αρχεία intel hex...21 1.8 Μέθοδοι προγραμματισμού...22 1.8.α ISP (In system programming)...22 1.8.β HVPP (High voltage parallel)...23 1.8.γ JTAG...23 1.8.δ Bootloader...23 2. Δίκτυο ΤΚΝ...25 2.1 Προδιαγραφές...25 2.2 Φυσικό επίπεδο...25 2.3 Τοπολογία...25 2.4 Πρωτόκολλο σύνδεσης δεδομένων...26 2.4.α Λειτουργίες πρωτοκόλλου...26 2.4.β Πακέτα πρωτοκόλλου...27 2.4.γ Αλγόριθμος πρωτοκόλλου...27 2.4.δ Σχηματική αναπαράσταση κόμβου...29 2.5 Θεωρητική Ανάλυση Επιδόσεων...31 2.5.α Παράμετροι...31-9-

2.5.β Περιορισμοί Πραγματικού Χρόνου...31 2.5.γ Tokens Per Second...31 2.5.δ Πρόγραμμα Υπολογισμού...32 2.5.ε Αποτελέσματα...34 2.5.στ Καθυστέρηση Πακέτου...39 2.5.ζ Throughput...39 3. Υλοποίηση δικτύου TKN...41 3.1 Περιβάλλον ανάπτυξης...41 3.1.α STK 600...41 3.1.β AVR Studio...42 3.1.γ Κύκλωμα breadboard...42 3.1.δ Καλώδιο FTDI...42 3.2 Driver για AVR...43 3.2.α Αρχιτεκτονική driver...43 3.2.β Δέκτης...44 3.2.γ Πομπός...45 3.2.δ Προγραμματιστική διεπαφή (API)...46 3.2.ε Χρήση βιβλιοθήκης δικτύου...46 3.3 Driver για HY...48 3.3.α Αρχιτεκτονική Driver...48 3.3.β Driver Thread...48 3.3.γ Προγραμματιστική διεπαφή (API)...49 4. TKN Bootloader...51 4.1 Περιπτώσεις προγραμματισμού...51 4.1.α Πρόβλημα...51 4.1.β Λύση...52 4.2 Χρήσιμα χαρακτηριστικά AVR...53 4.2.α Boot Section...53 4.2.β Boot Reset...53 4.2.γ Θέση Interrupt Vector...53 4.2.δ Boot Lock Bits (BLB)...53 4.3 Υλοποίηση bootloader...53 4.3.α Διεύθυνση reset...53 4.3.β Interrupt Vector...54 4.3.γ Αρχιτεκτονική bootloader...55 4.3.δ Εντολές bootloader...55 4.3.ε Κατανομή Καταχωρητών...55 4.3.στ Διαδικασία προγραμματισμού...56 4.3.ζ Εκτέλεση προγράμματος χρήστη...57 4.4 Εφαρμογή προγραμματισμού...57 4.4.α Συμβατότητα / Απαιτήσεις...57 4.4.β Δυνατότητες...58 4.4.γ Λειτουργία...58 4.4.δ Χρήση της εφαρμογής ως κονσόλα αποσφαλμάτωσης...59 5. TKN PCB...61 5.1 Στοιχεία πλακέτας...61 5.1.α Κονέκτορες Δικτύου...61 5.2 Κατασκευή...63 5.2.α Σχεδίαση...63-10-

5.2.β Εκτύπωση...63 5.2.γ Τρύπημα / Κόλληση...64 5.3 Δοκιμαστικά Προγράμματα...65 6. ΒΙΒΛΙΟΓΡΑΦΙΑ...67 7. ΠΑΡΑΡΤΗΜΑ (PCB)...69 Στο παρακάτω σχήμα φαίνεται το σχηματικό διάγραμμα της πλακέτας που σχεδιάστηκε:...69 Εδώ φαίνεται το τελικό layout της πλακέτας που χρησιμοποιήθηκε για την εκτύπωση της πλακέτας:...69 8. ΠΑΡΑΡΤΗΜΑ (Κώδικας)...71-11-

-12-

1. Μικροελεγκτές AVR Σε αυτή την εργασία χρησιμοποιήθηκαν μικροελεγκτές AVR της σειράς ATmega από την εταιρεία Atmel. Σε αυο το κεφάλαιο γίνεται περιγραφή των δυνατοτήτων τους, αφού γίνει μια εισαγωγή στους μικροελεγκτές γενικότερα. 1.1 Γενικά για τους μικροελεγκτές Οι μικροελεγκτές είναι μια ειδική κατηγορία μικροεπεξεργαστών. Είναι δηλαδή ολοκληρωμένα κυκλώματα με δυνατότητα εκτέλεσης στοιχειωδών αριθμητικών και λογικών πράξεων μεταξύ δυαδικών δεδομένων, καθώς και δυνατότητα πραγματοποίησης λειτουργιών εισόδου εξόδου δεδομένων. Ένας μικροεπεξεργαστής προγραμματίζεται καθορίζοντάς την ακολουθία εντολών προς εκτέλεση. Κάθε μικροεπεξεργαστής έχει περιορισμένο σετ εντολών που μπορεί να εκτελέσει σύμφωνα με την αρχιτεκτονική του. 1.1.α Διαφορές με μικροεπεξεργαστές Ένας μικροεπεξεργαστής δεν είναι σε θέση να λειτουργήσει χωρίς την ύπαρξη ορισμένων εξωτερικών κυκλωμάτων. Τα ελάχιστα περιφερειακά που χρειάζεται ένας μικροεπεξεργαστής είναι η μνήμη από την οποία θα διαβάσει το πρόγραμμα που θα εκτελέσει και ο ταλαντωτής ως η πηγή ρολογιού που είναι απαραίτητη σε κάθε σύγχρονο ακολουθιακό κύκλωμα. Όλα τα παραπάνω, ένας μικροελεγκτής τα περιλαμβάνει σε ένα ολοκληρωμένο κύκλωμα, πράγμα που τον καθιστά ικανό να λειτουργήσει πλήρως αυτόνομα έχοντας σαν επακόλουθο την μείωση του κόστους και της πολυπλοκότητας του συστήματος στο οποίο θα χρησιμοποιηθούν. 1.1.β Είσοδος-Έξοδος (I/O) Οι μικροελεγκτής ενσωματώνουν ένα πλήθος από περιφερειακά εισόδου εξόδου. Συνήθη τέτοια περιφερειακά είναι μετρητές, διεπαφές επικοινωνίας UART, I²C, USB, μετατροπείς A/D, αναλογικοί συγκριτές, γεννήτριες PWM. 1.1.γ Μνήμη Το σημαντικότερο από τα περιφερειακά που υπάρχουν ενσωματωμένα σε έναν μικροελεγκτή είναι η μνήμη. Θα βρούμε τουλάχιστον δύο είδη μνήμης, μόνιμης και προσωρινής αποθήκευσης, μη πτητική και πτητική αντίστοιχα. Εξαλείφοντας την ανάγκη εξωτερικής μνήμης, ένας μικροελεγκτής γίνεται ουσιαστικά αυτόνομος. 1.2 Εφαρμογές Οι μικροελεγκτές λόγω του χαμηλού τους κόστους και της ευελιξίας που παρέχουν βρίσκουν αναρίθμητες χρήσεις σε διάφορους κλάδους. 1.2.α Ενσωματωμένα συστήματα Πρόκειται για υπολογιστικά συστήματα που κατασκευάζονται με σκοπό να επιτελέσουν μια συγκεκριμένη εργασία, είτε στα πλαίσια ενός ευρύτερου συστήματος, είτε εντελώς αυτόνομα. Σε αντίθεση με τα υπολογιστικά συστήματα γενικού σκοπού, τα οποία κατασκευάζονται ώστε να έχουν ευελιξία και να μπορούν να εξυπηρετήσουν ένα μεγάλο -13-

φάσμα εφαρμογών, τα ενσωματωμένα συστήματα έχουν καθορισμένο έργο εξ αρχής και κατασκευάζονται ώστε να μπορέσουν να πραγματοποιήσουν το έργο αυτό με το ελάχιστο δυνατό κόστος. Ως παραδείγματα ενσωματωμένων συστημάτων μπορούμε να αναφέρουμε κάμερες, φορητές συσκευές αναπαραγωγής μουσικής, DVD players, εκτυπωτές και άλλα. Πολλές ηλεκτρικές - ηλεκτρονικές συσκευές της καθημερινότητας μπορούν να θεωρηθούν ενσωματωμένα συστήματα. Παραδείγματα είναι πλυντήρια, φούρνοι μικροκυμάτων κτλ. 1.2.β Εφαρμογές αυτοματισμού Πολλές εφαρμογές κάνουν χρήση περισσότερων του ενός μικροελεγκτών συνδεδεμένων μεταξύ τους σε ένα τοπικό, μικρής κλίμακας δίκτυο με σκοπό τον καλύτερο και ακριβέστερο έλεγχο ενός συστήματος. Για παράδειγμα, διάφορα προηγμένα συστήματα ρύθμισης θερμοκρασίας κτιρίων, μπορούν να επωφεληθούν από μια τέτοια διαμόρφωση ώστε να επιτύχουν πιο ακριβή έλεγχο των συνθηκών του κτιρίου με απώτερο στόχο την εξοικονόμηση ενέργειας. Ένα άλλο ενδιαφέρον πεδίο στο οποίο έχουν εξελιχτεί τα ενσωματωμένα συστήματα είναι τα ασύρματα δίκτυα αισθητήρων, τα οποία αποτελούνται από ένα πλήθος αισθητήρων διασκορπισμένων στον χώρο με στόχο την παρακολούθηση μεγεθών όπως θερμοκρασία, πίεση, υγρασία και την αποστολή των μετρήσεων σε έναν κεντρικό σταθμό όπου θα αξιοποιηθούν κατάλληλα. 1.2.γ Μηχανοκίνητες εφαρμογές Οι μικροελεγκτές και τα ενσωματωμένα συστήματα έχουν διεισδύσει σε τεράστιο βαθμό στην βιομηχανία μηχανοκίνητων, είτε πρόκειται για αυτοκίνητα, μοτοσυκλέτες είτε για αεροσκάφη υψηλής τεχνολογίας. Οι χρήσεις ενσωματωμένων συστημάτων σε ένα όχημα ξεκινούν από τα πιο βασικά στάδια σχετιζόμενα με την λειτουργία του ίδιου του κινητήρα και εκτείνονται στα συστήματα αυτοματισμού και ελέγχου του οχήματος και έως τα συστήματα ψυχαγωγίας των επιβατών. Τελικά σε ένα όχημα όλες οι περιφερειακές λειτουργίες ελέγχονται από ένα κεντρικό σύστημα το οποίο ελέγχει και επιβλέπει το όχημα ανά πάσα στιγμή σαν ένα σύνολο. Σε αυτό το σημείο θα εξετάσουμε τα χαρακτηριστικά των μικροελεγκτών AVR αρχίζοντας από την αρχιτεκτονική τους. 1.3 Αρχιτεκτονική AVR Μία από τις διακρίσεις που μπορούμε να κάνουμε για την αρχιτεκτονική ενός υπολογιστικού συστήματος είναι σε Von Neumann και σε Harvard. Η διαφοροποίηση αυτών των δύο σχετίζεται με την θέση αποθήκευσης των εντολών και των δεδόμενων του προγράμματος. Στην μεν Von Neumann αρχιτεκτονική, οι εντολές και τα δεδομένα βρίσκονται στο ίδιο σύστημα μνήμης, ενώ στην Harvard σε διαφορετικό. Στην Von Neumann αρχιτεκτονική κάθε διεύθυνση είναι δυνατόν να αναφέρεται είτε σε εντολή, είτε σε δεδομένο καθώς τα 2 τελευταία καταλαμβάνουν τον ίδιο χώρο διευθύνσεων, σε αντίθεση με την Harvard αρχιτεκτονική, οπού υπάρχουν δύο διαφορετικοί χώροι διευθύνσεων. Οι μικροελεγκτές AVR της σειράς ATMega που χρησιμοποιήθηκαν, έχουν 8bit τροποποιημένη Harvard RISC αρχιτεκτονική. Στην τροποποιημένη Harvard αρχιτεκτονική υπάρχουν πράγματι ξεχωριστοί χώροι διευθύνσεων για το πρόγραμμα και για τα δεδομένα, με μία διαφορά. Ο προγραμματιστής έχει πρόσβαση στην μνήμη του προγράμματος και μπορεί να διαβάσει ή και να γράψει σε αυτήν. Αυτό μας δίνει την δυνατότητα να αποθηκεύουμε δεδομένα μαζί με κώδικά στην μνήμη προγράμματος, καθώς και να -14-

τροποποιούμε τα περιεχόμενα της μνήμης. 1.3.α RISC Μια άλλη σημαντική διάκριση που γίνεται στην αρχιτεκτονική ενός υπολογιστικού συστήματος σχετίζεται με το συνόλου εντολών. Υπάρχουν δύο κατηγορίες, η αρχιτεκτονική περιορισμένου συνόλου εντολών (RISC) η οποία ακολουθείται στην περίπτωση μας και η αρχιτεκτονική σύνθετου συνόλου εντολών (CISC). Η διαφορά βρίσκεται στη δυνατότητα των διαθέσιμων εντολών. Στην περίπτωση του σύνθετου συνόλου εντολών, το οποίο προηγείται χρονολογικά, υπάρχουν εντολές που πραγματοποιούν περισσότερες από μία στοιχειώδεις ενέργειες σε ένα βήμα, για παράδειγμα, φόρτωση από την μνήμη πρόσθεση αποθήκευση στην μνήμη. Το μοντέλο του περιορισμένου συνόλου εντολών προτείνει την κατάργηση των σύνθετων εντολών, με στόχο απλούστερες κεντρικές μονάδες επεξεργασίας, οι οποίες όμως θα εκτελούν ταχύτερα κάθε μεμονωμένη εντολή, οδηγώντας σε μικρότερους συνολικούς χρόνους εκτέλεσης. Επίσης η μικρότερη επιφάνεια πυριτίου που απαιτείται λόγω των απλούστερων λειτουργικών μονάδων, επιτρέπει την αύξηση των διαθέσιμων καταχωρητών, πράγμα που διευκολύνει τόσο τον προγραμματισμό σε γλώσσα assembly, όσο και την διαδικασία παραγωγής κώδικά από τους μεταφραστές. 1.3.β Καταχωρητές Υπάρχουν διαθέσιμοι 32 καταχωρητές γενικού σκοπού 8bit (r0-r31). Οι περισσότεροι από αυτούς μπορούν να χρησιμοποιηθούν είτε ως καταχωρητές προέλευσης είτε ως προορισμού στις εντολές του μικροελεγκτή. Οι 6 υψηλότεροι από τους 32 αυτούς καταχωρητές σχηματίζουν σε ζεύγη τους 3 16bit X, Y, Z οι οποίοι χρησιμοποιούνται για διευθυνσιοδότηση κατά την προσπέλαση είτε της μνήμης δεδομένων είτε της μνήμης προγράμματος, όπως θα δούμε σε επόμενη παράγραφο. 8bit 16bit r0 - r25 Δεν σχηματίζουν ζεύγη. r26 (XL) X r27 (XH) r28 (YL) Y r29 (YH) r30 (ZL) Z r31 (ZH) Πίνακας 1.1: Καταχωρητές 8bit AVR αρχιτεκτονικής 1.3.γ Σύνολο εντολών Οι εντολές που υπάρχουν σε αυτή την σειρά μικροελεγκτών κατηγοριοποιούνται στις παρακάτω γενικές ομάδες: -15-

Εντολές αριθμητικών και λογικών πράξεων Πρόσθεση, Αφαίρεση, Πολλαπλασιασμός, λογικό ΚΑΙ / Η. Εντολές διακλάδωσης Απλά άλματα, άλματα υπό συνθήκη, κλήση ρουτινών, συγκρίσεις. Εντολές μεταφοράς δεδομένων Μεταφορά μεταξύ καταχωρητών, φόρτωση από τις διάφορες μνήμες. Εντολές διαχείρισης bit Ολίσθηση, θέση bit, καθαρισμός bit, έλεγχος bit. Εντολές ελέγχου μικροελεγκτή Sleep, Reset Watchdog, nop Πίνακας 1.2: Είδη εντολών αρχιτεκτονικής AVR 8bit Υπάρχουν εντολές που δεν δέχονται όρισμα, και εντολές που δέχονται ένα ή δύο ορίσματα. Τα ορίσματα μπορεί να είναι ένας καταχωρητής, δύο καταχωρητές ή ένας καταχωρητής και μία σταθερά. Το εύρος της σταθεράς διαφέρει μεταξύ των διαφόρων εντολών. Επίσης υπάρχουν εντολές που δέχονται σαν όρισμα ένα από τα ζεύγη καταχωρητών X, Y, Z. Τα opcode των εντολών έχουν μέγεθος μίας ή δύο λέξεων, δηλαδή 16 ή 32 bit. Στις περισσότερες εντολές που δέχονται σαν όρισμα καταχωρητή, μπορεί να χρησιμοποιηθεί οποιοσδήποτε από τους 32 καταχωρητές γενικού σκοπού (r0-r31). Υπάρχουν ωστόσο ορισμένες εντολές που δέχονται μόνο τους 16 υψηλότερους καταχωρητές (r16r31) 1.4 Περιφερειακά AVR 1.4.α Περιφερειακά Εισόδου Εξόδου (I/O) Στους μικροελεγκτές αυτής της σειράς βρίσκουμε τα παρακάτω περιφερειακά εισόδου-εξόδου: Διεπαφές επικοινωνίας USB, UART, I2C, CAN, LIN Διεπαφές χρήστη LCD Segment display Μετατροπείς ADC, DAC, PWM Αισθητήρες Θερμοκρασίας Ταλαντωτές 32kHz, 128kHz, 8MHz Μετρητές 8bit, 16bit Πίνακας 1.3: Συνήθη περιφερειακά εισόδου-εξόδου στους μικροελεγκτές AVR Για την σύνδεση επιπλέον εξωτερικών περιφερειακών έχουμε στην διάθεση μας έναν αριθμό ψηφιακών εισόδων οι οποίες είναι δυνατόν να χρησιμοποιηθούν για αυτόν τον σκοπό. 1.4.β Ταλαντωτής Όλοι οι μικροελεγκτές αυτής της σειράς φέρουν ενσωματωμένο RC ταλαντωτή με δυνατότητα ακριβούς ρύθμισης της συχνότητας. Η κεντρική συχνότητας αυτού του ταλα-16-

ντωτή είναι 8MHz. Διαθέσιμος είναι επίσης ταλαντωτής χαμηλής συχνότητας της τάξης των khz που μπορεί να χρησιμοποιηθεί σαν ρολόι του μικροελεγκτή σε εφαρμογές χαμηλής κατανάλωσης που η ταχύτητα εκτέλεσης δεν είναι μείζονος σημασίας. Τέλος υπάρχει δυνατότητα σύνδεσης εξωτερικού κρυστάλλου μέγιστης συχνότητας 20MHz. Δεδομένου ότι οι περισσότερες εντολές εκτελούνται σε ένα κύκλο ρολογιού έχουμε μέγιστη θεωρητική απόδοση 20MIPS. 1.5 Μνήμες AVR Υπάρχουν τριών τύπων μνήμες. Η μνήμη FLASH χρησιμεύει στην αποθήκευση του προγράμματος του μικροελεγκτή καθώς και στην αποθήκευση σταθερών δεδομένων. Η μνήμη EEPROM χρησιμεύει επίσης στην αποθήκευση σταθερών δεδομένων. Η μνήμη SRAM χρησιμεύει στην προσωρινή αποθήκευση δεδομένων κατά τον χρόνο εκτέλεσης. Στον παρακάτω πίνακα φαίνονται συνοπτικά οι υπάρχουσες μνήμες και τα γενικά χαρακτηριστικά τους. Ελάχιστη χωρητικότητα Μέγιστη χωρητικότητα Μονάδα Πτητική Ανάγνωση Εγγραφή 4 128 KB όχι ναι Σε ορισμένους EEPROM 0,25 4 KB όχι ναι ναι SRAM 0,25 16 KB ναι ναι ναι Τύπος FLASH Πίνακας 1.4 Μνήμες και χαρακτηριστικά τους 1.5.α FLASH Μη πτητική μνήμη μόνο ανάγνωσης. Περιέχει τις εντολές που θα εκτελέσει ο μικροελεγκτής καθώς και δεδομένα γνωστά κατά τον χρόνο συγγραφής του προγράμματος. Την μνήμη FLASH την προγραμματίζει ο χρήστης με κάποια από τις διαθέσιμες μεθόδους προγραμματισμού και τα περιεχόμενά της δεν προβλέπεται να τροποποιηθούν αν δεν επαναπρογραμματιστεί ο μικροελεγκτής. Σε ορισμένα μοντέλα AVR η μνήμη FLASH είναι εγγράψιμη από τον ίδιο τον μικροελεγκτή, γεγονός στο οποίο στηρίζεται η λειτουργία των bootloader. Κάτι τέτοιο ωστόσο, αν δεν γίνει με προσοχή, μπορεί να προκαλέσει καταστροφή του προγράμματος καθιστώντας τον μικροελεγκτή ανίκανο να εκκινήσει χωρίς επαναπρογραμματισμό, συνεπώς πρέπει να αποφεύγεται. 1.5.β EEPROM Μη πτητική μνήμη ανάγνωσης/εγγραφής την οποία μπορεί να προγραμματίσει ο χρήστης με κάποιες από τις μεθόδους προγραμματισμού. Μπορεί να χρησιμοποιηθεί για αποθήκευση σταθερών δεδομένων αν η χωρητικότητα της FLASH δεν επαρκεί, αλλά και για καταγραφή δεδομένων που γίνονται διαθέσιμα στον χρόνο εκτέλεσης. Για παράδειγμα σε μια εφαρμογή συλλογής μετρήσεων θερμοκρασίας, η EEPROM μπορεί να χρησιμοποιηθεί για την καταγραφή των δεδομένων. Η SRAM δεν θα μπορούσε να χρησιμοποιηθεί για αυτόν τον σκοπό αφού είναι πτητική μνήμη και τα περιεχόμενα της δεν είναι διαθέσιμα μετά την διακοπή της τροφοδοσίας, πράγμα που θα οδηγούσε στην απώλεια των συλλεχθέντων μετρήσεων. 1.5.γ SRAM Πτητική μνήμη ανάγνωσης/εγγραφής. Είναι η μνήμη που χρησιμοποιείται για την αποθήκευση προσωρινών δεδομένων του χρόνου εκτέλεσης. Στην μνήμη SRAM αποθηκεύ-17-

ονται οι μεταβλητές του προγράμματος του μικροελεγκτή. 1.6 Διευθυνσιοδότηση 1.6.α Χώροι διευθύνσεων Η μικροελεγκτές της σειράς AΤmega λόγω της Harvard αρχιτεκτονικής τους έχουν δύο χώρους διευθύνσεων, τον χώρο της μνήμης δεδομένων και τον χώρο της μνήμης προγράμματος. Η χώρος της μνήμης προγράμματος αντιστοιχεί στην μνήμη FLASH η οποία είναι προσβάσιμη ανά λέξη (2 byte). Ο χώρος διευθύνσεων δεδομένων δεν αντιπροσωπεύει μία μόνο μονάδα αποθήκευσης, αλλά, όπως φαίνεται στον παρακάτω πίνακα, στον χώρο αυτό έχουν αντιστοιχηθεί τρεις ετερογενείς μονάδες αποθήκευσης. Μονάδα αποθήκευσης Από διεύθυνση Έως διεύθυνση Καταχωρητές 0x0000 0x001F Καταχωρητές Περιφερειακών 0x0020 0x00FF SRAM 0x0100 Τέλος SRAM Πίνακας 1.5 Αντιστοίχιση διαφορετικών μονάδων αποθήκευσης στον χώρο διευθύνσεων της μνήμης δεδομένων Λόγω του ενιαίου χώρου διευθύνσεων μπορούμε να προσπελάσουμε με τις ίδιες εντολές τους καταχωρητές γενικού σκοπού, τους καταχωρητές περιφερειακών και την εσωτερική SRAM. Στην περίπτωση της SRAM ο χρόνος προσπέλασης είναι μεγαλύτερος κατά έναν κύκλο ρολογιού. 1.6.β Διευθυνσιοδότηση μνήμης δεδομένων Data direct Σε αυτό το σχήμα διευθυνσιοδότησης στο ίδιο το opcode της εντολής παρέχεται ολόκληρη η 16bit διεύθυνση που θέλουμε να προσπελάσουμε. Παράδειγμα:.dseg var:.byte 1 ;Δεσμεύω 1 byte για την μεταβλητή var.cseg LDS r16, var INC r16 STS var, r16 ;Φορτώνω τον r16 με την τιμή της μεταβλητής ;Αυξάνω κατά 1 ;Αποθηκεύω την νέα τιμή της μεταβλητής -18-

Σχήμα 1.1: Προσπέλαση Μνήμης SRAM me direct τρόπο Data indirect Σε αυτό το σχήμα διευθυνσιοδότησης ένας από τους X, Y, Z περιέχει την διεύθυνση που θέλουμε να προσπελάσουμε. Αυτό έχει το πλεονέκτημα ότι με αλλάγες του καταχωρητή διεύθυνσης μπορούμε να προσπελάσουμε γειτονικά δεδομένα, όπως πίνακες. Παράδειγμα:.dseg var1:.byte 1 ;Δεσμεύω 1 byte για την μεταβλητή var1.byte 15 ;Δεσμεύω 15 byte ανάμεσα στις var1, var2 var2:.byte 1 ;Δεσμεύω 1 byte για την μεταβλητή var2.cseg LDI XL, LOW(var) ;Φόρτωσε το λιγότερο σημαντικό byte της διεύθυνσης LDI XH, HIGH(var) ;Φόρτωσε το περισσότερο σημαντικό byte της διεύθυνσης LD r16, X ;Φόρτωσε στον r16, την τιμή της μεταβλητής LDI r20, 0x10 ; ADD XL, r20 ;Αύξησε την διεύθυνση κατά 16 θέσεις LD r17, X ;Φόρτωσε στον r17 την τιμή της μεταβλητής var2 Σχήμα 1.2: Προσπέλαση Μνήμης SRAM me indirect τρόπο Data indirect with displacement Όπως και στο προηγούμενο σχήμα ένας απο τους X, Y, Z περιέχει την διεύθυνσης, αλλά η τελική διεύθυνση που προσπελαύνουμε προκύπτει μετά από πρόσθεση μιας σταθεράς q στην τιμή του καταχωρήτή διεύθυνσης. Παράδειγμα: -19-

.dseg arr:.byte 10 ;Δεσμεύω χώρο για έναν πίνακα 10 byte.cseg LDI YL, LOW(arr) LDI YH, HIGH(arr) LDD r16, Y+2 ;Φορτώνω το λιγότερο σημαντικό byte της διεύθυνσης ;Φορτώνω το περισσότερο σημαντικό byte της διεύθυνσης ;Φόρτωσε στον r16 το τρίτο στοιχείο του πίνακα ;Ισοδύναμα σε C: r16=arr[2]; Σχήμα 1.3: Προσπέλαση Μνήμης SRAM me indirect τρόπο και displacement Data indirect with pre/post increment/decrement Με την indirect διευθυνσιοδότηση έχουμε την δυνατότητα να αυξήσουμε ή να μειώσουμε τον καταχωρητή διεύθυνσης πριν ή μετά την προσπέλαση. Αυτό είναι χρήσιμο όταν θέλουμε να προσπελάσουμε συνεχόμενα δεδομένα στην μνήμη όπως αλφαριθμητικά ή πίνακες. Παράδειγμα:.dseg arr:.byte 5 ;Δεσμεύω χώρο για έναν πίνακα 5 byte.cseg const_str:.db "12345" ;Δεσμεύω ΚΑΙ αρχικοποιώ ένα αλφαριθμητικό στην FLASH ;Φορτώνω την διεύθυνση του αλφαριθμητικού LDI ZL, LOW(str<<1) LDI ZH, HIGH(str<<1) ;Φορτώνω την διεύθυνση του πίνακα LDI YL, LOW(arr) LDI YH, HIGH(arr) LDI r17, 5 copyloop: LPM r16, Z+ ST Y+, r16 DEC r17 BRNE copyloop ;Φορτώνω το μέγεθος του αλφαριθμητικού ;Φορτώνω ένα byte απο την FLASH ;Αποθηκεύω το byte στην SRAM 1.6.γ Διευθυνσιοδότηση μνήμης προγράμματος Όπως έχουμε ήδη αναφέρει, στην μνήμη προγράμματος (FLASH) μπορούμε να αποθηκεύουμε σταθερά δεδομένα. Για να διαβάσουμε αυτά τα δεδομένα χρησιμοποιούμε σχήμα indirect διευθυνσιοδότησης με καταχωρητή διεύθυνσης τον Z. Έχουμε την δυνα-20-

τότητα pre/post increment. Η προσπέλαση της FLASH φαίνεται στο προηγούμενο παράδειγμα. 1.7 Προγραμματισμός Ο προγραμματισμός ενός μικροελεγκτή AVR περιλαμβάνει δύο στάδια. Το πρώτο είναι η συγγραφή του προγράμματος που θα εκτελεί ο μικροελεγκτής και το δεύτερο η εγγραφή των μνημών FLASH και EEPROM καθώς και ο καθορισμός των τιμών των fuse bits στα οποία θα αναφερθούμε αργότερα. Η συγγραφή του προγράμματος μπορεί να γίνει είτε απευθείας στην γλώσσα μηχανής του μικροελεγκτή (AVR Assembly), είτε σε γλώσσα C με χρήση κάποιου από τους διαθέσιμους compilers. Το προϊόν αυτού του σταδίου είναι ένα αρχείο μορφής intel hex (θα ονομάζεται αρχείο.hex στην συνέχεια) που περιέχει το τελικό δυαδικό πρόγραμμα μηχανής αλλά και τα δεδομένα που το συνοδεύουν, έτοιμο να αντιγραφεί στην μνήμη FLASH του μικροελεγκτή. Στην περίπτωση που θέλουμε να χρησιμοποιήσουμε την μνήμη EEPROM για επιπλέον σταθερά δεδομένα τότε παράγουμε ένα αρχείο.hex με τα περιεχόμενα της EEPROM το οποίο πρέπει επίσης να αντιγραφεί στον μικροελεγκτή. 1.7.α Assemblers Το πρώτο πρόγραμμα που έχει στην διάθεση του ο μηχανικός ενσωματωμένων συστημάτων για να παράγει το αρχείο hex με το οποίο θα προγραμματιστούν οι μικροελεγκτές είναι ο assembler. Αυτό που αναλαμβάνει να κάνει ο assembler είναι να μετατρέψει τις μνημονικές εντολές του assembly κώδικα σε δυαδική μορφή έτοιμη να γραφεί στην μνήμη του μικροελεγκτή. Επίσης εκτελεί διάφορους ελέγχους ορθότητας στην σύνταξη των εντολών και διευκολύνει στον χειρισμό των διευθύνσεων μνήμης δίνοντάς μας την δυνατότητα να χρησιμοποιούμε συμβολικά ονόματα. 1.7.β C Compilers Για να αποφύγουμε την επίπονη διαδικασία συγγραφής κώδικα assembly, υπάρχουν διαθέσιμοι C compilers επιτρέποντας την συγγραφή κώδικα C. Έτσι μειώνεται πολύ ο χρόνος ανάπτυξης μιας εφαρμογής καθώς και η πιθανότητα λογικών σφαλμάτων. Επίσης υπάρχουν διαθέσιμες οι στάνταρ βιβλιοθήκες της γλώσσας C που λύνουν πολλά συνηθισμένα προγραμματιστικά προβλήματα. 1.7.γ Fuse bits Πρόκειται για bits υλοποιημένα στο υλικό του μικροελεγκτή και παραμετροποιούν σημαντικά χαρακτηριστικά της λειτουργίας του μικροελεγκτή, όπως η διεύθυνση εκτέλεσης μετά από reset, το επιθυμητό ρολόι του συστήματος και άλλα. Η γνώση της τιμής τους και η σωστή ρύθμιση τους είναι απαραίτητη για την προβλέψιμη λειτουργία του μικροελεγκτή. 1.7.δ Αρχεία intel hex Πρόκειται για αρχεία απλού κειμένου ASCII που σκοπό έχουν να περιγράψουν την διάταξη δυαδικών δεδομένων σε μια μνήμη. Συνεπώς περιέχουν δυαδικά δεδομένα και τις αντίστοιχες διευθύνσεις τους. Κάθε γραμμή του αρχείου αποτελεί μια εγγραφή hex και έχει την εξής καθορισμένη μορφή. 1. Κωδικός έναρξης Ένας χαρακτήρας ':' που σηματοδοτεί την αρχή μιας εγγραφής. -21-

2. Άθροισμα byte 3. Διεύθυνση 4. Τύπος Εγγραφής 5. Δεδομένα 6. Checksum Δύο δεκαεξαδικά ψηφία που εκφράζουν τον αριθμό των bytes του πεδίου δεδομένων. 4 δεκαεξαδικά ψηφία που που εκφράζουν την διεύθυνση αρχής των δεδομένων που περιέχονται στην εγγραφή. (big endian) 2 δεκαεξαδικά ψηφία (00-05) που δηλώνουν τον τύπο αυτής της εγγραφής. Μια ακολουθία από 2ν δεκαεξαδικά ψηφία που αντιπροσωπεύουν ν bytes δεδομένων. 2 δεκαεξαδικά ψηφία που αντιπροσωπεύουν το λιγότερο σημαντικό ψηφίο του αθροίσματος όλων των πεδίων αυτής της εγγραφής, εκτός απο το 1 και το 6, σε μορφή συμπληρώματος ως προς δύο. Χρησιμεύει για τον έλεγχο της ορθότητας της εγγραφής. Παράδειγμα: Κωδικός έναρξης Άθροισμα byte Διέυθυνση Τύπος Εγγραφής Δεδομένα Checksum :10010000214601360121470136007EFE09D2190140 :100110002146017EB7C20001FF5F16002148011988 :10012000194E79234623965778239EDA3F01B2CAA7 :100130003F0156702B5E712B722B732146013421C7 1.8 Μέθοδοι προγραμματισμού Για να ολοκληρωθεί ο προγραμματισμός, πρέπει να αντιγραφούν τα δεδομένα που περιέχονται στα αρχεία.hex που παράχθηκαν στο προηγούμενο στάδιο, στην μνήμη του μικροελεγκτή. Αυτό μπορεί να επιτευχθεί με διάφορες μεθόδους. Ο πλήρης προγραμματισμός ενός AVR αποτελείται από τρεις συνιστώσες, την εγγραφή της FLASH, την εγγραφή της EEPROM και τον καθορισμό της τιμής των fuse bits. Δεν είναι όλες οι μέθοδοι ικανές για τον προγραμματισμό και των τριών συνιστωσών. Μόνο ο προγραμματισμός της FLASH είναι εφικτός με όλες τις μεθόδους. Στην συνέχεια θα εξετάσουμε τις διαθέσιμες μεθόδους και τις δυνατότητές τους. 1.8.α ISP (In system programming) Είναι η πιο διαδεδομένη μέθοδος προγραμματισμού. Βασίζεται στο πρωτόκολλο SPI για την επικοινωνία με τον μικροελεγκτή. Την επικοινωνία και συνεπώς τον προγραμματισμό αναλαμβάνει συσκευή που συνδέεται στον μικροελεγκτή και υλοποιεί το συγκεκριμένο πρωτόκολλο, ονομαζόμενη προγραμματιστής. Ο προγραμματιστής συνδέεται ταυτόχρονα με PC μέσω του οποίου ο χρήστης διεκπεραιώνει τον προγραμματισμό. Η σύνδεση του προγραμματιστή με τον μικροελεγκτή γίνεται μέσω 6 ακροδεκτών του ολοκληρωμένου και μπορεί να γίνει και με τον μικροελεγκτή κολλημένο σε τυπωμένο κύκλωμα με την προϋπόθεση να έχει προβλεφθεί χώρος για τον αντίστοιχο κονέκτορα. Με την συγκεκριμένη μέθοδο μπορεί να προγραμματιστεί πλήρως ένας AVR μικροελεγκτής. -22-

1.8.β HVPP (High voltage parallel) Αντίστοιχα με την παραπάνω μέθοδο, ένας προγραμματιστής συνδέεται στον AVR και αναλαμβάνει την επικοινωνία μαζί του με συγκεκριμένο πρωτόκολλο. Μπορεί να προγραμματιστεί πλήρως ένας AVR με αυτή την μέθοδο και είναι η μέθοδος στην οποία καταφεύγουμε αν για λόγους λανθασμένης ρύθμισης των fuse bits, όλες οι άλλες αποτυγχάνουν. 1.8.γ JTAG Το JTAG είναι ένα ευρέως διαδεδομένο πρότυπο που χρησιμοποιείται για debugging μικροϋπολογιστικών συστημάτων. Στους AVR μπορεί να χρησιμοποιηθεί και για προγραμματισμό. Όπως κα με τις παραπάνω μεθόδους χρειάζεται ειδική συσκευή που αναλαμβάνει την επικοινωνία. 1.8.δ Bootloader Σε αντίθεση με τις άλλες μεθόδους προγραμματισμού ο ίδιος ο μικροελεγκτής αναλαμβάνει την επικοινωνία με κάποια πηγή από την οποία θα κατεβάσει το πρόγραμμα με το οποία θα αυτό προγραμματίσει τις μνήμες του. Για να γίνει κάτι τέτοιο δυνατό πρέπει να εκτελείται στον μικροελεγκτή πρόγραμμα που υλοποιεί τα παραπάνω, δηλαδή επικοινωνία με κάποια πηγή λογισμικού και προγραμματισμό. Το μειονέκτημα που προκύπτει είναι ότι σε έναν καινούριο AVR πρέπει να καταφύγουμε σε κάποια από τις υπόλοιπες μεθόδους για να προγραμματίσουμε το πρόγραμμα του ίδιου του bootloader την πρώτη φορά πριν αυτός είναι σε θέση να χρησιμοποιηθεί. Το πλεονέκτημα είναι ότι από την στιγμή που προγραμματιστεί ο bootloader, δεν χρειαζόμαστε καμία επιπλέον συσκευή αφού μπορούμε να κάνουμε χρήση οποιουδήποτε από τα ενσωματωμένα περιφερειακά επικοινωνίας του μικροελεγκτή για κατέβασμα του προγράμματος. Δεν είναι δυνατό να γίνει χρήση bootloader σε όλους τους AVR. Αυτοί που έχουν την δυνατότητα χωρίζουν την FLASH μνήμη τους σε δύο τμήματα. Ένα τμήμα που θα φιλοξενήσει το πρόγραμμα χρήστη και ένα μικρότερο για τον bootloader. Κάθε φορά που εκκινεί ο μικροελεγκτής ελέγχει μια συνθήκη η οποία καθορίζει αν θα εκτελεστεί αυτός ή το πρόγραμμα του χρήστη. Αυτή η συνθήκη μπορεί να είναι η τιμή κάποιου διακόπτη που ο χρήστης θα πιέζει για να σηματοδοτήσει την εκκίνηση διαδικασίας προγραμματισμού ή δεν θα πιέζει ώστε να εκτελεστεί το πρόγραμμα χρήστη. -23-

-24-

2. Δίκτυο ΤΚΝ 2.1 Προδιαγραφές Στόχος μας είναι να σχεδιάσουμε ένα δίκτυο επικοινωνίας μικροεπεξεργαστών που θα μπορεί να αξιοποιηθεί από φοιτητές, στα πλαίσια των εργαστηριακών ασκήσεων του εισαγωγικού μαθήματος μικροϋπολογιστών. Η προγραμματιστική διεπαφή που θα παρέχεται στους χρήστες του δικτύου θα πρέπει να είναι εύχρηστη, ώστε ένας φοιτητής χωρίς εμπειρία στον προγραμματισμό μικροεπεξεργαστών σε συμβολική γλώσσα, να είναι σε θέση με απλό τρόπο να πετύχει την επικοινωνία μεταξύ ενός αριθμού μικροεπεξεργαστών. Απλή και χωρίς πολλά περιφερειακά και ηλεκτρονικά στοιχεία πρέπει να είναι και η ηλεκτρική σύνδεση των κόμβων, ώστε να είναι εύκολα κατανοητή από τους φοιτητές, χωρίς να προσθέτει επιπλέον πολυπλοκότητα στο υπόλοιπο κύκλωμα που χρησιμοποιείται για την διεξαγωγή των εργαστηριακών ασκήσεων. 2.2 Φυσικό επίπεδο Ο εκπαιδευτικός χαρακτήρας του δικτύου, όπως περιγράφεται παραπάνω, και η απαίτηση για απλότητα θα καθορίσουν τις προδιαγραφές που πρέπει να ακολουθηθούν κατά την σχεδίαση του δικτύου. Η αρχική απόφαση που πρέπει να πάρουμε αφορά το φυσικό επίπεδο του δικτύου, δηλαδή την φυσική σύνδεση των κόμβων για την αποστολή και λήψη μεμονομένων bit. Επιλέξαμε να υλοποιήσουμε το φυσικό επίπεδο κάνοντας χρήση της σειριακής θύρας UART. Το πλεονέκτημα αυτής της επιλογής είναι ότι οι θύρες UART είναι διαδεδομένες στον κόσμο των μικροελεγκτών και οι περισσότερες οικογένειες φέρουν ενσωματωμένο κύκλωμα σειριακής επικοινωνίας UART. Επίσης θύρα UART, βρίσκουμε στους προσωπικούς υπολογιστές, γεγονός που θα επιτρέψει την υλοποίηση του δικτύου και για αυτούς. 2.3 Τοπολογία Η απαίτηση για απλή ηλεκτρική σύνδεση έχει άμεσο αντίκτυπο στην τοπολογία του δικτύου. Η τοπολογία που επιλέξαμε είναι τοπολογία δακτυλίου. Θα εξετάσουμε τις συνήθεις τοπολογίες δικτύων, ώστε να δείξουμε τι μας οδήγησε σε αυτή την επιλογή. Τοπολογία διαύλου Η ύπαρξη ενός κεντρικού ηλεκτρικού διαύλου στον οποίο θα έπρεπε να συνδεθούν όλες οι UART θα δημιουργούσε ορισμένα προβλήματα. Σύμφωνα με το πρωτόκολλο σειριακής επικοινωνία, όταν το κανάλι μετάδοσης είναι αδρανές, πρέπει να βρίσκεται σε υψηλή στάθμη. Αυτό συνεπάγεται ότι δεν είναι δυνατόν να συνδεθούν όλοι οι transmitter απευθείας στον δίαυλο, γιατί έτσι θα είχαμε σύγκρουση των ηλεκτρικών στάθμεων των διαφορετικών κόμβων. Η σύνδεση θα ήταν δυνατή αν κάθε transmitter βρισκόταν σε κατάσταση υψηλής εμπέδησης τις χρονικές στιγμές που δεν μετέδιδε και ο δίαυλος γινόταν pull up σε υψηλό δυναμικό. Η πολυπλοκότητα που θα απαιτούσε κάτι τέτοιο δεν είναι αποδεκτή. Άλλο πρόβλημα είναι οι συγκρούσεις στην μετάδοση που θα συνέβαιναν λόγω του κοινού διαύλου. Για να διαχειριστούμε το φαινόμενο των συγκρούσεων θα έπρεπε να φροντίσουμε για τον συγχρονισμό των κόμβων. Ο συγχρονισμός αυτός θα χρειαζόταν είτε ένα sloted πρωτόκολλο και την ύπαρξη κοινού ρολογιού στο δίκτυο, είτε έναν master κόμβο που θα αναλάμβανε τον συγχρονισμό των υπολοίπων. Και στις δύο περιπτώσεις η πολυπλοκότητα δεν είναι -25-

αποδεκτή. Τοπολογία αστέρα Η τοπολογία αστέρα απαιτεί την ύπαρξη ενός κεντρικού ελεγκτή στον οποίο συνδέονται όλοι οι κόμβοι και αυτός αναλαμβάνει την προώθηση των πακέτων στον αποδέκτη. Η ύπαρξη ενός τέτοιου κόμβου θα προσέθετε επιπλέον κόστος και πολυπλοκότητα στο συνολικού δίκτυο. Αυτό έρχεται σε αντίθεση με τον στόχο μας να κατασκευάσουμε ένα απλό δίκτυο μικροεπεξεργαστών με ελάχιστο αριθμό εξωτερικών στοιχείων. Τοπολογία δακτυλίου Η τοπολογία που τελικά επιλέξαμε να χρησιμοποιήσουμε. Η τοπολογία δακτυλίου έχει το χαρακτηριστικό ότι κάθε κόμβος έχει ηλεκτρική σύνδεση μόνο με δύο άλλους κόμβους, καθένας εκ των οποίων συνδέεται σε διαφορετικό ακροδέκτη. Έτσι εξαλείφεται το πρόβλημα των ηλεκτρικών συγκρούσεων (ηλεκτρική στάθμη καναλιού), αλλά και των λογικών συγκρούσεων (ταυτόχρονη μετάδοση στο κανάλι). Η συνδεσμολογία που απαιτείται είναι αυτή που φαίνεται στο Σχήμα 2.1. Μικροελεγκτής 1 Rx Tx Μικροελεγκτής 2 Rx Tx Μικροελεγκτής 3 Rx Tx Σχήμα 2.1: Τοπολογία του δικτύου Κάθε κόμβος του δικτύου συνδέεται μέσω του ακροδέκτη Tx της UART που διαθέτει στον ακροδέκτη Rx της UART του επόμενου κόμβου. Με αυτόν τον τρόπο σχηματίζεται ο δακτύλιος του δικτύου. Σε ένα υπάρχων κύκλωμα, αρκεί η προσθήκη ενός αγωγού από κόμβο σε κόμβο ώστε να διασυνδεθούν όλοι στο δίκτυο και να αποκτήσουν δυνατότητα επικοινωνίας. 2.4 Πρωτόκολλο σύνδεσης δεδομένων Σε αυτό το στάδιο της σχεδίασης έχουμε δημιουργήσει τις προϋποθέσεις ώστε ένας κόμβος, να είναι σε θέση να στείλει δεδομένα στον επόμενο από αυτόν κόμβο του δακτυλίου και να λάβει από τον προηγούμενο. Στόχος μας όμως είναι να μπορεί κάθε κόμβος να επικοινωνεί με οποιονδήποτε από τους παρόντες κόμβους. Για να γίνει αυτό δυνατό, πρέπει να σχεδιάσουμε ένα πρωτόκολλο σύνδεσης δεδομένων (OSI 2). 2.4.α Λειτουργίες πρωτοκόλλου Σύμφωνα με το μοντέλο αναφοράς OSI: Κάθε επίπεδο αξιοποιεί τις λειτουργίες του κατώτερού του στη στοίβα επιπέδου, ενώ στόχος του είναι να παρέχει λειτουργικότητα στο αμέσως ανώτερο επίπεδό του. Συνεπώς το πρωτόκολλο που πρέπει να σχεδιάσουμε θα χρησιμοποιεί τις λειτουργίες αποστολής και λήψης byte της σειριακής θύρας που υλοποιεί το φυσικό επίπεδο (OSI 1) για να παρέχει συγκεκριμένη λειτουργικότητα στα επόμενα επίπεδα της στοίβας. Ένα πρωτόκολλο σύνδεσης δεδομένων πρέπει να υλοποιεί τις παρακάτω λειτουργίες: -26-

Απόδοση μοναδικής διεύθυνσης σε κάθε κόμβο. Λογική σύνδεση κόμβων. Ανίχνευση και διόρθωση λαθών μετάδοσης. 2.4.β Πακέτα πρωτοκόλλου Για να υλοποιηθούν οι παραπάνω λειτουργίες, πρέπει μεταξύ των κόμβων να ανταλλάσσονται εκτός από τα τα δεδομένα, και πληροφορίες ελέγχου. Για να γίνει αυτό δυνατό, πρέπει να εδραιωθεί ένας οργανωμένος τρόπος ανταλλαγής δεδομένων. Η λύση είναι όλη κίνηση στο δίκτυο να διακινείται μέσω προκαθορισμένων πακέτων. Πρόκειται για ακολουθίες byte σταθερού μήκους και προκαθορισμένης μορφής. Στο συγκεκριμένο πρωτόκολλο χρησιμοποιούμε τριών τύπων πακέτα. Ορισμένα πεδία είναι κοινά και στους τρεις τύπους πακέτων. Πέρα από τα κοινά πεδία, κάθε τύπος πακέτου έχει πεδία που εξυπηρετούν τον ρόλο που παίζει στην λειτουργία του δικτύου. Οι τρεις τύποι πακέτων φαίνονται συγκεντρωμένοι στον παρακάτω πίνακα. BYTE # 0 1 2 3 4 5 6..21 22 Data: Header 0x00 Type 0xAA Receiver ID 0x01-0xFF Sender ID 0x01-0xFF Packet ID 0x00-0xFF CRC 16 bytes of data EOP 0xFF Ack: Header 0x00 Type 0xBB Receiver ID 0x01-0xFF Sender ID 0x01-0xFF Packet ID 0x00-0xFF EOP 0xFF Token: Header 0x00 Type 0xCC Receiver ID 0x01-0xFF Sender ID 0x01-0xFF EOP 0xFF Πίνακας 2.1: Τύποι πακέτων πρωτοκόλλου Τα περισσότερα πεδία δεν χρειάζονται επεξήγηση. Θα αναφερθούμε μόνο στο πεδίο ταυτότητας πακέτου και στον χαρακτήρα ελέγχου. Ο χαρακτήρας ελέγχου χρησιμοποιείται στην μεριά του παραλήπτη για να διαπιστωθεί εάν υπήρξε κάποιο σφάλμα στη μετάδοση. Υπολογίζεται το CRC των δεδομένων και συγκρίνεται με τον χαρακτήρα ελέγχου. Αν αυτά τα δύο δεν είναι ίσα, τότε τα δεδομένα θεωρούνται κατεστραμμένα. Η ταυτότητα πακέτου υπάρχει για να μπορεί το πακέτο ack να διευκρινίζει σε πακέτο δεδομένων αναφέρεται. 2.4.γ Αλγόριθμος πρωτοκόλλου Το πακέτο token κυκλοφορεί συνεχώς στο δίκτυο, μεταδιδόμενο από κόμβο σε κόμβο. Τα πακέτα δεδομένων και τα πακέτα ack φτάνουν στον τελικό τους προορισμό με επαναλαμβανόμενες προωθήσεις από όλους τους ενδιάμεσους κόμβους μεταξύ αποστολέα και παραλήπτη. -27-

Δέκτης Ο παραλήπτης λαμβάνει συνεχώς bytes απο την σειριακή θύρα. Όταν αναγνωρίσει την έναρξη ενός πακέτου κάνει τις εξής ενέργειες: Εξακριβώνει τον τύπο του πακέτου. Εξακριβώνει το μέγεθος του πακέτου. Λαμβάνει το υπόλοιπο του πακέτου. Κατά την ολοκλήρωση της λήψης ενός ολοκληρωμένου πακέτου εκτελεί συγκεκριμένες ενέργειες σύμφωνα με τον τύπο του πακέτου ελήφθη. Πακέτο token: Ειδοποιεί τον transmitter ότι ελήφθη token. Πακέτο ack: Αν το συγκεκριμένο πακέτο ack προορίζεται για άλλον παραλήπτη, το προωθεί, αλλιώς ειδοποιεί τον transmitter για την λήψη ack. Πακέτο δεδομένων: Αν το συγκεκριμένο πακέτο δεδομένων προορίζεται για άλλον παραλήπτη, το προωθεί αλλιώς: Ελέγχει την ορθότητα του πακέτου σύμφωνα με το CRC byte και τον επιλεγμένο αλγόριθμο υπολογισμού CRC. Αν έχει μεταδοθεί σωστά, το τοποθετεί στην πρώτη διαθέσιμη θέση της ουράς μετάδοσης και στέλνει στον αποστολέα ένα πακέτο ack. Αν η ουρά είναι γεμάτη το πακέτο αγνοείται και δίνεται κατάλληλο μήνυμα στα ανώτερα επίπεδα (πχ στο επίπεδο εφαρμογής Αν δεν έχει μεταδοθεί σωστά, το πακέτο αγνοείται και δεν στέλνεται καμία απόκριση στον αποστολέα. Πομπός Όταν ο δέκτης παραλάβει το token, τότε ειδοποιεί τον πομπό. Αυτός με την σειρά του κάνει τα εξής: Αν η ουρά μετάδοσης είναι άδεια μεταδίδει το token στον επόμενο. Αν η ούρα περιέχει τουλάχιστον ένα πακέτο τότε ο πομπός εκτελεί την παρακάτω διαδικασία. Στέλνει το πρώτο πακέτο δεδομένων της ουράς μετάδοσης. Αφού μεταδώσει το πακέτο δεδομένων, περιμένει για ένα μέγιστο χρονικό διάστημα time-out την λήψη πακέτου θετικής αναγνώρισης από τον παραλήπτη. Αν λάβει πακέτο θετικής αναγνώρισης πριν εκπνεύσει ο time-out χρόνος, το πακέτο αποσύρεται από την κορυφή της ουράς μετάδοσης και όλα τα υπόλοιπα πακέτα που πιθανώς υπάρχουν στην ουρά μεταφέρονται μια θέση πιο κάτω. Αν δεν υπάρξει θετική αναγνώριση, το πακέτο δεν αποσύρεται από την ουρά. Στην επόμενη λήψη του token θα γίνει και πάλι προσπάθεια να αποσταλεί το ίδιο πακέτο. Ανεξάρτητα από την επιτυχία της αποστολής του πακέτου δεδομένων, σε αυτό το σημείο το token μεταδίδεται στον επόμενο κόμβο. -28-

2.4.δ Σχηματική αναπαράσταση κόμβου Στο Σχήμα 2.3 απεικονίζεται σχηματικά ο κόμβος του δικτύου. Διακρίνονται τα τρία επίπεδα της στοίβας OSI, καθώς και οι τρόποι που αυτά αλληλεπιδρούν μεταξύ τους. Οι λειτουργίες του πρωτοκόλλου ξεκινάνε πάντα από τον δέκτη. Ο δέκτης λαμβάνει συνεχώς δεδομένα με την μορφή σειράς από byte από την σειριακή θύρα. Αυτή η λειτουργία φαίνεται στο Σχήμα 2.2 οπού απεικονίζεται ο δέκτης ενός κόμβου του δικτύου σαν μηχανή πεπερασμένων καταστάσεων:! 0x00 IDLE! (0x00 0xAA 0xBB 0xCC) 0x00 0xAA 0x00 Header byte 0 DATA byte 6..21 Type=DATA byte 1 Receiver byte 2 0xBB Sender byte 3 Packet ID byte 4 EOP byte 22 CRC byte 5 Type = ACK byte 1 EOP byte 6 0xCC Type=TOKEN byte 1 EOP byte 4 Σχήμα 2.2: Ο δέκτης σαν μηχανή καταστάσεων Όταν ανιχνευτεί ένα ολόκληρο πακέτο, πυροδοτείται κάποια διαδικασία ανάλογα με τον τύπο του πακέτου, όπως περιγράφεται πιο πάνω στην παράγραφο για τον δέκτη. Το τέλος ενός πακέτου σηματοδοτείται από ένα byte 0xFF (EOP). Το επίπεδο σύνδεσης δεδομένων, το οποίο υλοποιήσαμε, αποτελείται από δύο ουρές δεδομένων και δύο buffer, για τον δέκτη και τον αποστολέα αντίστοιχα. Η ουρά λήψης γεμίζει από το φυσικό επίπεδο από τα ληφθέντα δεδομένα και καταναλώνεται από το επίπεδο εφαρμογής, ενώ η ουρά αποστολής γεμίζει από το επίπεδο εφαρμογής και καταναλώνεται στο φυσικό επίπεδο. Η αναγκαιότητα των ουρών έγκειται στην αδυναμία σύμπτωσης των ρυθμών κατανάλωσης και παραγωγής. Στην περίπτωση των εξερχόμενων πακέτων, χωρίς την ύπαρξη ουρών, αν η εφαρμογή δημιουργήσει σε ένα χρονικό διάστημα περισσότερα πακέτα από όσα μπορούν να αποσταλούν στο δίκτυο, αυτό θα έχει σαν αποτέλεσμα την αναμονή της εφαρμογής για την αποστολή όλων των πακέτων. Με την χρήση της ουράς μετάδοσης, λύνεται αυτό το πρόβλημα, αφού τα πακέτα προς αποστολή αποθηκεύονται στην προσωρινά στην ουρά και αποστέλλονται στον κατάλληλο χρόνο χωρίς η εφαρμογή να χρειάζεται να περιμένει. Στην περίπτωση των εισερχόμενων πακέτων, με την χρήση ουρών, αποφεύγουμε την περίπτωση που η εφαρμογή δεν προλαβαίνει να επεξεργαστεί ένα πακέτο πριν την λήψη του επόμενου, γεγονός που θα οδηγούσε στην απώλεια δεδομένων. Συνοψίζοντας μπορούμε να πούμε ότι οι ουρές υπάρχουν για να απορροφούν αιχμές -29-

στην παραγωγή δεδομένων, που δεν μπορούν να εξυπηρετηθούν εξαιτίας περιορισμών τόσο στην ταχύτητα του δικτύου για τα εξερχόμενα πακέτα, όσο και στην υπολογιστική ισχύ του κόμβου στην περίπτωση των εισερχόμενων πακέτων. Physical Layer serial byte transmit serial byte receive Data Link Layer RX_BUFFER byte 0-5 POINTER_OUT TX_BUFFER byte 6..21 incoming_packet_data byte 22 byte 0-5 byte 6..21 outgoing_packet_data NOT FOR ME Send RX_BUFFER ACK received Transmission OK DATA received Send ACK TOKEN received Send data + token byte 22 RX_QUEUE TX_QUEUE data address data address incoming_packet_data address outgoing_packet_data address incoming_packet_data address outgoing_packet_data address incoming_packet_data address outgoing_packet_data address POINTER_OUT POINTER_IN POINTER_IN Application Layer Receive packet Send packet Σχήμα 2.3: Σχηματική αναπαράσταση κόμβου -30-

2.5 Θεωρητική Ανάλυση Επιδόσεων Γνωρίζοντας την ταχύτητα της σειριακής θύρας και τον αλγόριθμο του πρωτοκόλλου μπορούμε να κάνουμε θεωρητική μελέτη των αναμενόμενων επιδόσεων του δικτύου σε διαφορετικές συνθήκες φορτίου. Τα μεγέθη που θέλουμε να υπολογίσουμε είναι η μέγιστη καθυστέρηση πακέτου και το throughput. 2.5.α Παράμετροι Τα μεγέθη αυτά δεν είναι σταθερά, αλλά εξαρτώνται από ορισμένες παραμέτρους. Καταρχάς από τις συνθήκες φορτίου, δηλαδή από το ποσό της πληροφορίας που επιθυμούν να στείλουν οι κόμβοι σε μια δεδομένη χρονική περίοδο. Όταν για παράδειγμα ένας κόμβος βρίσκεται εν μέσω αποστολής ενός μεγάλου αρχείου, τότε η καθυστέρηση για τους άλλους κόμβους αυξάνει. Το πλήθος των κόμβων που υπάρχουν στο δίκτυο είναι μια ακόμη παράμετρος που πρέπει να εξεταστεί και η οποία παίζει σημαντικό ρόλο, λόγω του ότι κάθε πακέτο ταξιδεύει μέσω των άλλων κόμβων. Ακόμα και για να στείλει ένας κόμβος στον αμέσως επόμενο κόμβο του δακτυλίου ένα πακέτο δεδομένων, το πακέτο αναγνώρισης (ACK) θα πρέπει να περάσει από όλους τους υπόλοιπους κόμβους εφόσον τα δεδομένα κινούνται κατά την μία κατεύθυνση. 2.5.β Περιορισμοί Πραγματικού Χρόνου Για να μπορεί να θεωρηθεί ένα δικτυακό πρωτόκολλο πραγματικού χρόνου, πρέπει να ικανοποιεί τον περιορισμό πραγματικού χρόνου. Αυτό σημαίνει ότι ο χρόνος από την στιγμή που θα τοποθετηθεί ένα πακέτο στην ουρά αποστολής ενός κόμβου, μέχρι να φτάσει στον προορισμό του, πρέπει να είναι φραγμένος σε κάθε περίπτωση. Αυτός ο περιορισμός ικανοποιείται στην περίπτωση μας. Λόγω του σχεδιασμού του πρωτοκόλλου, είναι εγγυημένο ότι δεν υπάρχουν συγκρούσεις στο κανάλι επικοινωνίας αφού η χρήση του καναλιού επιτρέπεται μόνο με κατοχή του πακέτου token το οποίο είναι μοναδικό σε όλο το δίκτυο και δίνει στον κόμβο-κάτοχο την αποκλειστική δυνατότητα να χρησιμοποιήσει το κανάλι για όσο το έχει στην κατοχή του. Επιπλέον χάρη στην συνδεσμολογία δεν υπάρχει κάποιος ηλεκτρικός διάδρομος στον οποίο να συνδέονται πάνω από δύο κόμβοι Κάθε σύνδεση είναι ένας με έναν (Tx-->Rx). Έτσι υπάρχει μεγάλη ασφάλεια και αξιοπιστία στην μετάδοση των δεδομένων. Επίσης, λόγω του ότι σε κάθε απόκτηση του token κάθε κόμβος επιτρέπεται από το πρωτόκολλο να στείλει μόνο ένα πακέτο δεδομένων, εξασφαλίζεται ότι ακόμα και σε συνθήκες μέγιστου φόρτου κάθε κόμβος θα έχει πάντα στην διάθεση του ένα κλάσμα του συνολικού χρόνου για αποστολή και δεν μπορεί κάποιος να μονοπωλήσει το κανάλι. Οι συνθήκες μέγιστου φόρτου είναι και αυτές που θα καθορίσουν το άνω φράγμα στην καθυστέρηση πακέτου. Μέγιστος φόρτος σημαίνει ότι κάθε κόμβος έχει δεδομένα προς αποστολή κάθε φορά που παραλαμβάνει το token και δικαιούται να στείλει. Αυτό είναι και το χειρότερο σενάριο όσον αφορά το throughput. Σε κάθε περίπτωση εφόσον μπορούμε να καθορίσουμε άνω φράγμα για την καθυστέρηση, το δίκτυο μπορεί να χαρακτηριστεί ως δίκτυο πραγματικού χρόνου. 2.5.γ Tokens Per Second Το μέγεθος που υπολογίσαμε και από το οποίο θα εξάγουμε το throughput είναι ο αριθμός των token που περνάνε από ένα κόμβο ανά δευτερόλεπτο (Tokens Per Second-31-

TPS). Το μέγεθος αυτό υπολογίστηκε για τις εξής διαφορετικές συνθήκες: 1) Για πλήρη αδράνεια 2) για την περίπτωση πού ένας κόμβος στέλνει συνέχεια δεδομένα με τον μέγιστο ρυθμό (Full Load) και 3) για την περίπτωση που όλοι οι κόμβοι εκτός από έναν στέλνουν συνεχώς δεδομένα σε αυτόν που δεν στέλνει. Τα παραπάνω υπολογίστηκαν για τέσσερα διαφορετικά baud rate της σειριακής θύρας. 2.5.δ Πρόγραμμα Υπολογισμού Για τον υπολογισμό γράφτηκε ένα απλό πρόγραμμα python. Αρχικά θέτουμε τα μεγέθη σε byte των τριών ειδών πακέτων που υπάρχουν στο πρωτόκολλο. #!/usr/bin/env python # -*- coding: utf-8 -*# # Speed-Baud.py # # Calculate the expected speed of the network measured # in tokens per second (tps) for different values of: # baud rate, nodes present, and situations BAUD = [9600, token_size = ack_size = data_size =... 38400, 57600, 115200] 5 6 23 Αρχικά, για την κατάσταση που το δίκτυο βρίσκεται σε αδράνεια θέλουμε να βρούμε τον αριθμό των token που κυκλοφορούν ανά δευτερόλεπτο. Στην περίπτωση αυτή το μόνο πακέτο που αποστέλλεται είναι το token. Κάθε κόμβος την στιγμή που το λαμβάνει το στέλνει απευθείας. Για κάθε byte το πρωτόκολλο σειριακής επικοινωνίας στο οποίο στηριζόμαστε στο φυσικό επίπεδο. Στέλνει 10 bits (8bit πληροφορίας + start bit + stop bit). Διαιρώντας με το baud rate, βρίσκουμε τα tokens per second. def speedidle(): print "n", for baud in BAUD: print baud, print for n in range(2, 10): print n, for baud in BAUD: bytecount = n*token_size bitcount = 10*byteCount tps = baud / bitcount print tps, print return 0 Για την περίπτωση 1) που ένας κόμβος στέλνει συνεχώς θα πρέπει να μεταφερθούν τα απαραίτητα tokens το πακέτο δεδομένων, καθώς και το ack. Στο σενάριο αυτό παίζει ρόλο η απόσταση των 2 κόμβων (του αποστολέα και του παραλήπτη). Όσο πιο κοντά βρίσκονται αυτοί οι δύο τόσο πιο γρήγορα γίνεται η αποστολή διότι χρειάζονται λιγότερες αναμεταδόσεις. Συνεπώς για να φανεί αυτή η διαφορά, υπολογίστηκε το TPS για την περίπτωση που κάποιος κόμβος στέλνει στον αμέσως επόμενο, στον μεθεπόμενο και στον κόμβο που βρίσκεται τρεις θέσεις μακρυά. def speedfullsingle(): for i in range(1, 4): print "i =", i -32-

print "n", for baud in BAUD: print baud, print for n in range(2, 10): print n, for baud in BAUD: bytecount = (data_size*i) + (ack_size*(n-i+1)) + (token_size*n) bitcount = 10*byteCount tps = baud / bitcount if tps>0: print tps, else: print 0, print print return 0 Τέλος για την περίπτωση 3) υπολογισμοί έγιναν μόνο για baud=57600 και το πρόγραμμα είναι το εξής: def speedfull(): print "n", BAUD = [57600] for baud in BAUD: print baud, print for n in range(2, 10): print n, for baud in BAUD: bytecount = n*token_size + sum(range(n)) * (data_size+ack_size) bitcount = 10*byteCount tps = baud / bitcount print tps, print return 0-33-

2.5.ε Αποτελέσματα TPS Για συνθήκες αδράνειας: n 9600 38400 57600 115200 2 96 384 576 1152 3 64 256 384 768 4 48 192 288 576 5 38 153 230 460 6 32 128 192 384 7 27 109 164 329 8 24 96 144 288 9 21 85 128 256 Πίνακας 2.2: TPS - Συνθήκες αδράνειας TKN Speed Idle 1400 1200 1000 9600 38400 57600 115200 tps 800 576 600 384 400 288 230 192 164 144 128 5 6 7 8 9 200 0 1 2 3 4 10 nodes present Σχήμα 2.4: Tokens Per Second σε κατάσταση μηδενικού φόρτου για διφορετικά baud rate και πλήθος κόμβων στο δίκτυο -34-

TPS Όταν ένας στέλνει συνέχεια στον επόμενό του: n 9600 38400 57600 115200 2 21 85 128 256 3 17 68 102 205 4 14 57 85 171 5 12 49 73 147 6 10 43 64 129 7 9 38 57 115 8 8 34 51 103 9 7 31 47 94 Πίνακας 2.3: TPS - Ένας κόμβος στέλνει στον κόμβο απόστασης 1 TKN Speed Full load single #1 300 250 tps 200 150 9600 38400 57600 115200 128 102 100 85 73 64 57 51 47 6 7 8 9 50 0 1 2 3 4 5 10 nodes present Σχήμα 2.5: Tokens Per Second όταν ένας κόμβος στέλνει συνεχώς δεδομένα στον κόμβο που βρίσκεται δίπλα του -35-

TPS Όταν ένας κόμβος στέλνει συνέχεια στον κόμβο απόστασης 3 θέσεων n 9600 38400 57600 115200 2 15 61 92 185 3 13 52 78 157 4 11 45 68 137 5 10 40 60 121 6 9 36 54 108 7 8 32 49 98 8 7 30 45 90 9 6 27 41 82 Πίνακας 2.4: TPS - Ένας κόμβος στέλνει στον κόμβο απόστασης 2 tps TKN Speed Full load Single #2 200 180 160 140 120 100 80 60 40 20 0 92 1 2 78 3 68 4 60 5 54 49 45 41 6 7 8 9 9600 38400 57600 115200 10 Nodes present Σχήμα 2.6: Tokens Per Second όταν ένας κόμβος στέλνει συνεχώς δεδομένα στον κόμβο που βρίσκεται σε απόσταση 2-36-

TPS Όταν ένας κόμβος στέλνει συνέχεια στον κόμβο απόστασης 3 θέσεων: n 9600 38400 57600 115200 2 12 48 72 145 3 10 42 64 128 4 9 38 57 114 5 8 34 51 102 6 7 31 46 93 7 7 28 42 85 8 6 26 39 79 9 6 24 36 73 Πίνακας 2.5: TPS - Ένας κόμβος στέλνει στον κόμβο απόστασης 3 TKN Speed Full load Single #3 160 140 120 9600 38400 57600 115200 tps 100 72 80 64 60 57 51 46 42 39 36 6 7 8 9 40 20 0 1 2 3 4 5 10 nodes present Σχήμα 2.7: Tokens Per Second όταν ένας κόμβος στέλνει συνεχώς δεδομένα στον κόμβο που βρίσκεται σε απόσταση 3-37-

TPS Όταν στέλνουν όλοι οι κόμβοι σε έναν: n 9600 38400 57600 115200 2 - - 147-3 - - 56-4 - - 29-5 - - 18-6 - - 12-7 - - 8-8 - - 6-9 - - 5 - Πίνακας 2.6: TPS - Όλοι οι κόμβοι στέλνουν συνέχεια σε έναν που δεν στέλνει. TKN Speed Full load 160 147 140 120 tps 100 80 57600 56 60 40 29 20 18 12 8 6 5 6 7 8 9 0 1 2 3 4 5 10 nodes present Σχήμα 2.8: Tokens Per Second όταν όλοι οι κόμβοι στέλνουν συνεχώς σε έναν. -38-

2.5.στ Καθυστέρηση Πακέτου Από το μέγεθος Tokens Per Second που υπολογίστηκε θα εξαχθεί η καθυστέρηση πακέτου για τις διάφορες συνθήκες. Από την χειρότερη περίπτωση, που είναι η περίπτωση 3) δηλαδή όταν όλοι οι κόμβοι έχουν πάντα δεδομένα προς αποστολή θα υπολογιστεί και το φράγμα της καθυστέρησης. Στην καθυστέρηση συμβάλει αρνητικά το μέγεθος των ουρών μετάδοσης. Όπως όμως εξηγήσαμε είναι απαραίτητες ώστε να μην μπλοκάρει η εκτέλεση του κυρίως προγράμματος από το δίκτυο που είναι σαφώς αργότερο του μικροελεγκτή. Για δεδομένο tps, ένα πακέτο από την στιγμή που θα τοποθετηθεί στην ουρά μετάδοσης και υποθέτοντας στην χειρότερη περίπτωση ότι τοποθετείται στην τελευταία θέση, χρειάζεται latency = (tps-1 x queue_size) χρόνο για να είμαστε σίγουροι ότι μεταδόθηκε επιτυχώς. Στον παρακάτω πίνακα απεικονίζονται οι μέγιστες καθυστερήσεις πακέτων για τις παραπάνω συνθήκες. IDLE Συνθήκες Baud: 57600 N:4 Ένας κόμβος στέλνει συνέχεια στον Όλοι στέλνουν συκόμβο απόσταστης: νέχεια σε έναν - 1 2 3-27.7 ms 94.1 ms 117.6 ms 140.3 ms 275.8 ms Πίνακας 2.7: Μέγιστη καθυστέρηση πακέτου σε διάφορες συνθήκες (ms) Η καθυστέρηση δείχνεται μόνο για baud=57600 και 4 κόμβους παρόντες στο δίκτυο, την διάταξη που χρησιμοποιήθηκε και στις πειραματικές μετρήσεις του φυσικού δικτύου ώστε να γίνει άμεση σύγκριση στο κατά πόσο συμφωνεί η θεωρία με τις πραγματικές μετρήσεις. 2.5.ζ Throughput Για τον υπολογισμό του Throughput ενός κόμβου, δηλαδή τον όγκο δεδομένων που επιτυγχάνει να μεταδόσει επιτυχώς ανα δευτερόλεπτο αρκεί ο πολλαπλασιασμός του tps με το μέγεθος του πακέτου δεδομένων. Αυτό συμβαίνει διότι σε κάθε απόκτηση του token έχουμε δικαίωμα να στείλουμε ένα πακέτο δεδομένων. Ένας κόμβος στέλνει συνέχεια στον κόμβο απόσταστης: Συνθήκες Baud: 57600 N:4 Όλοι στέλνουν συνέχεια σε έναν 1 2 3-36.0 kbps 10.625 kbps 8.5 kbps 3.625 kbps Πίνακας 2.8: Throughput δικτύου για διάφορες συνθήκες (kilobits/sec) -39-

-40-

3. Υλοποίηση δικτύου TKN Στο προηγούμενο κεφάλαιο αναλύθηκε η σχεδίαση του πρωτοκόλλου σύνδεσης δεδομένων TKN. Στην σχεδίαση δεν λήφθηκε υπόψιν καμία λεπτομέρεια για συγκεκριμένη αρχιτεκτονική. Το γεγονός αυτό επιτρέπει στο πρωτόκολλο να μπορεί να υλοποιηθεί σε πληθώρα αρχιτεκτονικών και οικογένειες συσκευών. Στα πλαίσια αυτής της εργασίας υλοποιήθηκε το πρωτόκολλο, δηλαδή γράφτηκε driver για μικροελεγκτές AVR 8bit και για PC. Σε αυτό το κεφάλαιο θα αναλυθεί η σχεδίαση και η υλοποίηση των δύο driver. 3.1 Περιβάλλον ανάπτυξης Για την ανάπτυξη του λογισμικού για AVR χρησιμοποιήθηκε το AVR Studio και το αναπτυξιακό κιτ STK 600. Ο κώδικας γράφτηκε σε assembly χρησιμοποιώντας το AVR Studio. Στα πρώτα στάδια της ανάπτυξης, για να μπορεί να δοκιμαστεί το δίκτυο, η UART του μικροελεγκτή συνδέθηκε με την σειριακή θύρα ενός προσωπικού υπολογιστή, στον οποίο γινόταν, παράλληλα, επίσης η υλοποίηση του πρωτοκόλλου. Ο λόγος που έγινε αυτό, είναι ότι στον υπολογιστή μπορούμε πιο εύκολα να εντοπίσουμε τα διάφορα σφάλματα, λόγω της ύπαρξης οθόνης και δυνατοτήτων αποσφαλμάτωσης, λειτουργίες που στερείται ένας μικροελεγκτής. Όταν η υλοποίηση του πρωτοκόλλου ήταν σε ικανοποιητικό επίπεδο, κατασκευάστηκε κύκλωμα με δύο ίδιους μικροελεγκτές συνδεδεμένους σε ένα δίκτυο μαζί με το PC. Έτσι είχαμε ένα δίκτυο με τρεις κόμβους. Οι μικροελεγκτές προγραμματίζονταν με την μέθοδο ISP μέσω καλωδίου που συνδεόταν στην έξοδο ISP του STK 600. 3.1.α STK 600 Πρόκειται για ένα αναπτυξιακό κιτ της εταιρείας Atmel που είναι συμβατό με μια μεγάλη γκάμα μικροελεγκτών της εταιρείας. Παρέχει μια πληθώρα λειτουργιών με στόχο την επιτάχυνση και την διευκόλυνση της ανάπτυξης εφαρμογών σε μικροελεγκτές. Παρατίθενται οι δυνατότητες του STK 600: Συμβατό με το AVR Studio. Συμβατό με πολλούς μικροελεγκτές. Σύνδεση USB, Τροφοδοτείται από USB ή από τροφοδοτικό 10-15V DC. Δυνατότητα ρύθμισης του επιπέδου τάσης της προγραμματιζόμενης συσκευής στο εύρος 0-5.5V. Ακροδέκτες (headers) εύκολης σύνδεσης με τα PORT των μικροελεγκτών. Ακροδέκτης σύνδεσης RS232. Επιπλέον ακροδέκτες σύνδεσης. 2Mbit Dataflash για μόνιμη αποθήκευση. 2 έξοδοι DC τάσεων αναφοράς. Ρυθμιζόμενος ταλαντωτής. Προγραμματισμός μέσω ISP, PDS, JTAG, awire, 8 διακόπτες, 8 LED.. Εικόνα 3.1: Αναπτυξιακό κιτ STK-600-41-

3.1.β AVR Studio Αναπτυξιακό περιβάλλον της εταιρείας Atmel που περιλαμβάνει επεξεργαστή κειμένου, συμβολομεταφραστή (assembler), μεταφραστή C (compiler) και έχει ενσωματωμένη υποστήριξη για τις συνήθεις μεθόδους προγραμματισμού όπως ISP. 3.1.γ Κύκλωμα breadboard Για την ανάπτυξη του driver του δικτύου ήταν απαραίτητο ο προγραμματισμός να γίνει πάνω σε πραγματικό δίκτυο. Στα πολύ αρχικά στάδια της ανάπτυξης των βασικών λειτουργιών παραλαβής / αποστολής, το δίκτυο αποτελείτο από ένα κόμβο AVR και το PC.Η ανάπτυξη του driver γινόταν ταυτόχρονα και στα δύο. O AVR βρισκόταν στην ενσωματωμένη βάση του STK-600 και επικοινωνούσε με το PC μέσω του κονέκτορα DB9 του STK-600. Ωστόσο, αυτή η συνδεσμολογία δεν αναπαριστούσε ρεαλιστικές συνθήκες, συνεπώς έπρεπε να συνδεθούν περισσότεροι μικροελεγκτές στο δίκτυο. Για να γίνει αυτό δημιουργήθηκε το κύκλωμα του δικτύου σε breadboard, αρχικά με δύο κόμβους και στην συνέχεια με τρεις. Πάντα στο δίκτυο βρισκόταν παρών και το PC. Η σύνδεση είναι τέτοια που να υλοποιεί τον δακτύλιο του δικτύου όπως περιγράφηκε στην παράγραφο Τοπολογία. Πλέον όμως υπήρχε το πρόβλημα του προγραμματισμού των μικροελεγκτών. Η λύση ήρθε απο το STK-600 το οποίο δίνει πρόσβαση στα σήματα της μονάδας SPI προγραμματισμού, τα οποία με κατάλληλο καλώδιο οδηγήθηκαν στην breadboard. Φυσικά κάθε μικροελεγκτής έπρεπε να προγραμματίζεται ξεχωριστά. Εικόνα 3.2: Κύκλωμα 2 κόμβων AVR σε breadboard Εικόνα 3.3: Κύκλωμα 3 κόμβων AVR σε breadboard Εικόνα 3.4: Έξοδος SPI Programming του STK-600 3.1.δ Καλώδιο FTDI Στην breadboard δεν υπήρχε προφανώς κονέκτορας DB-9. Για να γίνει η σύνδεση του -42-

δικυου των μικροελεγκτών με το PC αυτή την φορά χρησιμοποιήθηκε το καλώδιοusbto-serial της εταιρείας FTDI. Το καλώδιο συνδέεται στον υπολογιστή μέσω της θύρας USB και με τον κατάλληλο driver φαίνεται σαν σειριακή θύρα (εικονική σειριακή θύρα). Στην άλλη μεριά του καλωδίου βρίσκουμε 6 ακροδέκτες σε κονέκτορα κατάλληλο για σύνδεση σε breadboard ή σε PCB μέσω 6 pin header. Στο παρακάτω σχήμα φαίνονται τα σήματα που βγάζει το καλώδιο. Εικόνα 3.5: Καλώδιο usb to serial FTDI Εικόνα 3.6: Αντιστοιχίες Ακροδεκτών Καλωδίου FTDI Ένα σημαντικό χαρακτηριστικό της συγκεκριμένης επιλογής είναι ότι μπορούμε να αντλήσουμε ισχύ για να τροφοδοτήσουμε τους μικροελεγκτές του κυκλώματος από την θύρα USB του υπολογιστή μέσω του ακροδέκτη USB. Ωστόστο το manual του καλωδίου αναφέρει ότι το μέγιστο ρεύμα που παρέχεται από τον ακροδέκτη Vcc δεν πρέπει να υπερβαίνει τα 75mΑ. Αυτό το ρεύμα αρκεί για την λειτουργία του δικτύου αλλά δεν είναι αρκετό για να τροφοδοτήσει τα περιφερειακά των μικροελεγκτών σε περίπτωση που θελήσουμε να συνδέσουμε στοιχεία όπως LED, κινητήρες κτλ. 3.2 Driver για AVR Ο μικροελεγκτής που χρησιμοποιήθηκε για την ανάπτυξη του προγράμματος είναι της σειράς ATmega και συγκεκριμένα ο ATmega644PA. Ωστόσο η υλοποίηση είναι συμβατή με οποιονδήποτε 8bit μικροελεγκτή AVR διαθέτει τουλάχιστον μία θύρα UART με υποστήριξη interrupts στην λήψη και αποστολή ενός byte και φυσικά διαθέτει αρκετή μνήμη FLASH για να χωρέσει το πρόγραμμα και SRAM για τα δεδομένα του χρόνου εκτέλεσης όπως πχ. οι ουρές μετάδοσης. Στον παρακάτω πίνακα φαίνονται οι απαιτήσεις μνήμης της υλοποίησης: FLASH: 1600 bytes SRAM: 318 bytes Πίνακας 3.1: Απαιτήσεις μνήμης υλοποίησης πρωτοκόλλου για AVR 3.2.α Αρχιτεκτονική driver Σκοπός είναι να γραφτεί μια βιβλιοθήκη που να υλοποιεί το πρωτόκολλο με τέτοιο τρόπο ώστε να μπορεί κάποιος να την συμπεριλάβει σε ένα πρόγραμμα, δίνοντάς του -43-

δυνατότητές επικοινωνίας χωρίς να επηρεάζει τα υπόλοιπα τμήματα του προγράμματος. Για τον λόγο αυτό η υλοποίηση πρέπει να είναι interrupt driven. Αυτό σημαίνει ότι όλη η επεξεργασία εκτελείται ασύγχρονα μέσα σε ρουτίνες εξυπηρέτησης διακοπών. Συγκεκριμένα χρησιμοποιούνται οι εξής διακοπές: URXC0_ISR (USART0 Rx Complete) Η διακοπή που σηματοδοτεί την λήψη ενός byte στην σειριακή θύρα. Εδώ εκτελείται το τμήμα του δέκτη του κόμβου. US0TKN_TX_ISR (USART0 Data Register Empty) Η διακοπή που σηματοδοτεί την δυνατότητα αποστολής ενός byte στην σειριακή θύρα είτε επειδή, μόλις απεστάλη το προηγούμενο byte είτε γιατί μόλις ενεργοποιήθηκε ο transmitter της UART και ο TX_REGISTER είναι άδειος. Εδώ εκτελείται το τμήμα του αποστολέα του κόμβου. Το πρόγραμμα χωρίζεται σε τρία λογικά τμήματα. Το τμήμα του δέκτη, το τμήμα του πομπού και το τμήμα που αναλαμβάνει την προγραμματιστική διεπαφή με τον χρήστη της βιβλιοθήκης. 3.2.β Δέκτης Ο δέκτης είναι υπεύθυνος για τις εξής λειτουργίες: Αναγνώριση αρχής, τέλους πακέτου. Αναγνώριση τύπου πακέτου. Λήψη πακέτου. Προώθηση ξένων πακέτων. Αποθήκευση εισερχόμενων πακέτων δεδομένων στην ουρά λήψης. Ειδοποίηση πομπού για λήψη token, ack. Ο δέκτης εκτελείται ασύγχρονα κάθε φορά που υπάρχει διαθέσιμο εισερχόμενο byte. Εφόσον ο δέκτης εκτελείται ασύγχρονα και τερματίζει μετά από κάθε byte, πρέπει να αποθηκεύει την κατάσταση του, ώστε μεταξύ των διάφορων κλήσεων να ξέρει ακριβώς σε ποιο byte του πακέτου βρίσκεται, τον τύπο του πακέτου το οποίο λαμβάνει και άλλες απαραίτητες πληροφορίες. Για τον σκοπό αυτό δεσμεύονται ορισμένοι καταχωρητές του μικροελεγκτή:.def.def.def.def.def TKN_RX_QUEUE_INDEX_IN TKN_RX_QUEUE_INDEX_OUT TKN_RX_PENDING TKN_RX_BYTE TKN_RX_STATUS = = = = = r7 r8 r9 r10 r11 Επεξήγηση: TKN_RX_QUEUE_INDEX_IN: Δείκτης εισόδου κυκλικού buffer ουράς λήψης. Δείχνει την πρώτη ελεύθερη θέση της ουράς. TKN_RX_QUEUE_INDEX_OUT: Δείκτες εξόδου κυκλικού buffer ουράς λήψης. Δείχνει το πιο παλιό δεδομένο που έχει ληφθεί. TKN_RX_PENDING: Αριθμός πακέτων που βρίσκονται αυτή την στιγμή στην ουρά. -44-

TKN_RX_BYTE: Αύξων αριθμός byte του πακέτου το οποίο λαμβάνεται αυτή την στιγμή. TKN_RX_STATUS: Κατάσταση δέκτη. Επεξηγείται παρακάτω. Ο Πίνακας 3.2 παρακάτω απεικονίζει την σημασία κάθε bit του byte κατάστασης δέκτη. Τα bit S1:S0 δείχνουν σε ποια κατάσταση βρίσκεται ο δέκτης κάθε δεδομένη χρονική στιγμή. TKN_RX_STATUS S7 S6 S5 S4 S3 S2 - - - - - - S1 S0 RX_MODE Πίνακας 3.2: Byte κατάστασης δέκτη RX_MODE S1 S0 idle 0 0 data 0 1 ack 1 0 token 1 1 Πίνακας 3.3: Επεξήγηση bit RX_MODE 3.2.γ Πομπός Ο πομπός είναι υπεύθυνος για την αποστολή των πακέτων. Όπως και ο δέκτης εκτελείται ασύγχρονα, έτσι στηρίζεται στην αποθήκευση της κατάστασης του σε καταχωρητές. Οι εξής καταχωρητές δεσμεύονται για τον πομπό:.def.def.def.def.def.def TKN_TX_QUEUE_INDEX_IN TKN_TX_QUEUE_INDEX_OUT TKN_TX_PENDING TKN_TX_BYTE TKN_TX_STATUS TKN_TX_PACKET_ID = = = = = = r1 r2 r3 r4 r5 r6 Επεξήγηση: TKN_TX_QUEUE_INDEX_IN Δείκτης εισόδου κυκλικου buffer ουράς μετάδοσης. Δείχνει την πρώτη ελεύθερη θέση της ουράς. TKN_TX_QUEUE_INDEX_OUT Δείκτης εξόδου κυκλικου buffer ουράς μετάδοσης. Δείχνει το πιο παλιό πακέτο της ουρας, δηλαδή αυτό που θα μεταδοθεί στην πρώτη ευκαρία. TKN_TX_PENDING Αριθμός πακέτων που εκρεμμεί η μετάδοσή τους. TKN_TX_BYTE Αύξων αριθμός byte του πακέτου το οποίο μεταδίδεται αυτή την στιγμή. TKN_TX_STATUS Κατάσταση δέκτη. Επεξηγείται παρακάτω. TKN_TX_PACKET_ID Αύξων αριθμός εξερχόμενου πακέτου δεδομένων, Αυξάνεται μετά απο κάθε επιτυχή μετάδοση. -45-

Ο Πίνακας 3.4 παρακάτω απεικονίζει την σημασία κάθε bit του byte κατάστασης πομπού. Τα bit S1:S0 δείχνουν σε ποια κατάσταση βρίσκεται ο πομπός κάθε δεδομένη χρονική στιγμή. TKN_TX_STATUS S7 S6 S5 S4 S3 S2 Token owner TX Active Waiting for ACK TX Forward - - S1 S0 TX_MODE Πίνακας 3.4: Byte κατάστασης πομπού TX_MODE S1 S0 idle 0 0 data 0 1 ack 1 0 token 1 1 Πίνακας 3.5: Επεξήγηση bit TX_MODE 3.2.δ Προγραμματιστική διεπαφή (API) Το τμήμα της προγραμματιστικής διεπαφής παρέχει τις ρουτίνες που δίνουν στον χρήστη της βιβλιοθήκης πρόσβαση στο δίκτυο. Υπάρχουν 2 ρουτίνες. Μία για λήψη πακέτου και μία αποστολή, η TKN_popPacket και η TKN_pushPacket αντίστοιχα. TKN_popPacket: Ελέγχει εάν υπάρχει τουλάχιστον ένα πακέτο στην ουρά λήψης. Αν υπάρχει, ατιγράφει τα δεδομένα του στην θέση SRAM που υποδεικνύει ο καταχωρητής Y και στον καταχωρητή temp0 τοποθετεί την διεύθυνση αποστολέα. Αν δεν υπάρχει κανένα πακέτο στην ουρά, επιστρέφει 0x0 στον καταχωρητή temp0. TKN_pushPacket Ελέγχει αν υπάρχει κενή θέση στην ουρά μετάδοσης. Αν υπάρχει, αντιγράφει στην πρώτη κενή θέση το πακέτο που υποδεικνύεται απο τον καταχωρητή Y και στην ουρά διευθύνσεων τοποθετεί στην αντίστοιχη θέση την διεύθυνση που βρίσκεται στον καταχωρητή temp0 τον οποίο και μηδενίζει. Αν δεν υπάρχει κενή θέση στην ουρά, ο temp0 μένει ως έχει και η ρουτίνα απλά επιστρέφει. 3.2.ε Χρήση βιβλιοθήκης δικτύου Παρακάτω περιγράφεται ο τρόπος με τον οποίο μπορεί να χρησιμοποιηθεί η βιβλιοθήκη που αναπτύχθηκε, σε μια εφαρμογή για μικροελεγκτές AVR. Για να επιτευχθεί επικοινωνία μέσω του δικτύου από ένα πρόγραμμα assembly, χρειάζεται να γίνουν τα εξής βήματα: 1. Include των αρχείων που υλοποιούν την βιβλιοθήκη TKN..include "TKN.asm" -46-

.include "Usart.asm" 2. Καθορισμός των διευθύνσεων εξυπηρέτησης των διακοπών που χρησιμοποιεί το δίκτυο οι ρουτίνες εξυπηρέτησης υλοποιούνται στον κώδικα της βιβλιοθήκης..org URXC0addr ; USART0, Rx Complete jmp URXC0_ISR ; USART0, Rx Complete.org UDRE0addr ; USART0 Data register Empty jmp US0TKN_TX_ISR ; USART0 Data register Empty 3. Κλήση της ρουτίνας αρχικοποίησης TKN_init call TKN_init 4. Ενεργοποίηση των διακοπών. Sei Σε αυτό το σημείο το δίκτυο έχει ενεργοποιηθεί και ξεκινήσει την λειτουργία του. Για να λάβουμε δεδομένα από το δίκτυο χρησιμοποιούμε την ρουτίνα TKN_popPacket η οποία ελέγχει αν υπάρχει διαθέσιμο πακέτο δεδομένων στην ουρά λήψης και αν ναι το επιστρέφει. Για να στείλουμε δεδομένα, χρησιμοποιούμε την ρουτίνα TKN_pushPacket η οποία αντιγράφει ένα πακέτο δεδομένων στην ουρά μετάδοσης οπού τελικά αυτό αποστέλλεται στον προορισμό του. Για να χρησιμοποιηθεί το δίκτυο σε πρόγραμμα που γράφεται σε C αντί για assembly, με χρήση του avr-gcc για compiler μπορεί να χρησιμοποιηθούν οι παρακάτω wrapper συναρτήσεις. /* TKN Functions */ #define TKN_RESET_ADDR #define TKN_RETURN_ADDR #define TKN_POP_ADDR #define TKN_PUSH_ADDR 0x7000 0x7398 0x7098 0x7062 Συνάρτηση αποστολής ενός πακέτου δεδομένων: char TKN_Send(char *buf, char dest_id) { asm ("push r16"); asm ("push r17"); asm ("push r18"); asm ("push r28"); asm ("push r29"); asm ("mov r28, r24"); asm ("mov r29, r25"); asm ("mov r16, r22"); ((void(*)()) TKN_PUSH_ADDR)(); asm ("mov r24, r16"); } asm asm asm asm asm ("pop ("pop ("pop ("pop ("pop r29"); r28"); r18"); r17"); r16"); Συνάρτηση λήψης ενός πακέτου δεδομένων: char TKN_Receive(char *buf) { asm ("push r16"); -47-

asm asm asm asm ("push ("push ("push ("push r17"); r18"); r28"); r29"); asm ("mov r28, r24"); asm ("mov r29, r25"); ((void(*)()) TKN_POP_ADDR)(); asm ("mov r24, r16"); } asm asm asm asm asm ("pop ("pop ("pop ("pop ("pop r29"); r28"); r18"); r17"); r16"); Σημείωση: Ανάλογα την έκδοση του avr-gcc που χρησιμοποιείται και τον τρόπο που χρησιμοποιεί τους καταχωρητές για το πέρασμα παραμέτρων ενδεχομένως να χρειάζονται τροποποίησεις στις παραπάνω συναρτήσεις. 3.3 Driver για HY Το πρωτόκολλο TKN υλοποιήθηκε όπως ήδη έχουμε αναφέρει και για προσωπικό υπολογιστή. Η υλοποίηση είναι multi-platform και έχει δοκιμαστεί σε λειτουργικό σύστημα Windows (XP / 7 / 8) και σε linux (Ubuntu / Debian). Ο προγραμματισμός έγινε σε γλώσσα C. 3.3.α Αρχιτεκτονική Driver O driver του δικτύου έχει υλοποιηθεί σε ένα C module. Πρόκειται για ένα user-space module το οποίο δεν μπορεί να εκτελεστεί αυτόνομα, αλλά πρέπει να συμπεριληφθεί σε ένα άλλο πρόγραμμα στο οποίο προσθέτει την δυνατότητα επικοινωνίας με τους κόμβους του δικτύου. Επειδή το δίκτυο είναι τύπου token ring κάθε πακέτο για να φτάσει στον τελικό προορισμό του θα χρειαστεί να περάσει από ενδιάμεσους κόμβους, έτσι κάθε κόμβος λειτουργεί σαν αναμεταδότης πακέτων για τους υπόλοιπους. Αυτό σημαίνει ότι ακόμα και όταν δεν χρησιμοποιεί το δίκτυο για να αποστείλει ή να λάβει δεδομένα κάθε κόμβος πρέπει να παραμένει ενεργός ώστε να εκτελεί το έργο της αναμετάδοσης. Βέβαια, ακόμα και όταν η κίνηση είναι μηδενική και κανένας κόμβος δεν αποστέλλει δεδομένα, το πακέτο token δεν σταματάει να κυκλοφορεί στο δίκτυο. Για τους λόγους αυτούς ο driver εκτελείται συνεχώς και ανεξάρτητα από το υπόλοιπο πρόγραμμα, σε ξεχωριστό thread αφιερωμένο σε αυτόν. 3.3.β Driver Thread Παρακάτω φαίνεται το τμήμα κώδικα που βρίσκεται στον κεντρικό βρόχο του thread του driver:... while (TKN_Running) { TKN_PassToken(); if (TKN_Receive() == TKN_TYPE_TOKEN){ TKN_TokenCount++; if (!TKN_Queue_IsEmpty(&TX_QUEUE) ) { -48-

rid = TKN_Queue_Pop(&TX_QUEUE, &data); TKN_SendDataPacket ( &data, rid); } } }... Οι συναρτήσεις TKN_PassToken, TKN_Receive, TKN_SendDataPacket είναι χαμηλού επιπέδου συναρτήσεις που χρησιμοποιούνται αποκλειστικά απο τον driver και όχι από τον χρήστη και κάθε μία υλοποιεί ένα τμήμα του πρωτοκόλλου TKN. TKN_PassToken Στέλνει ένα πακέτο token στον επόμενο κόμβο. Αμέσως μετά από την αποστολή του token καλείται η TKN_Receive. TKN_Receive Υλοποιεί το μεγαλύτερο μέρος του πρωτοκόλλου του δικτύου. Λαμβάνει μεμονωμένα bytes από την σειριακή θύρα, επιβάλει την τήρηση του αλγορίθμου του δικτύου, συνθέτει τα πακέτα στην μνήμη, αναλαμβάνει τις αναμεταδόσεις πακέτων που προορίζονται για άλλους κόμβους καθώς και την αποστολή του πακέτου ack. Όταν λάβει πακέτο που προορίζεται για τον κόμβο της, το αποθηκεύει στην πρώτη ελεύθερη θέση της ουράς λήψης. Όλα τα παραπάνω συμβαίνουν μέσα σε ένα βρόχο ο όποιος σπάει είτε όταν ληφθεί πακέτο token είτε εάν εκπνεύσουν κάποιες διαδικασίες timeout στην λήψη bytes από την σειριακή θύρα είτε εάν ξεπεραστούν ορισμένα όρια ανοχής σε σφάλματα. ΤΚΝ_SendDataPacket Σε αυτό το σημείο έχουμε λάβει το token και έχουμε δικαίωμα να στείλουμε ένα πακέτο δεδομένων. Αυτό κάνει αυτή η συνάρτηση. Εάν η TKN_Receive επιστρέψει λόγω timeout και όχι επειδή έλαβε το πακέτο token, τότε ο driver παίρνει την πρωτοβουλία και δημιουργεί / εισάγει στο δίκτυο νέο token υποθέτοντας ότι λόγω σφάλματος χάθηκε το προηγούμενο. 3.3.γ Προγραμματιστική διεπαφή (API) Όπως αναφέραμε, ο driver τρέχει σε δικό του thread. Για να γίνει δυνατή η επικοινωνία με το υπόλοιπο πρόγραμμα παρέχονται οι εξής 2 συναρτήσεις. int TKN_PushData (TKN_Data * cpbuf, BYTE recipientid); int TKN_PopData (TKN_Data *); Η πρώτη αναλαμβάνει να τοποθετήσει στην ουρά αποστολής ένα πακέτο δεδομένων ενώ η δεύτερη ελέγχει την ουρά λήψης για εισερχόμενα πακέτα. Εάν η ουρά αποστολής είναι γεμάτη τότε η TKN_PushData επιστρέφει -1 και ενημερώνει ότι το πακέτο δεν τοποθετήθηκε στην ουρά, αλλιώς επιστρέφει 0, και τοποθετεί το πακέτο στην πρώτη ελεύθερη θέση της ουράς ώστε να αποσταλεί στην πρώτη διαθέσιμη ευκαιρία, δηλαδή όταν ληφθεί το token και έχουν σταλεί όλα τα πακέτα υψηλότερων θέσεων στην ουρά. Η TKN_PopData επιστρέφει -1 αν δεν υπάρχει κανένα πακέτο στην ουρά λήψης ενώ αν υπάρχει, επιστρέφει την διεύθυνση του αποστολέα και αντιγράφει το πακέτο σε τοπικό buffer. -49-

-50-

4. TKN Bootloader Στα πλαίσια αυτής της διπλωματικής αναπτύχθηκε ένας δικτυακός bootloader για 8bit AVR μικροελεγκτές. Ο ορισμός του bootloader δίνεται στο κεφάλαιο Bootloader. Ο bootloader χαρακτηρίζεται δικτυακός, γιατί η επικοινωνία του με τους μικροελεγκτές βασίζεται στο δίκτυο που αναπτύχθηκε στο πρώτο στάδιο της εργασίας αυτής. Παρακάτω θα εξετάσουμε τα χαρακτηριστικά που διαφοροποιούν τον προγραμματισμό με τον bootloader, σε σχέση με τις άλλες μεθόδους προγραμματισμού καθώς και τα πλεονεκτήματα που αυτός προσφέρει συγκριτικά με αυτές. 4.1 Περιπτώσεις προγραμματισμού Η/Υ Συσκευή προγραμματισμού Target MCU Σχήμα 4.1: Τυπική Διάταξη Προγραμματισμού Μικροελεγκτή Ο προγραμματισμός ενός μικροελεγκτή με τον συμβατικό τρόπο πραγματοποιείται με μία από τις μεθόδους προγραμματισμού που εξετάσαμε στο κεφάλαιο Μέθοδοι προγραμματισμού. Κάθε μέθοδος προγραμματισμού έχει μια συμβατή συσκευή προγραμματισμού, που συνδέεται με έναν ηλεκτρονικό υπολογιστή από τον οποίο κατεβάζει το πρόγραμμα που πρέπει να γραφτεί στον μικροελεγκτή. Η διεπαφή σύνδεσης της συσκευής προγραμματισμού με τον Η/Υ μπορεί να είναι οποιαδήποτε διαθέσιμη διεπαφή επικοινωνίας, όπως USB, σειριακή θήρα, παράλληλη θύρα κ.α. Στον Η/Υ που θα χρησιμοποιηθεί για τον προγραμματισμό πρέπει να εκτελεσθεί κατάλληλη εφαρμογή που παρέχεται από τον κατασκευαστή της συσκευής προγραμματισμού, η οποία χρησιμοποιείται από εμάς για την πραγματοποίηση του προγραμματισμού. Η πιο απλή περίπτωση ανάπτυξης λογισμικού για μικροελεγκτές, περιλαμβάνει έναν μόνο μικροελεγκτή, ο οποίος προγραμματίζεται όπως περιγράφεται στην προηγούμενη παράγραφο. Σε αυτήν την απλή περίπτωση ο bootloader που σχεδιάσαμε λειτουργεί όπως οι υπόλοιπες μέθοδοι και δεν παρέχει κάποια επιπλέον δυνατότητα που θα διευκόλυνε το έργο του προγραμματισμού και θα επιτάχυνε την διαδικασία ανάπτυξης μιας εφαρμογής. 4.1.α Πρόβλημα Τα πράγματα είναι διαφορετικά στην περίπτωση που η εφαρμογή μας περιέχει περισσότερους από έναν μικροελεγκτές και συνεπώς απαιτείται ο προγραμματισμός όλων, ή μέρους αυτών σε κάθε βήμα της σχεδίασης του λογισμικού της εφαρμογής. Το σενάριο αυτό δεν είναι καθόλου σπάνιο. Η συνήθης χρήση ενός μικροελεγκτή είναι το να αποτελεί μέρος ενός ευρύτερου συστήματος, να εκτελεί μια συγκεκριμένη εργασία και να ενημερώνει έναν κεντρικό ελεγκτή για τα αποτελέσματα της εργασίας αυτής. Η εργασία μπορεί να είναι για παράδειγμα η συλλογή μετρήσεων, ή η ενεργοποίηση ενός ρελέ. Σε -51-

κάθε περίπτωση, σπάνια συναντάμε έναν μικροελεγκτή να δουλεύει αυτόνομα σε ένα σύστημα. Στο παραπάνω σενάριο οι συμβατικές μέθοδοι προγραμματισμού αντιμετωπίζουν το εξής πρόβλημα. Όπως ήδη αναφέραμε, κάθε μέθοδος στηρίζεται στην αντίστοιχη διεπαφή για την επικοινωνία με τον μικροελεγκτή. Έτσι, είμαστε υποχρεωμένοι να συνδέουμε την συσκευή προγραμματισμού σε κάθε μικροελεγκτή ξεχωριστά και να εκτελούμε ολόκληρη την διαδικασία τόσες φορές, όσο το πλήθος των μικροελεγκτών που συμμετέχουν στην εφαρμογή μας. Όσο το πλήθος αυτό αυξάνεται, η διαδικασία αυτή, γίνεται χρονοβόρα και δυσχεραίνει σε μεγάλο βαθμό το έργο μας. Αυτό θα μπορούσε να λυθεί με την χρήση πολλών συσκευών προγραμματισμού, αλλά κάτι τέτοιο συνεπάγεται στο υψηλό κόστος απόκτησης των τελευταίων αφού συνήθως δεν πρόκειται για συσκευές χαμηλού κόστους. 4.1.β Λύση Ο δικτυακός bootloader, όπως αναφέραμε στηρίζεται στην υπάρχουσα υποδομή του δικτύου για την επικοινωνία. Έτσι μας απαλλάσσει από την ανάγκη σύνδεσης οποιουδήποτε εξωτερικού κυκλώματος προγραμματισμού. Αυτό σημαίνει ότι μπορούμε να προγραμματίσουμε ανά πάσα στιγμή οποιονδήποτε από τους παρόντες μικροελεγκτές της εφαρμογής μας χωρίς να χρειάζεται να κάνουμε καμία τροποποίηση στην συνδεσμολογία. Αυτό φαίνεται στο παρακάτω σχήμα. TKN Boot TKN Boot TKN Boot TKN Boot TKN Boot (client) (server) (server) (server) (server) TKN TKN TKN TKN TKN UART UART UART UART UART Σχήμα 4.2: Αρχιτεκτονική bootloader -52-

4.2 Χρήσιμα χαρακτηριστικά AVR Για να γίνει δυνατή η υλοποίηση του bootloader αξιοποιήθηκαν ορισμένες ιδιότητες που παρέχουν οι μικροελεγκτές AVR, ειδικά για να διευκολύνουν την δημιουργία bootloader. 4.2.α Boot Section Κάποιοι μικροελεγκτές AVR δεσμεύουν ένα τμήμα της μνήμης προγράμματος (FLASH memory) για να φιλοξενήσει τον bootloader. Το τμήμα αυτό της μνήμης έχει ορισμένες ιδιότητες και χαρακτηριστικά που το διαφοροποιούν από την υπόλοιπη μνήμη καθιστώντας το κατάλληλο να φιλοξενήσει έναν bootloader. 4.2.β Boot Reset Όπως είδαμε στο κεφάλαιο Fuse bits υπάρχουν κάποια hardware bits στους μικροελεγκτές AVR παραμετροποιούν κρίσιμα χαρακτηριστικά της λειτουργίας του μικροελεγκτή. Ένα από αυτά είναι το BOOT_RST. Το συγκεκριμένο fuse bit καθορίζει το αν ο μικροελεγκτής θα εκτελεί την πρώτη εντολή από την αρχή της FLASH (διεύθυνση 0x0000) όταν εκκινεί ή από την αρχή του τμήματος boot section που περιγράφεται παραπάνω. Στην περίπτωση που επιλέξουμε εκτέλεση από το boot section στην εκκίνηση, ο bootloader αποκτά τον έλεγχο του μικροελεγκτή και είναι σε θέση στην συνέχεια μετά από κατάλληλες εντολές να εκτελέσει το πρόγραμμα εφαρμογής που συνήθως βρίσκεται στην αρχή της FLASH. 4.2.γ Θέση Interrupt Vector Εκ κατασκευής οι μικροελεγκτές AVR, όταν συμβαίνει μια διακοπή, που έχει ενεργοποιηθεί, μεταφέρουν την εκτέλεση του προγράμματος σε ένα προκαθορισμένο σημείο της μνήμης ανάλογα με την συγκεκριμένη διακοπή. Η περιοχή της μνήμης που είναι δεσμευμένη για την εξυπηρέτηση των διακοπών ονομάζεται διάνυσμα διακοπών και από προεπιλογή βρίσκεται στην αρχή της μνήμης προγράμματος (FLASH). Ωστόσο, το διάνυσμα διακοπών είναι δυνατόν να μετακινηθεί στο τμήμα boot section. Κάτι τέτοιο είναι ιδιαίτερα χρήσιμο για να γίνει δυνατή η interrupt driven σχεδίαση του bootloader χωρίς οι διακοπές να βρίσκονται στην προεπιλεγμένη θέση οπού έχει πρόσβαση ο χρήστης και συνεπώς θα υπήρχε ο κίνδυνος καταστροφής του διανύσματος διακοπών. 4.2.δ Boot Lock Bits (BLB) Για να προστατευτεί ο κώδικας του bootloader υπάρχουν τα boot lock bits τα οποία είναι παρόμοια με τα fuse bits και με κατάλληλη ρύθμιση της τιμής τους, εισάγουν περιορισμούς σχετικά με το ποιος κώδικας επιτρέπεται να εκτελεί την εντολή εγγραφής στην FLASH (SPM). Μπορεί δηλαδή να απαγορευτεί σε κώδικα που βρίσκεται στο τμήμα μνήμης χρήστη να εκτελεί την SPM, ενώ να επιτραπεί σε κώδικα που βρίσκεται στο τμήμα boot section. 4.3 Υλοποίηση bootloader 4.3.α Διεύθυνση reset Όπως εξηγήθηκε στην προηγούμενη παράγραφο και φαίνεται στο παρακάτω σχήμα, η -53-

μνήμη των μικροελεγκτών AVR είναι χωρισμένη σε δύο τμήματα. Το πρώτο τμήμα που ξεκινά στην διεύθυνση 0x0000 είναι το τμήμα προγράμματος εφαρμογής ενώ το δεύτερο είναι το τμήμα boot το οποίο καταλαμβάνει ένα μέρος στο τέλος της FLASH. Όταν δοθεί στον μικροελεγκτή τροφοδοσία ή όταν συμβεί reset είτε με τον ακροδέκτη RESET, είτε προγραμματιστικά ο μικροελεγκτής ξεκινάει την εκτέλεση από συγκεκριμένη, προκαθορισμένη θέση. Η θέση αυτή είναι είτε η πρώτη θέση της μνήμης εφαρμογής (0x0000) είτε η πρώτη θέση του τμήματος boot. Σχήμα 4.3: Διαχωρισμός Μνήμης Flash Για να μπορέσει να χρησιμοποιηθεί ο bootloader η διεύθυνση εκκίνησης πρέπει να οριστεί στο τμήμα boot πού φιλοξενεί τον bootloader. Αυτό ρυθμίζεται από το αντίστοιχο fuse bit του μικροελεγκτή. Έτσι, όταν εκκινεί ο μικροελεγκτής θα εκτελεί απευθείας τον bootloader. Αφού το πρόγραμμα εφαρμογής δεν είναι αυτό που εκτελείται κατά το reset, προκύπτει η ανάγκη να μπορούμε να μεταβούμε σε αυτό με κάποιον άλλο τρόπο. Υπάρχουν αρκετές λύσεις σε αυτό το πρόβλημα. Μία λύση είναι ο bootloader κατά την αρχικοποίηση του, να ελέγχει την τιμή ενός ακροδέκτη εισόδου και βάσει της τιμής του να αποφασίζει αν θα συνεχίσει την εκτέλεση ή αν θα μεταβεί στην πρόγραμμα εφαρμογής. Η λύση που χρησιμοποιήθηκε στην δική μας περίπτωση είναι να εκτελείται πάντα ο bootloader κατά την εκκίνηση, και ο χρήστης να έχει την δυνατότητα να μεταβεί στην εφαρμογή δίνοντας κάποια εντολή στον bootloader ο οποίος θα αναλαμβάνει να μεταφέρει τον έλεγχο στο πρόγραμμα εφαρμογής. Αυτό βέβαια έχει το μειονέκτημα, ότι δεν είναι δυνατόν να εκτελεστεί το πρόγραμμα εφαρμογής χωρίς την ύπαρξη ενός PC προγραμματισμού. Ωστόσο, για τον εκπαιδευτικό σκοπό της εργασίας αυτής, κάτι τέτοιο δεν αποτελεί πρόβλημα. 4.3.β Interrupt Vector Στο κεφάλαιο Υλοποίηση δικτύου TKN είδαμε ότι η υλοποίηση του δικτύου βασίζεται σε διακοπές. Άρα για να είναι σε θέση ο bootloader να χρησιμοποιήσει την βιβλιοθήκη που υλοποιεί το δίκτυο, πρέπει να έχει πρόσβαση στις απαραίτητες διακοπές. Σε αντιστοιχία με το reset, οι διακοπές έχουν προκαθορισμένες θέσεις στις οποίες οδηγείται -54-

αυτόματα ο έλεγχος του προγράμματος όταν συμβεί διακοπή. Αυτές οι θέσεις, από προεπιλογή βρίσκονται στην αρχή της μνήμης FLASH, αμέσως μετά το reset. Η περιοχή μνήμης που είναι δεσμευμένη για την εξυπηρέτηση των διακοπών, ονομάζεται διάνυσμα διακοπών (interrupt vector). Το διάνυσμα διακοπών είναι δυνατό να μετακινηθεί από την προεπιλεγμένη θέση του (αρχή της FLASH), στο τμήμα boot. Αν δεν είχαμε αυτή την δυνατότητα, ο bootloader δεν θα ήταν ασφαλής από τυχόν σφάλματα που ενδέχεται να προκαλέσει το πρόγραμμα εφαρμογής και αυτό θα είχε άμεση συνέπεια στην συνολική αξιοπιστία και χρησιμότητά του. Παράλληλα, είναι επιθυμηο το πρόγραμμα χρήστη να έχει πρόσβαση στα interrupts που δεν χρησιμοποιούνται απο τον bootloader. Για τον λόγο αυτό όλα τα interrupts προοθούνται με εντολές jump στις διευθύνσεις που αρχικά βρίσκονταν, αυτές που ξεκινούν δηλαδή από την αρχή της RAM. 4.3.γ Αρχιτεκτονική bootloader Όπως φαίνεται στο Σχήμα 4.2 η αρχιτεκτονική που έχει ακολουθηθεί στην σχεδίαση είναι server-client. Διακρίνουμε δύο μέρη στην συνολική διαδικασία προγραμματισμού, τον μικροελεγκτή που αποτελεί τον στόχο προς προγραμματισμό και την εφαρμογή προγραμματισμού που τρέχει σε PC και είναι υπεύθυνη να στείλει στον μικροελεγκτή το πρόγραμμα. Για να ξεκινήσει η διαδικασία προγραμματισμού, προϋπόθεση είναι να βρίσκονται και τα δύο μέρη συνδεδεμένα στο δίκτυο και στον μικροελεγκτή να εκτελείται το πρόγραμμα του bootloader. Όταν το πρόγραμμα του bootloader εκτελείται στον μικροελεγκτή, αυτός ακούει συνεχώς το δίκτυο και περιμένει να λάβει εντολές. Αυτός είναι ο λόγος που η αρχιτεκτονική χαρακτηρίζεται server-client. Σε αυτό το σημείο η εφαρμογή που τρέχει στο PC μπορεί να στείλει στον μικροελεγκτή κάποια από τις συμβατές εντολές. 4.3.δ Εντολές bootloader Οι εντολές του bootloader είναι απλές συμβολοσειρές ASCII με μέγεθος που δεν ξεπερνά το μέγιστο μέγεθος πακέτου του δικτύου. Παρακάτω φαίνονται οι υπάρχουσες εντολές: Εντολή Λειτουργία V: Αποστολή μέσω του δικτύου της έκδοσης του bootloader που εκτελείται. Πρόκειται για μια ASCII συμβολοσειρά που χωράει σε ένα πακέτο του δικτύου. S: Αποστολή των τριών byte υπογραφής του μικροελεγκτή. Η υπογραφή διαφέρουν σε κάθε μοντέλο AVR. πχ 0x1E0x960x0A (12 bytes) B: Εκκίνηση διαδικασίας προγραμματισμού της μνήμης εφαρμογής. R: Εκτέλεση προγράμματος εφαρμογής. Εκτελεί μια κλήση υπορουτίνας (εντολή call) στην διεύθυνση 0x0000. Πίνακας 4.1: Eντολές bootlader Στο μέλλον μπορούν να προστεθούν επιπλέον εντολές που θα δίνουν πρόσθετες δυνατότητες στον bootloader. 4.3.ε Κατανομή Καταχωρητών Στο σχήμα φαίνεται ο τρόπος με τον οποίο έχουν χρησιμοποιηθεί οι καταχωρητές στα πλαίσια του bootloader. Μερικοί καταχωρητές έχουν δεσμευθεί από τον driver του δικτύου για ταχύτερη εξυπηρέτηση των interrupts και γι'αυτόν τον λόγο δεν πρέπει να πειραχτούν από τον χρήστη σε καμία περίπτωση, γιατί μπορεί ανά πάσα στιγμή να συμ-55-

βεί κάποιο interrupt και να χάσουν την τιμή τους. Όλοι οι υπόλοιποι καταχωρητές σώζονται στην RAM στο τέλος κάθε εξυπηρέτησης διακοπής και αντίστοιχα ανακτώνται από αυτή στην αρχή της εξυπηρέτησης. Με πράσινο φαίνονται οι καταχωρητές που μπορεί να χρησιμοποιήσει ελεύθερα το πρόγραμμα χρήστη ενώ με κόκκινο αυτοί που δεν πρέπει να πειραχτούν. TKN r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 TKN_Boot USER TKN variables (They are all stored/restored in RAM) itemp0 itemp0 itemp0 rsreg temp0 temp1 temp2 pagecount wordcount var0 var1 var2 var3 var4 X Y Z Σχήμα 4.4: Κατανομή Καταχωρητών 4.3.στ Διαδικασία προγραμματισμού Η μνήμη FLASH των μικροελεγκτών AVR είναι χωρισμένη σε σελίδες που το μέγεθός τους εξαρτάται από το μοντέλο του μικροελεγκτή. Όταν ο bootloader λάβει την εντολή προγραμματισμού (B:) μπαίνει σε ένα βρόχο λήψης δεδομένων από το δίκτυο. Σε αυτόν τον βρόχο ο μικροελεγκτής περιμένει να λάβει ακριβώς μία σελίδα μνήμης. Τυπικά μεγέθη της σελίδας μνήμης είναι 128 ή 256 bytes. Όταν ληφθεί μία ολοκληρωμένη σελίδα, ο μικροελεγκτής αναλαμβάνει να την γράψει στην μνήμη FLASH. Όταν ολοκληρωθεί η εγγραφή, αποστέλλεται στην εφαρμογή προγραμματισμού μια συμβολοσειρά που σηματοδοτεί ότι ο μικροελεγκτής είναι και πάλι -56-

σε θέση να λάβει εντολές. Στην περίπτωση που το πρόγραμμα που θέλουμε να γράψουμε στην μνήμη καταλαμβάνει περισσότερες από μία σελίδες, επαναλαμβάνουμε την παραπάνω διαδικασία όσες φορές χρειάζεται. Η τελευταία σελίδα κάθε προγράμματος είναι πολύ πιθανό, να μην είναι ολοκληρωμένη. Στην περίπτωση αυτή, πρέπει η εφαρμογή προγραμματισμού να φροντίσει να γεμίσει τον χώρο που περισσεύουν μέχρι το τέλος της σελίδας, αφού ο μικροελεγκτής περιμένει να λάβει ολοκληρωμένες σελίδες. Αυτό το κενό συνήθως γεμίζεται με το byte 0xFF. 4.3.ζ Εκτέλεση προγράμματος χρήστη Στον Πίνακας 4.1 υπάρχει η εντολή R:. Η λειτουργία αυτής της εντολής είναι να μεταφέρει την εκτέλεση στο πρόγραμμα εφαρμογής. Αυτό το πετυχαίνει κάνοντας μια κλήση στην διεύθυνση 0x0000. Αν το πρόγραμμα εφαρμογής τερματίσει κανονικά με μια εντολή επιστροφής από υπορουτίνα (εντολή ret) και με την προϋπόθεση ότι δεν άλλαξε τον stack pointer (καταχωρητές SPH:SPL), τότε θα συνεχιστεί η εκτέλεση του bootloader, στέλνοντας ένα ενημερωτικό μήνυμα στην εφαρμογή προγραμματισμού. 4.4 Εφαρμογή προγραμματισμού Όπως είδαμε στις προηγούμενες παραγράφους, η διαδικασία προγραμματισμού εκκινείται από μια εφαρμογή που παίζει τον ρόλο πελάτη (client) και είναι υπεύθυνη να στείλει στον μικροελεγκτή τις κατάλληλες εντολές που θα πυροδοτήσουν τον προγραμματισμό, καθώς και να στείλει το αρχείο hexμε το πρόγραμμα.. Στα πλαίσια της διπλωματικής υλοποιήθηκε μια τέτοια εφαρμογή. 4.4.α Συμβατότητα / Απαιτήσεις Η ανάπτυξη της εφαρμογής προγραμματισμού έγινε σε γλώσσα C++ κάνοντας χρήση του περιβάλλοντος Qt. Η επικοινωνία με τους μικροελεγκτές βασίστηκε στο δίκτυο TKN και στην υλοποίηση για PC που έχει γίνει στο πρώτο στάδιο της διπλωματικής. Η υλοποίηση του δικτύου είχε γίνει σε C και ήταν εύκολο να συνδεθεί με την εφαρμογή που γράφτηκε σε C++. Η εφαρμογή είναι συμβατή με λειτουργικά συστήματα Windows, Linux και απαιτεί την ύπαρξη σειριακής θύρας για την σύνδεση με το δίκτυο των μικροελεγκτών. -57-

4.4.β Δυνατότητες Όπως αναφέρθηκε, για κάθε κόμβο που εντοπίζεται στο δίκτυο, παρουσιάζεται ένα παράθυρο το οποίο δίνει στον χρήστη ορισμένες δυνατότητες επικοινωνίας και διεπαφής με τους κόμβους. Οι δυνατότητες για κάθε κόμβο ξεχωριστά είναι οι εξής: Προγραμματισμός μνήμης χρήστη με αρχείο hex. Εκκίνηση της εφαρμογής χρήστη. Αποστολή αυθαίρετου πακέτου δεδομένων στον κόμβο. Ο χρήστης μπορεί να στείλει ένα κείμενο σε μορφή ascii, ίσο με το μέγεθος του πακέτου του δικτύου. Εάν το κείμενο αναπαριστά αριθμητική τιμή, σε δεκάδικο ή δεκαεξαδικό σύστημα, τότε μετατρέπεται αυτόματα σε binary μορφή (little endiann) και αποστέλλεται έτσι. Καταγραφή όλων των εισερχόμενων δεδομένων που προέρχονται από τον συγκεκριμένο κόμβο. (Δυνατότητα απενεργοποίησης) Απεικόνιση της αναλογικής τιμής από τον A/D μετατροπέα που μπορεί να στείλει ο κόμβος σε αναλογικό γραφικό όργανο. Αποστολή byte με αριθμητική τιμή ελεγχόμενη από γραφική κυλιόμενη μπάρα. 4.4.γ Λειτουργία Η εφαρμογή εντοπίζει τις διαθέσιμες σειριακές θύρες στο μηχάνημα που τρέχει και δίνει στον χρήστη την δυνατότητα να συνδεθεί σε δίκτυο TKN που βρίσκεται σε κάποια από αυτές. Όταν ο χρήστης επιλέξει την έναρξη σύνδεσης, η εφαρμογή κάνει απόπειρα έναρξης δικτύου TKN. Εάν η επιλεγμένη θύρα είναι όντως συνδεδεμένη με ένα σύνολο κόμβων που λειτουργούν και έχουν εγκατεστημένο τον driver του δικτύου, τότε η εφαρ-58-

μογή θα ανιχνεύσει αυτόματα τους παρόντες μικροελεγκτές-κόμβους και για κάθε έναν ξεχωριστά θα παρουσιάσει ένα παράθυρο με επιλογές καθώς και ένα τερματικό στο οποίο καταγράφονται όλα τα δεδομένα που ο συγκεκριμένος μικροελεγκτής αποστέλλει. 4.4.δ Χρήση της εφαρμογής ως κονσόλα αποσφαλμάτωσης Στην παράγραφο Interrupt Vector αναφέραμε ότι το διάνυσμα διακοπών μεταφέρεται στο τμήμα boot του μικροελεγκτή. Το γεγονός αυτό έχει ένα επιπλέον πλεονέκτημα. Δίνει στο δίκτυο την ικανότητα να εκτελείται στο παρασκήνιο ακόμα και όταν ο χρήστης μεταβεί μέσω του bootloader στο πρόγραμμα εφαρμογής με τον τρόπο που εξηγήσαμε στην παράγραφο Εκτέλεση προγράμματος χρήστη. Συνεπώς, το πρόγραμμα εφαρμογής μπορεί να χρησιμοποιήσει το δίκτυο χωρίς να κάνει καμία αρχικοποίηση και χωρίς να συμπεριλάβει καν την βιβλιοθήκη του δικτύου στην σχεδίαση του. Το μόνο που χρειάζεται είναι η γνώση των διευθύνσεων των ρουτινών αποστολής και λήψης πακέτων και η κλήση τους από το πρόγραμμα εφαρμογής. Τα παραπάνω, σε συνδυασμό με την κονσόλα καταγραφής δεδομένων που παρέχει η εφαρμογή προγραμματισμού, δίνουν στον χρήστη ένα σημαντικό βοήθημα στην διαδικασία προγραμματισμού του μικροελεγκτή που είναι από την φύση της πολύ πιο δύσκολη συγκρινόμενη με τον προγραμματισμό destop λόγω της μη ύπαρξης οθόνης και πληκτρολογίου ώστε ο χρήστης να πάρει output και να δώσει input αντίστοιχα στο πρόγραμμα που εκτελείται. Και αυτό ακριβώς το πρόγραμμα λύνει η εφαρμογή αυτή. -59-

-60-

5. TKN PCB Αφού ολοκληρώθηκε η υλοποίηση του τμήματος του συστήματος του σχετικού με το δίκτυο και αναπτύχθηκε το απαραίτητο λογισμικό, ήρθε η ώρα να επιδειχθούν οι δυνατότητες του δικτύου και του Bootloader σε πραγματικό περιβάλλον ενσωματωμένου συστήματος. Για τον σκοπό αυτό προχωρήσαμε στην κατασκευή τριών ενδεικτικών μικροϋπολογιστικών συστημάτων βασισμένων στον μικροελεγκτή AVR ATmega644PA πάνω σε τυπωμένο κύκλωμα (PCB). Κάθε πλακέτα αναπαριστά έναν κόμβο από ένα δίκτυο διασυνδεδεμένων μικροελεγκτών. Η σχεδίαση της πλακέτας έγινε με χρήση του προγράμματος KiCad. Εικόνα 5.1: 3D Απεικόνιση PCB (Πριν την κατασκευή) Εικόνα 5.2: PCB Μετά την κατασκευή 5.1 Στοιχεία πλακέτας Στην πλακέτα επελέγησαν να τοποθετηθούν στοιχεία απαραίτητα για την διεξαγωγή εργαστηριακών ασκήσεων καθώς και στοιχεία που διευκολύνουν την ανάπτυξη προγραμμάτων. Φυσικά, τοποθετήθηκαν ακροδέκτες για την διασύνδεση των κόμβων σύμφωνα με την απαιτούμενη συνδεσμολογία του δικτύου TKN. Τα στοιχεία που βρίσκουμε στην πλακέτα είναι τα εξής: 1 trimmer 10KΩ. 1 Πιεστικός Διακόπτης (push button) για reset. 1 Πιεστικός Διακόπτης (push button) γενικού σκοπού. 8 λυχνίες LED (με τις απαραίτητες αντιστάσεις περιορισμού ρεύματος.) 1 DIP Switch 4 θέσεων. Κονέκτορας που δίνει πρόσβαση στο PORT C. Κονέκτορας που δίνει πρόσβαση στο PORT D. Κονέκτορας σύνδεσης στο δίκτυο με τον προηγούμενο κόμβο. Κονέκτορας σύνδεσης στο δίκτυο με τον επόμενο κόμβο. 5.1.α Κονέκτορες Δικτύου Όπως έχει αναλυθεί στα προηγούμενα κεφάλαια, το δίκτυο χρησιμοποιεί τοπολογία δακτυλίου. Οι κόμβοι δηλαδή συνδέονται διαδοχικά, κάθε ένας με τον επόμενό του, μέχρι -61-

ο πομπός του τελευταίου να συνδεθεί στον δέκτη του πρώτου και κατά αυτόν τον τρόπο να κλείσει ο δακτύλιος. Έτσι κατά την σχεδίαση των πλακετών, και συγκεκριμένα στο στάδιο της επιλογής των σημάτων που θα συνδεθούν σε κάθε ακροδέκτη του κονέκτορα, έπρεπε να δοθεί προσοχή στο να ικανοποιείται ο περιορισμός του σχηματισμού δακτυλίου. Προκειμένου να αποφευχθεί ο γεωμετρικός περιορισμός του να σχηματίσουμε έναν αληθινό δακτύλιο με τους κόμβους, ώστε να συνδεθεί ο πρώτος με τον τελευταίο, έπρεπε να βρεθεί ένας τρόπος να έχουμε επιστροφή του σήματος Tx του τελευταίου στον πρώτο. Επίσης πρέπει να ληφθεί υπόψιν ο κόμβος-υπολογιστής, που επικοινωνεί μέσω του καλωδίου FTDI έτσι ώστε ο κονέκτορας που θα σχεδιαστεί να είναι συμβατός με το βύσμα του καλωδίου. Στην πραγματικότητα, η διάταξη των ακροδεκτών του καλωδίου είναι αυτή που θα καθορίσει την σχεδίαση του κονέκτορα. Στο Σχήμα 2.8 απεικονίζονται οι δύο κονέκτορες που έχει κάθε πλακέτα για την σύνδεση της στο δίκτυο. Ο αριστερός κονέκτορας χρησιμοποιείται για την σύνδεση με τον προηγούμενο κόμβο ενώ ο δεξιός για την σύνδεση με τον επόμενο. Ο τελευταίος κόμβος δεν έχει επόμενο, έτσι βραχυκυκλώνεται μέσω ενός jumper ο ακροδέκτης Tx (πομπός σειριακής θύρας) με τον ακροδέκτη επιστροφής. Κατά αυτόν τον τρόπο το σήμα Tx του τελευταίου κόμβου περνώντας από όλους τους προηγούμενους θα φτάσει στον πρώτο. Η διάταξη των ακροδεκτών είναι τέτοια που ο ακροδέκτης στον οποίο καταλήγει το σήμα επιστροφής είναι το Rx (δέκτης) του καλωδίου FTDI. Στην περίπτωση που δεν υπάρχει υπολογιστής στο δίκτυο τότε πρέπει με ένα jumper να βραχυκυκλωθεί ο ακροδέκτης επιστροφής του πρώτου κόμβου με τον ακροδέκτη Rx ώστε να λαμβάνει το σήμα από τον πο μπό του τελευταίου κόμβου. -62-