Εμφάνιση αποτελεσμάτων : 1 έως 8 από 8

Θέμα: Χρησιμοποιώντας μια εξωτερική ΕΕPROM σε Arduino

  1. #1
    Μέλος
    Όνομα
    Θοδωρής Λέκας
    Εγγραφή
    Oct 2010
    Περιοχή
    Αν. Θεσσαλονίκη
    Μηνύματα
    390

    Προεπιλογή Χρησιμοποιώντας μια εξωτερική ΕΕPROM σε Arduino

    Διαβάζοντας λίγο ένα έτοιμο παράδειγμα κατανόησης που αποθηκεύει και μετά διαβάζει 20 bytes στις 20 πρώτες θέσεις μιας μνήμης EEPROM προκύπτουν πολλές απορίες.
    Το sketch είναι το εξής: (με ελληνικά είναι τα δικά μου σχόλια-απορίες)

    #include <Wire.h>
    #define chip1 0x50 // η 7-bit διεύθυνση της EEPROM

    unsigned int pointer;
    byte d=0;

    void setup(){

    Serial.begin(9600);
    Wire.begin();
    }


    // Στην παρακάτω συνάρτηση κατάλαβα ότι τα ορίσματα είναι:
    //device για τη διεύθυνση της EEPROM
    //address για τη θέση μνήμης μέσα στην EEPROM
    //data: δεδομένα ενός byte της μεταβλητής data


    void writeData(int device, unsigned int address, byte data){

    Wire.beginTransmission(device);
    Wire.write((byte)(address >> 8 )); // left part of pointer address // Εδώ μήπως αντί address έπρεπε να γράψει pointer? Εξάλλου πουθενά δε βλέπω να χρησιμοποιεί την
    Wire.write((byte)(address & 0xFF)); //and the right // μεταβλητή pointer. Αν ναι, τί ακριβώς γίνεται εδώ?
    Wire.write(data);
    Wire.endTransmission();
    delay(10);
    }


    byte readData(int device, unsigned int address){
    byte result; //returned value
    Wire.beginTransmission(device);

    Wire.write((byte)(address >>8 )); // left part of pointer address // Εδώ μήπως αντί address έπρεπε να γράψει pointer? Εξάλλου πουθενά δε βλέπω να χρησιμοποιεί την Wire.write((byte)(address & 0xFF)); // and the right // μεταβλητή pointer. Αν ναι, τί ακριβώς γίνεται εδώ?


    Wire.endTransmission(); // Δε θα έπρεπε η συνάρτηση αυτή να γραφεί μετά την result = Wire.read();
    Wire.requestFrom(device, 1);
    result = Wire.read();
    return result;
    }




    void loop(){
    Serial.println("Writing data...");
    for(int a=0; a<20; a++)
    {
    writeData(chip1, a, a);
    }

    Serial.println("Reading data...");
    for(int a=0; a<20; a++);
    {
    Serial.print("EEPROM position ");
    Serial.print(a);
    Serial.print(" holds ");
    d = readData(chip1, a);
    Serial.println(d, DEC);
    }
    }

    Και άλλες απορίες είχα, απλά για αρχή είπα να αναφέρω μόνο αυτές, μήπως κάτσει κάποιος και μου εξηγήσει δυο πράγματα.

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    Θοδωρής Λέκας
    Εγγραφή
    Oct 2010
    Περιοχή
    Αν. Θεσσαλονίκη
    Μηνύματα
    390

    Προεπιλογή

    Ξέρει κανένας?

    0 Not allowed! Not allowed!

  3. #3
    Μέλος Το avatar του χρήστη sabouras
    Εγγραφή
    Aug 2008
    Μηνύματα
    137

    Προεπιλογή

    Wire.write((byte)(address >> 8 )); // left part of pointer address // Εδώ μήπως αντί address έπρεπε να γράψει pointer? Εξάλλου πουθενά δε βλέπω να χρησιμοποιεί την
    Wire.write((byte)(address & 0xFF)); //and the right // μεταβλητή pointer. Αν ναι, τί ακριβώς γίνεται εδώ?

    η μεταβλητη address ειναι 16bit και πρεπει να τη σπασει σε 2 μερη μιας και οι καταχωρητες τους arduino ειναι 8bit ευρους. Αυτο που κανει ειναι οτι ξεχωριζει το high byte και το Low byte. Το πρωτο που στέλνει είναι high byte (>> και κατοπιν το low byte (&0xFF).


    Wire.endTransmission(); // Δε θα έπρεπε η συνάρτηση αυτή να γραφεί μετά την result = Wire.read();

    οχι. Πρωτα τελειωνει με τη μεταδωση για να μπορεσει να την εκκινησει ξανα οταν χρειαστει και μετα διαβαζει οτι εχει στειλει η εξωτερικη ΕΕPROM.

    0 Not allowed! Not allowed!

  4. #4
    Μέλος
    Όνομα
    Θοδωρής Λέκας
    Εγγραφή
    Oct 2010
    Περιοχή
    Αν. Θεσσαλονίκη
    Μηνύματα
    390

    Προεπιλογή

    Και η μεταβλητή unsigned pointer? γιατί την ορίζει?

    Όσο γιάυτό που λες με το high και low byte, εννοείς αυτό :

    Έστω address = 1010101011111111
    Τότε: address >> 8 δίνει address = 0000000010101010
    Και: address & 0xFF = 1010101011111111 & 0000000011111111 =
    1010101011111111
    & 0000000011111111
    ------------------------
    0000000011111111

    Σωστά?

    0 Not allowed! Not allowed!

  5. #5
    Μέλος
    Όνομα
    Θοδωρής Λέκας
    Εγγραφή
    Oct 2010
    Περιοχή
    Αν. Θεσσαλονίκη
    Μηνύματα
    390

    Προεπιλογή

    Μάλλον είναι λάθος ε..δε χρειάζεται η μεταβλητή pointer.

    0 Not allowed! Not allowed!

  6. #6
    Μέλος Το avatar του χρήστη sabouras
    Εγγραφή
    Aug 2008
    Μηνύματα
    137

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από lelek Εμφάνιση μηνυμάτων
    Μάλλον είναι λάθος ε..δε χρειάζεται η μεταβλητή pointer.

    Σωστα δε τη χρησιμοποιει πουθενα.

    0 Not allowed! Not allowed!

  7. #7
    Μέλος Το avatar του χρήστη sabouras
    Εγγραφή
    Aug 2008
    Μηνύματα
    137

    Προεπιλογή

    Σωστα. Στη πρωτη περιπτωση περνεις στο καταχωρητη σου το 10101010
    και μετα το λογικο and 11111111

    0 Not allowed! Not allowed!

  8. #8
    Μέλος
    Όνομα
    Θοδωρής Λέκας
    Εγγραφή
    Oct 2010
    Περιοχή
    Αν. Θεσσαλονίκη
    Μηνύματα
    390

    Προεπιλογή

    Σ'ευχαριστώ. Μάλλον κατά λάθος έχει δηλώσει την μεταβλητή pointer.

    0 Not allowed! Not allowed!

Παρόμοια Θέματα

  1. Arduino - RS485 επικ/νια για διάβασμα PT100 sensor
    By redoom in forum Μικροελεγκτές
    Απαντήσεις: 25
    Τελευταίο Μήνυμα: 19-01-17, 22:25
  2. Μια μικρή βοήθεια σε arduino!
    By billtsig in forum Μικροελεγκτές
    Απαντήσεις: 11
    Τελευταίο Μήνυμα: 09-07-16, 09:38
  3. Απαντήσεις: 122
    Τελευταίο Μήνυμα: 20-08-14, 00:25
  4. Απαντήσεις: 1
    Τελευταίο Μήνυμα: 27-04-14, 00:55

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας