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

Θέμα: Κώδικας δουλεύει μόνο με serial.print

  1. #1
    Μέλος
    Όνομα
    Γιωργος
    Εγγραφή
    Feb 2009
    Περιοχή
    Τριπολη
    Μηνύματα
    145

    Προεπιλογή Κώδικας δουλεύει μόνο με serial.print

    Γεία σας κύριοι , ο κώδικας που σας δείχνω είναι ένα μέρος από ένα αρκετά μεγαλύτερο πρόγραμμα αλλά το πρόβλημα μου είναι εδώ. Μετάφρασα το πρόγραμμα από code vision που δούλευα σε arduino γιατί δυστυχώς μου κάηκε ο stk500 που είχα οπότε πήγα και πήρα ένα γνήσιο arduino για να συνεχίσω τη κατασκευή μου. Υποτίθεται λοιπόν ότι γίνεται έλεγχος στο πιν Α13 και όταν γίνει 0 το πρόγραμμα φεύγει από το while. Αλλιώς μένει ,αλλάζει την έξοδο 9 και μετα από 5 δεύτερα αλλάζει και τη μεταβλητή thesi. Το πρόβλημα είναι ότι έτσι όπως είναι το πρόγραμμα δε δουλεύει.. η έξοδος 9 δεν αλλάζει αν όμως ανοίξω ένα από τα serial.print (τα έβαλα να δω μεχρι που μπαίνει το πρόγραμμα δε τα θελω) χωρίς ακόμα να χρειαστεί να ανοίξω το serial.begin τότε το Λεντ που έχω βάλει στο 9 αναβοσβήνει κανονικά.. δουλεύει δηλαδή, τώρα έχω κάτι λάθος η φταίει ο 328; Που για να βρώ καινούριο θέλω να περιμένω μια βδομάδα. Επίσης τη millis() δε θέλω να τη βάλω γιατί η κατασκευή θέλω να δουλεύει συνέχεια. Να πώ επίσης οτι το δοκίμασα σε δύο διαφορετικούς υπολογιστές και τα ίδια...


    Κώδικας:
    #include <MsTimer2.h>
    int secs=1,lsecs=0;
    boolean thesi=true;
    void setup() {
      //Serial.begin(9600);
      pinMode(9, OUTPUT);
      pinMode(A5, OUTPUT);
      pinMode(8, OUTPUT);
     MsTimer2::set(1000, flash);
      MsTimer2::start();
    }
    void flash() {
      secs++;
      if (secs>61)
        secs=1;
    }
    void loop() {
       lsecs=5+secs;   
      if (lsecs>60)
        lsecs=5;
      while (digitalRead(A3) == HIGH)
      {
        //Serial.print(lsecs);
        digitalWrite(A5, HIGH);
        if (thesi==true)
          digitalWrite(9, HIGH);      
        else if (thesi==false)
          digitalWrite(9, LOW);
        if (lsecs<secs)
        {
          //Serial.print("\n");
            thesi=!thesi;
           lsecs=5+secs;
           if (lsecs>60)
        lsecs=5;
        }
      }
    }

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    Νίκος
    Εγγραφή
    Feb 2014
    Περιοχή
    Μοσχάτο
    Μηνύματα
    607

    Προεπιλογή

    Πωπω ζαλη.....
    Παράθεση Αρχικό μήνυμα από geob Εμφάνιση μηνυμάτων
    .
    .
    .
    Επίσης τη millis() δε θέλω να τη βάλω γιατί η κατασκευή θέλω να δουλεύει συνέχεια. ]
    Τι θες να πεις, ότι θέλει να δουλεύει συνέχεια? τι πρόβλημα έχεις με την millis()?

    0 Not allowed! Not allowed!

  3. #3
    Μέλος
    Όνομα
    Γιωργος
    Εγγραφή
    Feb 2009
    Περιοχή
    Τριπολη
    Μηνύματα
    145

    Προεπιλογή

    Συνέχεια ναι ή millis() μηδενίζει κάθε 7 μέρες αν δε κάνω λάθος.. Το τιμερ2 το έχω και για άλλη δουλειά οπότε είπα να έχω δυο σε ένα. Μεγαλύτερος μπελάς μου φαίνεται η μιλις Τεσπα αν είναι να παίξει έτσι το δοκιμαζω και αυτό. Αλλά θα δουλέψει η θα μείνω στις 7 μέρες;

    0 Not allowed! Not allowed!

  4. #4
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Απο το επισημο Site.

    millis()

    Description

    Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days.

    Θα κανει Overflow περιπου στις 50 μερες...

    1 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη SProg : 30-08-16 στις 18:28

  5. #5
    Μέλος
    Όνομα
    Γιωργος
    Εγγραφή
    Feb 2009
    Περιοχή
    Τριπολη
    Μηνύματα
    145

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από SavKok Εμφάνιση μηνυμάτων
    Απο το επισημο Site.


    Χμ.. λάθος εντύπωση είχα τελικά οκ θα το κοιτάξω Ευχαριστώ..

    0 Not allowed! Not allowed!

  6. #6
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Mε μια unsigned long μεταβλητη μπορεις να μετρησεις απο 0 εως 4294967295.Eαν πουμε οτι μετραει mSec τοτε μπορει να μετρησει μεχρι:

    2^32/ (1000*60*60*24) = 49.71 μέρες

    θα εχουμε δηλαδη: ..... 4294967293...4294967294...4294967295...0..1..2...3 κτλ κτλ

    Οποτε με κωδικα:

    unsigned long startTime = millis ();
    unsigned long interval = 60000; // 60 δευτερόλεπτα.

    ...

    if (millis () - startTime >= interval)
    {
    // do something
    }

    Aς πουμε οτι είμαστε 40 δευτερόλεπτα πριν ξαναγυρισει στο μηδέν, η τιμή του θα ειναι: 2^32 - 40000 = 4294927296 mSec



    Οποτε σε 50 δευερολεπτα (που μεσολαβει και ο μηδενισμος που σε ενοχλει) 8α εχεις:

    millis () - startTime = 10000 - 4294927296 = -4294917296


    Κανε τις πραξεις με την αριθμομηχανη και γυρνατο σε μορφη HEX:

    Untitled.png

    Σε νοιαζουν μονο τα bits που χωρανε στη μεταβλητη.Δηλαδη C350h = 50000dec


    Υ.Γ εαν εφυγε κανα bit δεν,μετα απο δουλεια..η λογικη δεν αλλαζει.

    1 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη SProg : 30-08-16 στις 20:07

  7. #7
    Μέλος
    Όνομα
    Νίκος
    Εγγραφή
    Feb 2014
    Περιοχή
    Μοσχάτο
    Μηνύματα
    607

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από SavKok Εμφάνιση μηνυμάτων
    Mε μια unsigned long μεταβλητη μπορεις να μετρησεις απο 0 εως 4294967295.Eαν πουμε οτι μετραει mSec τοτε μπορει να μετρησει μεχρι:

    2^32/ (1000*60*60*24) = 49.71 μέρες

    θα εχουμε δηλαδη: ..... 4294967293...4294967294...4294967295...0..1..2...3 κτλ κτλ

    Οποτε με κωδικα:




    Aς πουμε οτι είμαστε 40 δευτερόλεπτα πριν ξαναγυρισει στο μηδέν, η τιμή του θα ειναι: 2^32 - 40000 = 4294927296 mSec



    Οποτε σε 50 δευερολεπτα (που μεσολαβει και ο μηδενισμος που σε ενοχλει) 8α εχεις:

    millis () - startTime = 10000 - 4294927296 = -4294917296


    Κανε τις πραξεις με την αριθμομηχανη και γυρνατο σε μορφη HEX:

    Untitled.png

    Σε νοιαζουν μονο τα bits που χωρανε στη μεταβλητη.Δηλαδη C350h = 50000dec


    Υ.Γ εαν εφυγε κανα bit δεν,μετα απο δουλεια..η λογικη δεν αλλαζει.
    Ακριβώς αυτό εννοώ. Ακόμα και αν κάνει overflow η milis() δεν σε νοιάζει, αρκεί η όποια συνθήκη το εμπεριέχει να έχει την μορφή που λέει ο Σάββας. Δηλαδή να αφαιρείς απο την millis().

    Ετσι δεν χρειάζετε να ανησυχείς για το overflow, τα μαθηματικά βγαίνουν...

    0 Not allowed! Not allowed!

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

  1. 3d Print - έρευνα
    By Anastasios123D in forum Γενική Συζήτηση
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 25-02-15, 12:15
  2. Που θα βρώ Mini Print στην Αθήνα?
    By herctrap in forum Όργανα & Εξοπλισμός
    Απαντήσεις: 3
    Τελευταίο Μήνυμα: 12-01-12, 23:11
  3. Κώδικας Q
    By Giannis511 in forum Ραδιοερασιτεχνισμός
    Απαντήσεις: 13
    Τελευταίο Μήνυμα: 07-09-07, 23:23

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

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