DS18B20 αισθητήρας θερμοκρασίας

ΠΕΡΙΓΡΑΦΗ

Το ψηφιακό θερμόμετρο DS18B20 παρέχει μετρήσεις θερμοκρασίας σε βαθμούς Κελσίου με ακρίβεια 9 εως 12-bit και παρέχει λειτουργία συναγερμού με προγραμματιζόμενα από το χρήστη πάνω και κάτω όρια που διατηρούνται και την μη τροφοδότηση με τάση του αισθητήρα. Το DS18B20 επικοινωνεί σειριακά μέσω ενός 1-Wire bus το οποίο απαιτεί μια γραμμή δεδομένων (και τη γείωση) για την επικοινωνία με τον μικροελεγκτή. Μπορεί να λειτουργήσει στην περιοχή θερμοκρασιών από -550C έως 1250C, αλλά παρέχει ακρίβεια ±0,50C για την περιοχή θερμοκρασιών -100C έως 850C. Το DS18B20 μπορεί να τροφοδοτηθεί από εξωτερική τάση ή μπορεί να λειτουργήσει σε κατάσταση “parasite mode” στην οποία το DS18B20 μπορεί και αντλεί ισχύ από την γραμμή δεδομένων. Σε αυτή την κατάσταση, παίρνει ισχύ διαμέσου μιας 1-Wire pull-up αντίστασης διαμέσου του ακροδέκτη DQ, όταν ο δίαυλος δεδομένων είναι σε high κατάσταση. Όταν ο δίαυλος δεδομένων είναι high, φορτίζει ένα εσωτερικό πυκνωτή (Cpp) που παρέχει ισχύ στον αισθητήρα όταν ο δίαυλος δεδομένων είναι σε low κατάσταση (για περισσότερες πληροφορίες ανατρέξτε στο DS18B20 datasheet). Κάθε ένα DS18B20 έχει ενσωματωμένο ένα 64-bit σειριακό κωδικό που επιτρέπει την σύνδεση πολλαπλών DS18B20 στο ίδιο 1-Wire δίαυλο δεδομένων και και διευκολύνει στην χρήση ενός μικροελεγκτή για τον έλεγχο πολλών DS18B20 κατανεμημένα σε μια μεγάλη περιοχή.

ΕΠΙΣΚΟΠΙΣΗ

Το DS18B20 έχει 64-bit ROM στην οποία είναι αποθηκευμένος ο μοναδικός σειριακός κωδικός. Περιέχει μια περιοχή SRAM μνήμη η οποία περιέχει τον 2-byte καταχωρητή θερμοκρασίας, που αποθηκεύει την ψηφιακή έξοδο του αισθητήρα θερμοκρασίας. Επιπρόσθετα αυτή η περιοχή μνήμης περιέχει τους 1-byte καταχωρητές του πάνω και κάτω ορίου λειτουργίας συναγερμού θερμοκρασίας (ΤΗ και ΤL) καθώς και τον 1-byte καταχωρητή διαμόρφωσης. Ο καταχωρητής διαμόρφωσης επιτρέπει στον χρήστη να ορίσει την ανάλυση του μετατροπέα θερμοκρασίας σε ψηφιακό σήμα σε 9, 10, 11 ή 12 bits. Οι καταχωρητές ΤΗ και ΤL και ο καταχωρητής διαμόρφωσης, αποθηκεύονται και σε μια μνήμη EEPROM με συγκεκριμένες εντολές έτσι ώστε τα δεδομένα να διατηρούνται με τη διακοπή της τροφοδοσίας.

Το DS18B20 χρησιμοποιεί το αποκλειστικό 1-Wire πρωτόκολλο διαύλου δεδομένων, που αναπτύχθηκε από την Dallas και υλοποιεί το δίαυλο δεδομένων χρησιμοποιώντας μια γραμμή δεδομένων. Ο έλεγχος της γραμμής δεδομένων απαιτεί μια pull-up αντίσταση αφού όλοι οι αισθητήρες συνδέονται με τον δίαυλο δεδομένων δια μέσου μιας 3-state ή open-drain port (ο ακροδέκτης DQ στην περίπτωση του αισθητήρα DS18B20). Σε αυτό το σύστημα διαύλου ο μικροελεγκτής (αφέντης) προσπελαύνει τους αισθητήρες του διαύλου χρησιμοποιώντας τον 64-bit κωδικό των αισθητήρων. Επειδή κάθε αισθητήρας έχει το δικό του μοναδικό κωδικό, ο αριθμός των αισθητήρων που μπορούν να προσπελαυτούν είναι απεριόριστος.

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

Η βασική λειτουργία του DS18B20 είναι η κατευθείαν ψηφιακή μέτρηση της θερμοκρασίας του αισθητήρα. Η ανάλυση του θερμοκρασιακού αισθητήρα, ορίζεται από το χρήστη και μπορεί να είναι στα 9, 10, 11 ή 12 bits που αντιστοιχούν στα βήματα θερμοκρασίας 0,50C, 0,250C, 0,1250C και 0,06250C αντίστοιχα. Η προκαθορισμένη ανάλυση με την εφαρμογή της τροφοδοσίας είναι 12-bit. To DS18Β20 με την εφαρμογή της τροφοδοσίας, μπαίνει σε χαμηλή κατανάλωση και σε αδρανή κατάσταση. Για να προκαλέσουμε μια μέτρηση θερμοκρασίας και μια αναλογική σε ψηφιακή μετατροπή, ο αφέντης (μικροελεγκτής) πρέπει να προκαλέσει την εντολή: Convert T [44h]. Αποτέλεσμα αυτής της εντολής είναι η θερμοκρασιακή τιμή να αποθηκευτεί στο 2-byte καταχωρητή θερμοκρασίας στην περιοχή της μνήμης και έπειτα το DS18B20 επιστρέφει σε αδρανή κατάσταση. Εάν ο αισθητήρας DS28B20 τροφοδοτείται από εξωτερική πηγή, ο αφέντης μπορεί να ζητήσει “read time slots” μετά την αποστολή της εντολής Convert T και το DS18B20 θα ανταποκριθεί μεταδίδοντας 0 όταν είναι σε κατάσταση μέτρησης και 1 όταν η μετατροπή μέτρησης έχει ολοκληρωθεί. Αυτό δεν εφαρμόζεται στη τροφοδοσία τύπου “parasite power” γιαυτό ο δίαυλος δεδομένων πρέπει να τραβηχτεί σε high με ισχυρή pull-up καθόλη τη διάρκεια της μέτρησης και μετατροπής της θερμοκρασίας.

