0
Καλημέρα σε όλους και καλή χρονιά!
Το πρόβλημα έχει ως εξής: απο μια εξωτερική εξωτερική εφαρμογή που τρέχει στον υπολογιστή, στέλνω με το πάτημα ενός κουμπιού
ένα string στη σειριακή που είναι συνδεδεμένο το project με έναν ATmega2560 που περιλαμβάνει μεταξύ των άλλων και ένα RTC της
ST, το M41T80 (μέσες-άκρες παρόμοιο με αυτά της Dallas DS1307). Η επικοινωνία στο δίαυλο I²C είναι τεκμηριωμένη, όπως και στη
σειριακή πόρτα (στέλνω διάφορα και τα διαβάζω πίσω απο το παράθυρο σειριακής του IDE).
Το striing που στέλνω έχει συγκεκριμένο format: αρχίζει με το χαρακτήρα 't' και ακολουθούν 11 bytes με αριθμούς που υποδηλώνουν την
ημερομηνία-ώρα του υπολογιστή, ο οποίος με αυτό τον τρόπο την στέλνει στην πλακέτα για να ενημερώσει το RTC της. Είναι λοιπόν
κάπως έτσι: t311212135559 που σημαίνει: 31/12/12 13:55:59.
Αυτό που κάνει η πλακέτα, είναι να υποδέχεται το παραπάνω string μόλις ανιχνευθεί ο χαρακτήρας t και να "φτιάξει" ένα ένα τα ακολουθώντα
νούμερα σε bytes για να καταχωρηθούν στους registers του RTC. Ακολούθως, τα επιστρέφει στη σειριακή για aknowledge.
Η ρουτίνα που κάνει αυτό είναι η εξής:
ενώ οι ρουτίνες εγγραφής και ανάγνωσης προς/ απο το RTC είναι αυτές:Κώδικας:void processSyncMessage() { if (Serial.available() > 0) { Serial.readBytesUntil(TIME_HEADER, timeBuffer, TIME_MSG_LEN); //========>TIME_HEADER= 't', TIME_MSG_LEN = 12, το μήκος του buffer που υποδέχεται το string. daysOfMonth = (timeBuffer[2] << 8 | (timeBuffer[1]-48)); months = (timeBuffer[4] << 8 | (timeBuffer[3]-48)); years = (timeBuffer[6] << 8 | (timeBuffer[5]-48)); hours = (timeBuffer[8] << 8 | timeBuffer[7])-48; minutes = (timeBuffer[10] << 8 | timeBuffer[9])-48; seconds = (timeBuffer[12] << 8 | timeBuffer[11])-48; } }
Το αποτέλεσμα όταν ξαναδιαβάζω το RTC (ανανεωμένο πλέον) με την εντολή:Κώδικας:// =================================================================== void setDateM41T80() // 0-99 { Wire.beginTransmission(M41T80_I2C_ADDRESS); Wire.write(0x00); Wire.write(decToBcd(msecond)); Wire.write(decToBcd(seconds) & 0x7f); // 0 to bit 7 starts the clock Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); // If you want 12 hour am/pm you need to set // bit 6 (also need to change readDateDs1307) Wire.write(decToBcd(daysOfWeek)); Wire.write(decToBcd(daysOfMonth)); Wire.write(decToBcd(months)); Wire.write(decToBcd(years)); Wire.endTransmission(); } // =================================================================== void getDateM41T80() { Wire.beginTransmission(M41T80_I2C_ADDRESS); Wire.write(0x00); Wire.endTransmission(); Wire.requestFrom(M41T80_I2C_ADDRESS, 8); // A few of these need masks because certain bits are control bits msecond = bcdToDec(Wire.read()); seconds = bcdToDec(Wire.read() & 0x7f); minutes = bcdToDec(Wire.read()); hours = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm daysOfWeek = bcdToDec(Wire.read()); daysOfMonth = bcdToDec(Wire.read()); months = bcdToDec(Wire.read()); years = bcdToDec(Wire.read()); Wire.endTransmission(); } // ===================================================================
Serial.print(daysOfMonth); (και όλα τα υπόλοιπα month, year κτλ)
είναι να παίρνω αυτό: 010202030509. Δηλαδή, φαίνεται οτι το πρώτο ψηφίο του κάθε πεδίου (ημερομηνία, μήνα, χρόνο κτλ)
το μεταφράζει 0 στη μετατροπή του ASCII. Δεν ξέρω αν έχω κατατοπίσει πλήρως αλλά αν υπάρχει κάποιος να βοηθήσει, μπορώ να
αναφερθώ σε περισσότερες λεπτομέρειες. Έχω πάντως την εντύπωση πως γίνεται κάτι λάθος στη μετατροπή του ASCII string σε
byte και μετά στην αντίστροφη διαδικασία...
Κάθε βοήθεια - πρόταση ευπρόσδεκτη, έχει κολλήσει όλο το σύστημα εδώ...