Στο DS18B20 η μέτρηση και η έξοδος των δεδομένων είναι σε βαθμούς Κελσίου. Για μετρήσεις σε βαθμούς Φαρενάιτ, μια ρουτίνα μετατροπής πρέπει να χρησιμοποιηθεί επιπρόσθετα. Τα δεδομένα θερμοκρασίας αποθηκεύονται σαν 16-bit τιμές και με το συμπλήρωμα ως προς δυο στον καταχωρητή θερμοκρασίας (βλέπε στο σχήμα 2). Το bit προσήμου (S) δείχνει αν η θερμοκρασία είναι θετική ή αρνητική. Για θετικές τιμές τίθεται S=0 και για αρνητικές τιμές τίθεται S=1. Εάν το DS18B20 διαμορφωθεί σε 12-bit ανάλυση όλα τα bits του θερμοκρασιακού καταχωρητή έχουν έγκυρα δεδομένα. Για 11-bit ανάλυση το bit 0 δεν ορίζεται. Για 10-bit ανάλυση τα bits 0 και 1 δεν ορίζονται ενώ για 9-bit ανάλυση τα bits 2, 1, 0 δεν ορίζονται.

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

Έπειτα που το DS18B20 εκτελέσει μια θερμοκρασιακή μέτρηση και μετατροπή, η θερμοκρασιακή τιμή συγκρίνεται με τις δυο τιμές των καταχωρητών συναγερμού ΤΗ και ΤL, οι οποίες είναι τιμές συμπληρώματος ως προς δυο και ορίζονται από το χρήστη. Το bit προσήμου ορίζει αν μια τιμή είναι θετική ή αρνητική, για θετικούς αριθμούς είναι S=0 και για αρνητικούς αριθμούς είναι S=1. Οι ΤΗ και TL καταχωρητές είναι αποθηκευμένοι στην ΕΕPROM και δεν απαιτούν τάση για να συντηρηθούν και μπορούν να προσπελαυτούν διαμέσου των bytes 2 και 3 της περιοχής της μνήμης. Περισσότερες πληροφορίες στο πως ο αφέντης ελέγχει τις σημαίες συναγερμού όλων των DS18B20 στο δίαυλο δεδομένων θα βρείτε στο datasheet του DS18B20.

64-BIT ROM ΚΩΔΙΚΟΣ ΑΡΙΘΜΟΣ

Κάθε DS18B20 περιέχει ένα μοναδικό κωδικό αριθμό, αποθηκευμένο στην ROM. Τα οκτώ λιγότερο σημαντικά ψηφία από αυτόν τον 64-bit κωδικό, περιέχει τον 1-Wire κωδικό της οικογένειας του DS18B20 και συγκεκριμένα τον 28h. Τα επόμενα 48 bits περιέχουν ένα μοναδικό σειριακό αριθμό. Τα οκτώ περισσότερα σημαντικά ψηφία, περιέχουν το byte του κυκλικού ελέγχου απόρριψης (CRC), το οποίο υπολογίζεται από τα πρώτα 56 bits του ROM κωδικού. Περαιτέρω εξήγηση για το CRC bits μπορείτε να βρείτε στο datasheet του DS18B20.

ΜΝΗΜΗ

Η περιοχή της μνήμης του DS18B20 είναι οργανωμένη όπως στο σχήμα 7. Η μνήμη είναι τύπου SRAM. Υπάρχει και η μνήμη ΕΕPROM, που δεν απαιτεί τάση για την διατήρηση των δεδομένων, που αποθηκεύονται οι καταχωρητές ΤΗ και ΤL του συστήματος θερμοκρασιακού συναγερμού καθώς επίσης και ο καταχωρητής διαμόρφωσης. Σημείωση, αν η λειτουργία θερμοκρασιακού συναγερμού δεν χρησιμοποιείται, οι ΤΗ και ΤL καταχωρητές, μπορούν να χρησιμοποιηθούν ως γενικού σκοπού μνήμη.

Τα byte 0 και byte 1 της περιοχής της μνήμης περιέχουν το LSB και MSB του θερμοκρασιακού καταχωρητή αντίστοιχα. Τα byte αυτά είναι μόνο ανάγνωσης. Τα byte 2 και byte 3 παρέχουν πρόσβαση στους ΤΗ και ΤL καταχωρητές. Το byte 4 περιέχει τα δεδομένα του καταχωρητή διαμόρφωσης. Τα byte 5, 6 και 7 είναι δεσμευμένα για εσωτερική χρήση μόνο και δεν μπορούν να γραφτούν και αυτά τα bytes επιστρέφουν όλα τη τιμή 1 όταν διαβαστούν. Το byte 8 της περιοχής της μνήμης περιέχει τον κωδικό του κυκλικού ελέγχου απόρριψης (CRC) για τα bytes από 0 έως 7 της περιοχή μνήμης.

Τα δεδομένα γράφονται στα bytes 2, 3 και 4 της περιοχής μνήμης χρησιμοποιώντας την εντολή Write Scratchpad [4Eh]. Τα δεδομένα πρέπει να μεταφερθούν στο DS18B20 ξεκινώντας από το λιγότερο σημαντικό bit του byte 2.

Για την επιβεβαίωση της ακεραιότητας των δεδομένων, τα δεδομένα στην περιοχή της μνήμης μπορούν να διαβαστούν με την εντολή Read Scratchpad [Beh] μετά που τα δεδομένα γραφτούν. Όταν η περιοχή της μνήμης διαβάζεται, τα δεδομένα μεταφέρονται πάνω στο 1-Wire διαύλου δεδομένων ξεκινώντας από το λιγότερο σημαντικό bit του byte 0.

Για την μεταφορά των δεδομένων των ΤΗ και ΤL και διαμόρφωσης από την περιοχή μνήμης στην EEPROM, ο αφέντης πρέπει να ζητήσει την εντολή Copy Scratchpad [48h]. Τα δεδομένα στην EEPROM περιοχή καταχωρητών διατηρούνται όταν διακόπτεται η τάση τροφοδοσίας. Με την παροχή τροφοδοσίας τα δεδομένα της EEPROM ξαναφορτώνονται στις αντίστοιχες θέσεις στην περιοχή μνήμης SRAM. Τα δεδομένα της EEPROM μπορούν να φορτωθούν στην περιοχή της μνήμης, με την εντολή Recall E2 [B8h]. Ο αφέντης μπορεί να ζητήσει “read time slots” ακολουθούμενα την εντολή recall και το DS18B20 ανταποκρίνεται στην εντολή recall μεταδίδοντας 0 καθώς η εντολή recall είναι σε κατάσταση εκτέλεσης και 1 όταν η εκτέλεση της εντολής recall έχει τελειώσει.

ΚΑΤΑΧΩΡΗΤΗΣ ΔΙΑΜΟΡΦΩΣΗΣ

Το byte 4 της περιοχής της μνήμης περιέχει τον καταχωρητή διαμόρφωσης, που οργανώνεται όπως φαίνεται στο σχήμα 8. Ο χρήστης μπορεί να ορίσει την ανάλυση της μετατροπής των μετρήσεων θερμοκρασίας του DS18B20 χρησιμοποιώντας τα bits R0 και R1 αυτού του καταχωρητή, όπως δείχνει ο πίνακας 3. Κατά την εφαρμογή της τροφοδοσίας αυτά τα bits είναι R0=1 και R1=1 (12-bit ανάλυση). Σημειώστε ότι υπάρχει μια σχέση ανάμεσα στην ανάλυση και στο χρόνο μετατροπής. Το bit 7 και τα bits 0 έως 4 στον καταχωρητή διαμόρφωσης είναι δεσμευμένα για εσωτερική χρήση του αισθητήρα και δεν μπορούν να γραφούν.

ΠΑΡΑΓΩΓΗ ΤΟΥ BYTE CRC

Το DS18B20 παράγει δυο CRC bytes. Το ένα ως μέρος του 64-bit ROM κωδικού, από το οποίο το CRC byte υπολογίζεται από τα πρώτα 56 bits του ROM κωδικού και το CRC byte ενσωματώνεται στο πιο σημαντικό byte toy 64-bit ROM κωδικού. Το άλλο CRC byte που περιλαμβάνεται στο byte 8 της περιοχής μνήμης SRAM και υπολογίζεται από τα δεδομένα της περιοχής μνήμης SRAM και επομένως αλλάζει καθώς τα δεδομένα της περιοχής μνήμης αλλάζουν. Τα CRCs παρέχουν στον αφέντη μια μέθοδο επαλήθευσης, καθώς τα δεδομένα διαβάζονται από το DS18B20. Μπορείς να βρεις πως υπολογίζονται τα CRCs bytes στο datasheet του DS18B20.

1-WIRE ΔΙΑΥΛΟΣ ΔΕΔΟΜΕΝΩΝ

Ο 1-Wire δίαυλος δεδομένων χρησιμοποιεί ένα αφέντη για τον έλεγχο ενός ή περισσότερους σκλάβους συσκευές. Ο αισθητήρας DS18B20 ορίζεται πάντα ως σκλάβος. Όταν υπάρχει μόνο ένας σκλάβος στον δίαυλο δεδομένων, το σύστημα ονομάζεται “single-drop”. Το σύστημα είναι “multi-drop” όταν υπάρχουν πολλαπλοί σκλάβοι στον δίαυλο δεδομένων. Στον 1-Wire δίαυλο δεδομένων όλα τα δεδομένα και εντολές μεταδίδονται με το λιγότερο σημαντικό ψηφίο πρώτο. Η επόμενη συζήτηση για το 1-Wire δίαυλο δεδομένων χωρίζεται σε τρία μέρη: Α] Διαμόρφωση υλικού, Β] Διαδικασία μετάδοσης και τη Γ] Δομή του 1-Wire σήματος με εφαρμογή σε ένα AVR μικροελεγκτή.

Α] ΔΙΑΜΟΡΦΩΣΗ ΥΛΙΚΟΥ

Ο 1-Wire δίαυλος δεδομένων έχει μια γραμμή δεδομένων. Κάθε συσκευή (αφέντης ή σκλάβος) συνδέεται στη γραμμή δεδομένων διαμέσου μιας ανοικτού συλλέκτη ή τριών καταστάσεων πόρτα. Αυτό επιτρέπει κάθε συσκευή να “ελευθερώνει” τη γραμμή δεδομένων όταν η συσκευή δεν μεταδίδει δεδομένα, έτσι ώστε η γραμμή δεδομένων να είναι διαθέσιμη για άλλη συσκευή. Η 1-Wire πόρτα του DS18B20 (το DQ pin) είναι ανοικτού συλλέκτη, με ένα ισοδύναμο εσωτερικό κύκλωμα σαν αυτό που δείχνεται στο σχήμα 10. Ο 1-Wire δίαυλος δεδομένων απαιτεί μια pull-up αντίσταση τιμής 5KΩ, έτσι ώστε η αδρανή κατάσταση του 1-Wire διαύλου είναι high. Εάν για οποιαδήποτε λόγο η μετάδοση χρειάζεται να ανασταλεί, ο δίαυλος δεδομένων πρέπει να τεθεί σε αδρανή κατάσταση αν η μετάδοση πρόκειται να επαναληφθεί. Εάν ο δίαυλος δεδομένων κρατηθεί low περισσότερο από 480μs όλες οι συσκευές πάνω στο δίαυλο αρχικοποιούνται (επαναφέρονται).

Β] ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΔΟΣΗΣ

Η σειρά με την οποία γίνεται η επικοινωνία του DS18B20 με τον μικροελεγκτή είναι η ακόλουθη:
Βήμα 1: Αρχικοποίηση
Βήμα 2: Εντολή ROM (Ακολουθούμενη με τα απαραίτητα δεδομένα).
Βήμα 3: Εντολή λειτουργίας του DS18B20 (Ακολουθούμενη με τα απαραίτητα δεδομένα).

Είναι πολύ σημαντικό να ακολουθείται αυτή τη σειρά κάθε φορά που προκαλούμε πρόσβαση στο DS18B20, καθώς το DS18B20 δεν θα ανταποκριθεί, αν κάποιο από τα βήματα επικοινωνίας παραλειφθεί. Εξαιρέσεις σε αυτό τον κανόνα είναι οι εντολές Search ROM [F0h] και Alarm Search [Ech]. Έπειτα που ζητηθούν αυτές οι εντολές, ο αφέντης πρέπει να επιστρέψει στο βήμα 1 της σειράς επικοινωνίας.

Βήμα 1: Αρχικοποίηση

Η διαδικασία μεταδοσης πάνω στον 1-Wire δίαυλο δεδομένων, ξεκινά με το βήμα της αρχικοποίησης. Η αρχικοποίηση αποτελείται από τον παλμό επαναφοράς (αρχικοποίησης), που εκπέμπεται από τον αφέντη, πάνω στο δίαυλο δεδομένων ακολουθούμενο από τους παλμούς παρουσίας που μεταδίδουν ο (οι) σκλάβος (οι). Ο παλμός παρουσίας επιτρέπει στον αφέντη να γνωρίζει ότι σκλάβοι συσκευές (όπως το DS18B20) είναι πάνω στο δίαυλο δεδομένων και είναι έτοιμες να λειτουργήσουν και να ανταποκριθούν.

Βήμα 2: Εντολές ROM

Έπειτα που ο αφέντης έχει ανιχνεύσει ένα παλμό παρουσίας, μπορεί να ζητήσει μια εντολή ROM. Αυτές οι εντολές ROM δρουν πάνω στο μοναδικό 64-bit ROM κωδικό της κάθε σκλάβου συσκευής και επιτρέπει στον αφέντη να καθορίσει μια συσκευή, αν πολλαπλές συσκευές είναι πάνω στο 1-Wire δίαυλο δεδομένων. Αυτές οι εντολές ROM επιτρέπουν, επίσης, στον αφέντη να αναγνωρίσει πόσες και τον τύπο των συσκευών που υπάρχουν πάνω στο δίαυλο δεδομένων ή αν κάποια συσκευή βρίσκεται σε κατάσταση θερμοκρασιακού συναγερμού. Υπάρχουν πέντε εντολές ROM και κάθε εντολή έχει 8-bit μέγεθος. Ο αφέντης πρέπει να ζητήσει την κατάλληλη εντολή ROM πριν ζητήσει μια εντολή λειτουργίας του DS18B20.

Search Rom [F0h]
Όταν το σύστημα αρχικά τροφοδοτείται, ο αφέντης πρέπει να αναγνωρίσει τους ROM κωδικούς όλων των σκλάβων συσκευών, πάνω στον δίαυλο δεδομένων, το οποίο επιτρέπει στον αφέντη να καθορίσει τον αριθμό και το τύπο των σκλάβων συσκευών. Αυτό μπορεί να γίνει με την εντολή Search ROM [F0h]. Ο αφέντης μαθαίνει τους ROM κωδικούς διαμέσου μιας διαδικασίας που απαιτεί από τον αφέντη να εκτελεί ένα κύκλο Search ROM όσες φορές χρειάζεται για να αναγνωρίσει όλους τους σκλάβους συσκευές. Εάν υπάρχει μόνο ένας σκλάβος πάνω στο δίαυλο δεδομένων, η απλούστερη εντολή Read ROM [33h] μπορεί να χρησιμοποιηθεί στην θέση της Search ROM διαδικασίας.

Read Rom [33h]
Η εντολή Read ROM [33h] μπορεί να χρησιμοποιηθεί όταν υπάρχει ένας σκλάβος στο δίαυλο δεδομένων. Επιτρέπει στον αφέντη να διαβάσει τον 64-bit ROM κωδικό του σκλάβου χωρίς τη χρήση της Search ROM διαδικασίας. Εάν αυτή η εντολή χρησιμοποιηθεί όταν υπάρχουν περισσότεροι από ένας σκλάβους συσκευές στο δίαυλο δεδομένων, μια σύγκρουση δεδομένων θα συμβεί, καθώς όλοι οι σκλάβοι προσπαθούν να ανταποκριθούν την ίδια χρονική στιγμή.

Match Rom [55h]
Η εντολή Match ROM ακολουθούμενη από τον 64-bit ROM κωδικό, επιτρέπει στον αφέντη να ενεργοποιήσει ένα συγκεκριμένο σκλάβο συσκευή σε ένα multi-drop ή single-drop δίαυλο δεδομένων. Μόνο ο σκλάβος που καθορίζεται από το συγκεκριμένο 64-bit ROM κωδικό θα ανταποκρίνεται σε όλες τις εντολές λειτουργίας που ζητά ο αφέντης, ενώ οι υπόλοιπες σκλάβους συσκευές περιμένουν τον παλμό αρχικοποίησης (επαναφοράς).

Skip Rom [CCh]
Ο αφέντης μπορεί να ζητήσει την εντολή Skip ROM [Cch] για να ορίσει όλες τις συσκευές του διαύλου δεδομένων ταυτόχρονα χωρίς να στείλει ROM κωδικούς. Για παράδειγμα, ο αφέντης μπορεί να προκαλέσει όλα τα DS18B20 του διαύλου δεδομένων να εκτελέσουν ταυτόχρονα μέτρηση και μετατροπή θερμοκρασίας. Ζητώντας μια Skip ROM εντολή ακολουθούμενη από την εντολή Convert T [44h].

Σημείωση: η εντολή λειτουργίας Read Scratchpad [Beh] μπορεί να ακολουθεί την εντολή Skip ROM μόνο όταν υπάρχει μια σκλάβος συσκευή στο δίαυλο δεδομένων. Σε αυτή την περίπτωση εξοικονομείται χρόνος στον αφέντη για να διαβάζει από τον σκλάβο, χωρίς να στείλει τον 64-bit ROM κωδικό. Η εντολή Skip ROM ακολουθούμενη από την εντολή Read Scratchpad θα προκαλέσει σύγκρουση δεδομένων στο δίαυλο δεδομένων όταν υπάρχουν περισσότεροι από ένα σκλάβοι από την στιγμή που υπάρχουν πολλαπλοί σκλάβοι θα προσπαθήσουν να μεταδώσουν δεδομένα ταυτόχρονα.

Alarm Search [Ech]
Η λειτουργία της εντολής Alarm Search [Ech] είναι πανομοιότυπη με την λειτουργία της εντολής Search ROM, εκτός από το ότι μόνο οι σκλάβοι με ενεργοποιημένοι τη σημαία συναγερμού θερμοκρασίας θα ανταποκριθούν. Αυτή η εντολή επιτρέπει στον αφέντη να καθορίσει εάν κάποιο DS18B20 βρίσκεται σε κατάσταση συναγερμού στην πρόσφατη μέτρηση και μετατροπή της θερμοκρασίας. Μέσα από κάθε κύκλο Alarm Search, ο αφέντης πρέπει να επιτρέψει στο βήμα 1 (αρχικοποίηση) της διαδικασία μετάδοσης.

Βήμα 3: Εντολές λειτουργίας του DS18B20

Μετά που ο αφέντης έχει χρησιμοποιήσει μια εντολή ROM, για να ορίσει το DS18B20 που επιθυμεί να επικοινωνήσει, ο αφέντης μπορεί να ζητήσει μια εντολή λειτουργίας του DS18B20. Αυτές οι εντολές λειτουργίας επιτρέπουν στον αφέντη να γράψει και να διαβάσει από την περιοχή της μνήμης του DS18B20, να αρχίσει τη μέτρηση και μετατροπή της θερμοκρασίας και να καθορίσει τον τρόπο τροφοδοσίας.

Convert T [44h]
Αυτή η εντολή αρχίζει μια απλή μέτρηση και μετατροπή θερμοκρασίας. Τα ψηφιακά αποτελέσματα αυτής της εντολής αποθηκεύονται στον 2-byte καταχωρητή θερμοκρασίας, στην περιοχή μνήμης και μετά το DS18B20 επιστρέφει σε αδρανή κατάσταση. Εάν το DS18B20 τροφοδοτείται από εξωτερική πηγή, ο αφέντης μπορεί να ζητήσει “read time slots” μετά την εντολή Convert T και το DS18B20 ανταποκρίνεται μεταδίδοντας 0 όταν βρίσκεται ακόμη σε κατάσταση μέτρησης και μετατροπής θερμοκρασίας και 1 αν ή μέτρηση και μετατροπή έχει ολοκληρωθεί. Όταν τροφοδοτείται με “parasite power” αυτή η λειτουργία δεν μπορεί να χρησιμοποιηθεί από την στιγμή που ο δίαυλος δεδομένων τραβιέται σε high κατά την διάρκεια της μέτρησης και μετατροπής της θερμοκρασίας.

Write Scratchpad [4Eh]
Αυτή η εντολή επιτρέπει στον αφέντη να γράψει τρία byte δεδομένων στην περιοχή μνήμης του DS18B20. Το πρώτο byte γράφεται στο ΤΗ καταχωρητή (byte 2 της περιοχή μνήμης) το δεύτερο byte γράφεται στο TL καταχωρητή (byte 3) και το τρίτο byte γράφεται στον καταχωρητή διαμόρφωσης (byte 4). Τα δεδομένα μεταδίδονται πρώτα το λιγότερο σημαντικό bit. Όλα και τα τρία bytes πρέπει να γραφούν πριν ο αφέντης ζητήσει εντολή αρχικοποίησης (επαναφοράς).

Read Scratchpad [BEh]
Με αυτή την εντολή ο αφέντης διαβάζει τα περιεχόμενα της περιοχή μνήμης. Τα δεδομένα μεταφέρονται ξεκινώντας από το λιγότερο σημαντικό bit του byte 0 και συνεχίζονται μέχρι το ένατο byte (byte8 -CRC) της περιοχή μνήμης. Ο αφέντης μπορεί να ζητήσει εντολή αρχικοποίησης (επαναφοράς) για να διακόψει το διάβασμα οποιαδήποτε στιγμή, εάν μόνο ένα τμήμα της περιοχή μνήμης χρειάζεται να διαβαστεί.

Copy Scratchpad [48h]
Αυτή η εντολή αντιγράφει τα περιεχόμενα των καταχωρητών ΤΗ, ΤL και διαμόρφωσης που αντιστοιχούν στα bytes 2, 3 και 4 της περιοχής της μνήμης προς την μνήμη EEPROM. Αν το DS18B20 λειτουργεί σε “parasite power mode” μέσα σε χρόνο 10μs το μέγιστο, μετά αυτή την εντολή ο αφέντης πρέπει να ενεργοποιήσει δυνατό τράβηγμα pull-up στον 1-Wire δίαυλο δεδομένων, με διάρκεια το λιγότερο 10ms.

Recall E2 [B8h]
Με αυτή την εντολή αντιγράφονται τα όρια του θερμοκρασιακού συναγερμού (ΤΗ και ΤL) και τα δεδομένα του byte διαμόρφωσης από την μνήμη EEPROM στα bytes 2, 3 και 4 αντίστοιχα στη περιοχή της μνήμης. Ο αφέντης μετά την εντολή Recall E2 μπορεί να ζητήσει “read time slots” και το DS18B20 ανταποκρίνεται με 0 όταν η εντολή Recall E2 είναι σε διαδικασία εκτέλεσης και 1 όταν έχει ολοκληρωθεί. Η λειτουργία recall εκτελείται αυτόματα μόλις τροφοδοτηθεί με τάση το DS18B20 έτσι ώστε τα δεδομένα να είναι διαθέσιμα μέσα στη περιοχή μνήμης με την αρχή τροφοδοσίας του DS18B20.

Read Power Supply [B4h]
Ο αφέντης μπορεί να ζητήσει αυτή την εντολή ακολουθούμενη από “read time slot” για να του γνωστοποιηθεί έναν κάποιο DS18B20 πάνω στο δίαυλο δεδομένων λειτουργεί με τροφοδοσία “parasite power”. Κατά τη διάρκεια του “read time slot” τα DS18B20 σε κατάσταση “parasite mode” τραβούν το δίαυλο δεδομένων σε low ενώ αυτά που τροφοδοτούνται από εξωτερική πηγή αφήνουν το δίαυλο δεδομένων σε high. Εάν ο δίαυλος δεδομένων τραβηχτεί σε low, ο αφέντης γνωρίζει ότι να τροφοδοτήσει με δυνατό pull-up στον 1-Wire δίαυλο δεδομένων κατά τη διάρκεια θερμοκρασιακών μετρήσεων και μετατροπών.

Γ] ΕΠΙΚΟΙΝΩΝΙΑ ΤΟΥ DS18B20 ΜΕ ΤΟΝ ΜΙΚΡΟΕΛΕΓΚΤΗ AVR

Ο αισθητήρας DS18B20 (σκλάβος) μπορεί και επικοινωνεί με ένα μικροελεγκτή AVR διαμέσου του πρωτοκόλλου 1-Wire. Σε αυτό το πρωτόκολλο, διάφοροι τύποι σημάτων ορίζονται: παλμός επαναφοράς, παλμός παρουσίας, εγγραφή του ψηφίου 0, εγγραφή του ψηφίου 1, διάβασμα του ψηφίου 0 και διάβασμα του ψηφίου 1. Σε αυτό το κείμενο, θεωρούμε την σύνδεση του μικροελεγκτή ATmega328P με τον αισθητήρα DS18B20. Για να είναι ο κώδικας που θα γράψουμε κατανοητός και ξεκάθαρος, συνιστώ να χρησιμοποιήσετε τις επόμενες ντιρεκτίβες στην αρχή του προγράμματος σας για τον AVR:

//Thermometer Connections (At your choice)
#define THERM_PORT   PORTD
#define THERM_DDR    DDRD
#define THERM_PIN    PIND
#define THERM_DQ   PD4
//Functions
#define THERM_INPUT_MODE()    THERM_DDR&=~(1<<THERM_DQ)
#define THERM_OUTPUT_MODE()   THERM_DDR|=(1<<THERM_DQ)
#define THERM_LOW()           THERM_PORT&=~(1<<THERM_DQ)
#define THERM_HIGH()          THERM_PORT|=(1<<THERM_DQ)

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

Όλη η επικοινωνία με το DS18B20 αρχίζει με τη διαδικασία αρχικοποίησης που αποτελείται από την αποστολή του παλμού επαναφοράς από τον αφέντη (μικροελεγκτή) ακολουθούμενος από τον παλμό παρουσίας από το DS18B20. Όταν ο αισθητήρας DS18B20 στείλει το παλμό παρουσίας σαν ανταπόκριση στο παλμό επαναφοράς του αφέντη, ο σκλάβος (DS18B20) γνωστοποιεί στον αφέντη ότι είναι πάνω στον δίαυλο δεδομένων και ότι είναι έτοιμος να λειτουργήσει.

Κατά τη διάρκεια της διαδικασίας αρχικοποίησης ο αφέντης μεταδίδει (ΤΧ) τον παλμό επαναφοράς με τράβηγμα του 1-Wire διαύλου δεδομένων σε κατάσταση low, το λιγότερο για χρονικό διάστημα 480μs. Μετά ο αφέντης ελευθερώνει το δίαυλο δεδομένων και μπαίνει σε κατάσταση διαβάσματος (RX). Καθώς ο δίαυλος δεδομένων ελευθερώνεται η 5ΚΩ αντίσταση pull-up τραβά τον 1-Wire δίαυλο δεδομένων σε κατάσταση high. Όταν το DS18B20 ανιχνεύσει αυτή την ακμή της ανόδου της τάσης, περιμένει για χρονικό διάστημα από 15μs έως 60μs και μετά μεταδίδει τον παλμό παρουσίας, τραβώντας τον 1-Wire δίαυλο δεδομένων σε κατάσταση low για χρονικό διάστημα από 60μs έως 240μs.

Ο κώδικας σε γλώσσα C για τον AVR της παραπάνω διαδικασίας αρχικοποίησης, δίνεται παρακάτω:

uint8_t therm_reset(){
	uint8_t i;
	
	cli();
	THERM_OUTPUT_MODE();
	THERM_LOW();
	sei();
	_delay_us(480);
	
	cli();
	THERM_INPUT_MODE();
	_delay_us(60);
	
	i=THERM_PIN & (1<<THERM_DQ);
	sei();
	
	_delay_us(420);
	return i;	
}

Σημείωση: Επειδή υλοποιούμε τα χρονικά διαστήματα με την συνάρτηση _delay_us(480); πρέπει να ενσωματώσετε την βιβλιοθήκη delay.h στην αρχή του προγράμματος σας και συγκεκριμένα την ακόλουθη γραμμή κώδικα:

#include <util/delay.h>

READ/WRITE SLOTS

Ο αφέντης γράφει δεδομένα στο DS18B20 κατά τη διάρκεια “write time slots” και διαβάζει δεδομένα από το DS18B20 κατά τη διάρκεια “read time slots”. Ένα bit δεδομένων μεταφέρεται πάνω στον 1-Wire δίαυλο δεδομένων κατά τη διάρκεια ενός “write time slot” ή ενός “read time slot”

Write time slots

Υπάρχουν δυο τύποι “write time slots” το “write 1” και το “write 0”. Ο αφέντης χρησιμοποιεί το “write 1 time slot” για να γράψει το λογικό 1 στο DS18B20 και το “write 0 time slot” για να γράψει το λογικό 0 στο DS18B20. Όλα τα “write time slots” πρέπει να έχουν το λιγότερο χρονική διάρκεια 60μs και το λιγότερο 1μs χρονική απόσταση μεταξύ δυο ανεξάρτητων “write slots”. Και οι δυο τύποι “write slots” αρχίζουν από τον αφέντη τραβώντας την 1-Wire γραμμή δεδομένων σε κατάσταση low.

Για τη δημιουργία του “write 1 time slot” ο αφέντης τραβά την 1-Wire γραμμή low και θα πρέπει να την ελευθερώσει μετα από χρόνο 15μs. Καθώς η γραμμή ελευθερώνεται, η 5ΚΩ pull-up αντίσταση τράβα το δίαυλο δεδομένων σε κατάσταση high. Για την δημιουργία του “write 0 time slot” μετά το τράβηγμα από τον αφέντη τη γραμμή δεδομένων σε κατάσταση low, ο αφέντης πρέπει να συνεχίσει να την κρατά σε κατάσταση low για χρονικό διάστημα ενός “time slot” (το λιγότερο 60μs). Το DS18B20 δειγματοληπτεί την 1-Wire γραμμή δεδομένων κατά την διάρκεια ενός χρονικού παραθύρου που διαρκεί από 15μs εως 60μs μετά που ο αφέντης αρχίζει το “write time slot” Εάν η γραμμή δεδομένων είναι σε κατάσταση high κατά τη διάρκεια του δειγματοληπτικού παραθύρου, το λογικό 1 γράφεται στο DS18B20. Εάν η γραμμή δεδομένων είναι σε κατάσταση low, το λογικό 0 γράφεται στο DS18B20.

Read time slots

Το DS18B20 μπορεί να μεταδίδει δεδομένα στον αφέντη, όταν ο αφέντης δημιουργεί “read time slots”. Επομένως ο αφέντης δημιουργεί “read time slots” αμέσως μετά την εντολή Read Scratchpad [Beh] ή Read Power Supply [B4h], έτσι ώστε το DS18B20 να παρέχει τα αιτούμενα δεδομένα. Επιπρόσθετα ο αφέντης μπορεί να δημιουργήσει “read time slot” μετά την εντολή Convert T [44h] ή την Recall E2 [B8h] για να ανιχνεύσει την κατάσταση εκτέλεσης εντολής στο DS18B20.

Όλες οι “read time slots” πρέπει να έχουν το λιγότερο χρονική διάρκεια 60μs και το ελάχιστο χρονικό διάστημα 1μs μεταξύ των “read slots”. Ένα “read time slot” αρχίζει από τον αφέντη τραβώντας την 1-Wire γραμμή δεδομένων σε κατάσταση low το λιγότερο 1μs και μετα ο αφέντης ελευθερώνει την γραμμή (βλέπε το διάγραμμα). Μετά που ο αφέντης αρχίσει ένα “read time slot”, το DS18B20 ανταποκρίνεται μεταδίδοντας το λογικό 1 ή το λογικό 0 στη γραμμή δεδομένων. Το DS18B20 μεταδίδει το λογικό 1 αφήνοντας τη γραμμή δεδομένων σε κατάσταση high και μεταδίδει το λογικό 0 τραβώντας τη γραμμή δεδομένων σε κατάσταση low. Όταν μεταδίδει το λογικό 0 το DS18B20 θα ελευθερώσει τη γραμμή δεδομένων στο τέλος του “time slot” και τότε η γραμμή δεδομένων θα τραβηχτεί σε κατάσταση high με την pull-up αντίσταση μπαίνοντας σε αδρανή κατάσταση. Τα δεδομένα από την έξοδο του DS18B20 είναι έγκυρα για 15μs μετά την πτώση σε low της αρχής του “read time slot”. Επομένως, ο αφέντης πρέπει να ελευθερώσει τη γραμμή δεδομένων μέσασε χρόνο 15μs μετά την αρχή του “read time slot”και μετά να δειγματοληπτήσει τη γραμμή δεδομένων.

ΛΕΙΤΟΥΡΓΙΑ READ / WRITE

Θα σας δείξουμε πως να κάνετε συναρτήσεις στην γλώσσα C, οι οποίες θα γράφουν και θα διαβάζουν ανεξάρτητα bits από το DS18B20 και μετά άλλες συναρτήσεις με τις οποίες διαβάζουν και θα γράφουν ολόκληρα bytes.

Διαβάζοντας / γράφοντας ανεξάρτητα bits

Κατά την διαδικασία εγγραφής, τραβάμε τη γραμμή δεδομένων σε κατάσταση low κατά το ξεκίνημα. Εάν θέλουμε να γράψουμε το λογικό 0 θα κρατήσουμε τη γραμμή δεδομένων σε κατάσταση low μέχρι το τέλος της χρονικής διάρκειας (60μs), αλλά αν θέλουμε να γράψουμε το λογικό 1, μετά την αρχή με μια καθυστέρηση 1μs ελευθερώνουμε τη γραμμή. Μια υλοποίηση σε γλώσσα C δείχνεται ακολούθως.

void therm_write_bit(uint8_t bit){  //Write one bit to DS18B20
	cli();
	THERM_OUTPUT_MODE();
	THERM_LOW();
	asm("nop");
	
	if(bit) THERM_INPUT_MODE();
	_delay_us(60);
	THERM_INPUT_MODE();
	sei();
}

Από την άλλη μεριά, έχουμε τη διαδικασία διαβάσματος. Είναι αρκετά όμοια, αλλά έχει μερικές διαφορές. Ξεκινάμε τραβώντας τη γραμμή δεδομένων σε κατάσταση low για χρονικό διάστημα 1μs. Μετά πρέπει να ελευθερώσουμε τη γραμμή δεδομένων και να περιμένουμε για 14μs (14+1=15μs όπως φαίνεται στο διάγραμμα). Μετά από αυτό, μπορούμε να διαβάσουμε την τιμή της γραμμής δεδομένων, η οποία θα είναι σε κατάσταση high όταν το DS18B20 μεταδίδει το λογικό 1 και σε κατάσταση low όταν μεταδίδει το λογικό 0. Στο τέλος πρέπει να περιμένουμε 45μs μέχρι το τέλος του χρονικού διαστήματος των 60μs. Μια υλοποίηση σε γλώσσα C δείχνεται ακολούθως.

uint8_t therm_read_bit(void){   //Read one bit from DS18B20
	uint8_t bit=0;
	
	cli();
	THERM_OUTPUT_MODE();
	THERM_LOW();
	asm("nop");
	
	THERM_INPUT_MODE();
	_delay_us(14);
	
	if(THERM_PIN & (1<<THERM_DQ)) bit=1;
	_delay_us(45);
	sei();
	
	return bit;
}

Διαβάζοντας / γράφοντας bytes

Τώρα που μπορούμε να διαβάσουμε ή να γράψουμε ανεξάρτητα bits, για να διαβάσουμε ή η να γράψουμε bytes είναι αρκετά εύκολο: Κάνουμε βρόγχους των οκτώ κύκλων και αποθηκεύουμε τα αποτελέσματα σε μια μεταβλητή. Μια υλοποίηση σε γλώσσα C δείχνεται ακολούθως.

uint8_t therm_read_byte(void){  //Read one byte serial from DS18B20
	uint8_t i=8, n=0;
	
	while(i--){
		n>>=1;
		n|=(therm_read_bit()<<7);
	}
	return n;
}

void therm_write_byte(uint8_t byte){  //Write one byte serial to DS18D20
	uint8_t i=8;
	
	while(i--){
		therm_write_bit(byte&1);
		byte>>=1;
	}
}

ΤΟ ΤΕΛΕΥΤΑΙΟ ΒΗΜΑ: ΔΙΑΒΑΖΟΝΤΑΣ ΤΗ ΘΕΡΜΟΚΡΑΣΙΑ

Τώρα που μπορούμε να γράψουμε και να διαβάσουμε από το θερμόμετρο DS18B20, είναι ώρα να μάθουμε πως να διαβάζουμε τη θερμοκρασία. Η θερμοκρασία αποθηκεύεται στα πρώτα δυο bytes της περιοχής μνήμης του D18B20, η οποία είναι μεγέθους εννέα bytes. Τώρα είναι η ώρα να κάνουμε υλοποίηση της διαδικασία διαβάσματος της θερμοκρασίας σε γλώσσα C. Ο κώδικας που ακολουθεί λειτουργεί για ένα αισθητήρα DS18B20 στην γραμμή δεδομένων και διαμορφώθηκε για ανάλυση 12-bits.

uint8_t therm_read_temperature(void){
	uint8_t temperature[2];
	uint8_t temp_value;
	
	//Reset, skip ROM and start temperature conversion
	therm_reset();
	therm_write_byte(THERM_CMD_SKIPROM);
	therm_write_byte(THERM_CMD_CONVERTTEMP);
	
	//Wait until conversion is complete
	while(!therm_read_bit());
	
	//Reset, skip ROM and send command to read Scratchpad
	therm_reset();
	therm_write_byte(THERM_CMD_SKIPROM);
	therm_write_byte(THERM_CMD_RSCRATCHPAD);
	
	//Read Scratchpad (only 2 first bytes)
	temperature[0] = therm_read_byte();
	temperature[1] = therm_read_byte();
	
	temp_value = temperature[0]>>4;
	temp_value |= ((temperature[1]&0x0f)<<4);
	
	return temp_value;
}

Στην αρχή του προγράμματος πρέπει να προσθέσουμε τους ακόλουθους ορισμούς.

#define THERM_CMD_CONVERTTEMP    0x44
#define THERM_CMD_RSCRATCHPAD    0xbe
#define THERM_CMD_SKIPROM        0xcc