Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 13

Θέμα: Ενεργοποίηση DTR/RESET μέσω software σε ATMega328

  1. #1
    Μέλος Το avatar του χρήστη nanobot
    Όνομα
    Χρήστος
    Εγγραφή
    Dec 2015
    Περιοχή
    Λαμία
    Μηνύματα
    41

    Προεπιλογή Ενεργοποίηση DTR/RESET μέσω software σε ATMega328

    Φτιάχνω ένα project χρησιμοποιώντας τον mcu atmega328 (arduino) που για προγραμματισμό τον έχω συνδέσειμε έναν USB TTL UART controller CP2102 και το συνδέω όπως μπορείτε να δείτε στο breadboard παρακάτω:

    ATMega328_USB_TTL_DTR.jpg

    Το πρόβλημα γενικός με τον atmega328 (που παρουσιάζετε και σε όλα τα arduino boards) είναι ότι όποτε και να πάρει σήμα από HIGH σε LOW/HIGH το reset pin από το DTR (Data Terminal Ready) του USB controller, τότε ο MCU κάνει reset, συμπεριφορά που δεν είναι επιθυμητή για ολοκληρωμένα project που τροφοδοτούνται από USB θύρα ηλεκτρονικού υπολογιστή. Αυτή η κατάσταση μπορεί να συμβεί κατά την ενεργοποίηση/επανεκκίνηση του υπολογιστή, κατά την σύνδεση με την συριακή θύρα, ακόμα και με το serial monitor του arduino, και γενικώς οποιαδήποτε εφαρμογή προσπαθήσει να κάνει σύνδεση με την συριακή και ενεργοποιήσει το DTR. Σε μερικά φόρουμ γράφουν ότι το κάνει μόνο σε Mac και Linux, κάτι που όμως δεν ισχύει. Αυτό εξαρτάτε καθαρά από το state που έχει το DTR στην συριακή θύρα, κάτι που μπορεί να αλλάξει με πολλούς τρόπους και τίποτα δεν εγγυάται ότι το DTR δεν θα στέλνει σήμα.


    Για να λύσω αυτό το πρόβλημα σε project που όταν ολοκληρωθεί θα τροφοδοτείτε από την θύρα USB του υπολογιστή μέσω του USB controller, έχω τοποθετήσει έναν διπλό διακόπτη που θα παίζει τον ρόλο του programmer, δηλαδή με κλειστό κύκλωμα στον διακόπτη, συνδέουμε το DTR στο reset pin με το ένα κανάλι του διακόπτη, και με το άλλο κανάλι το LED που έχουμε στο pin13 για την ένδειξη ότι είναι σε κατάσταση programmable, η οποία μέθοδος δουλεύει πολύ καλά με χειροκίνητο διακόπτη.


    Και ρωτάω το εξής.
    Είναι δυνατών να έχω software switch χρησιμοποιώντας digital pin του MCU για να ενεργοποιώ και να απενεργοποιώ το DTR του USB controller προς το reset pin και να έχω programmable mode που να το ενεργοποιώ από το πρόγραμμα με digital pin;


    Το DTR ενεργό στέλνει συνέχεια 3.3V μέχρι να πάρει σήμα LOW και να αρχίσει ο MCU να διαβάζει τα data που είναι να γράψει στο μνήμη για το καινούργιο πρόγραμμα. Τα pin του MCU είναι 5V στο HIGH.

    Το σημα του DTR για να κανει reset:
    dtr_signal.jpg

    Το έψαξα αρκετά και δεν έχω βρει κάτι. Δοκίμασα να το κάνω με NPN τρανζίστορ και το digital pin στο base και το DTR στο collector και το reset στο emitter, αλλά δεν δουλεύει γιατί όταν κάνει reset ο MCU το digital pin γίνετε LOW και το DTR αποσυνδέετε χωρίς να προλάβει να ολοκληρώσει το σήμα. Σκέφτηκα να δοκιμάσω με PNP transistor, αλλά διάβασα ότι η τάση πρέπει να είναι η ιδιά και στο base και στο collector, πράγμα που δεν ισχύει στη συγκεκριμένη περίπτωση.
    Όλα αυτά με τα transistor τα σκέφτηκα εγώ διαβάζοντας για transistor switches, και δεν ξέρω κατά ποσό ισχύουν!
    Θεωρητικά με PNP transistor θα μπορούσε να γίνει κάτι τέτοιο;
    Προσπαθώ να βρω κάποιον τρόπο, αλλά οι γνώσεις μου δεν επαρκούν.

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη nanobot : 04-09-16 στις 17:48
    There are two rules for success:
    1) Never tell everything you know.

    Workstation: Xeon E5-2620V3 X2 | Asus Z10PE-D8 WS | Samsung 32GB 2133MHz X2 | Samsung 950 Pro 512GB M.2 | Asus GTX1080 8GB | EVGA Supernova P2 PSU 1600W

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

    Προεπιλογή

    Μια NAND.


    Θα φτανει σημα '0' στο Reset μόνο οταν και το DTR και ο διακοπτης δινουν '0'.


    Δεν χρειαζεσαι καν Pin απο την MCU.Aλλα εαν θελεις,τοτε η λογικη ειναι η ιδια.Απλα θα πρεπει να βεβαιωθεις οτι δεν θα αφηνεις ποτε Float ειδοδους.

    0 Not allowed! Not allowed!

  3. #3
    Μέλος Το avatar του χρήστη nanobot
    Όνομα
    Χρήστος
    Εγγραφή
    Dec 2015
    Περιοχή
    Λαμία
    Μηνύματα
    41

    Προεπιλογή

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


    Θα φτανει σημα '0' στο Reset μόνο οταν και το DTR και ο διακοπτης δινουν '0'.


    Δεν χρειαζεσαι καν Pin απο την MCU.Aλλα εαν θελεις,τοτε η λογικη ειναι η ιδια.Απλα θα πρεπει να βεβαιωθεις οτι δεν θα αφηνεις ποτε Float ειδοδους.

    Ευχαριστώ για την απάντηση Σάββα.

    Θέλω να μπορώ να ενεργοποιήσω και να απενεργοποιήσω το DTR προς το reset με κώδικα (όχι με χειροκίνητο διακόπτη όπως το έχω τώρα) και φαντάζομαι για να καταφέρω κάτι τέτοιο θα χρειαστώ κάποιο σήμα στο κύκλωμα, σήμα που θα δώσω από κάποιο pin. Και μιας και κατά το reset, όλα τα pins πάνε στο LOW, επιλεγώ με HIGH να είναι ανενεργό και με LOW ενεργό. Δες το παρακάτω ενδεικτικό πρόγραμμα για ένα software enable/disable μέσω serial input:

    Κώδικας:
    #define PIN_DTR_SWITCH 9
    
    String serialInput;
    bool dtrEnable = false;
    
    
    void setDtrState(bool state /* true = dtr enabled, false = dtr disabled */);
    
    
    void setup() {
      Serial.begin(9600);
      pinMode(PIN_DTR_SWITCH, OUTPUT);
      setDtrState(false);
    }
    
    
    void loop() {
      if(Serial.available()) {
        serialInput = Serial.readString();
        serialInput.trim();
        
        Serial.println("Input: " + serialInput);
    
    
        if(serialInput.equalsIgnoreCase("on"))
          setDtrState(true);
        else if(serialInput.equalsIgnoreCase("off"))
          setDtrState(false);
      }
    }
    
    
    void setDtrState(bool state /* true = dtr enabled, false = dtr disabled */) {
      dtrEnable = state;
      digitalWrite(PIN_DTR_SWITCH, state ? LOW : HIGH); // HIGH = dtr disable, LOW = dtr enable
      Serial.println(state ? "DTR is now enabled" : "DTR is now disabled");
    }
    Και εδώ η ενδεικτική είσοδος στο serial monitor:

    DTR_SerialInput_Enable.png

    Δίνοντας τη λέξη "on"€ κάνουμε το digital pin LOW και το DTR πάει στο reset.
    Δίνοντας τη λέξη "€œoff"€ κάνουμε το digital pin HIGH και το DTR κόβεται από το reset.

    Θεωρητικά μια NAND είναι ακριβώς αυτό που χρειάζομαι!

    log45.gif

    Δηλαδή, όταν το digital pin θα είναι HIGH (1) και το DTR θα είναι ενεργό (1), τότε το αποτέλεσμα θα είναι 0 (false) και το reset θα είναι απενεργοποιημένο, σε κάθε άλλη περίπτωση θα είναι ενεργοποιημένο.
    Το θέμα είναι αν στην πράξη γίνετε να δουλέψει κάτι τέτοιο στη συγκεκριμένη περίπτωση και πως ακριβώς θα το εφαρμόσω στο κύκλωμα.
    Θα κάνω μερικές δοκιμές δημιουργώντας μια NAND με 2 NPN transistors να δω πως θα συμπεριφερθεί το σήμα του DTR.

    0 Not allowed! Not allowed!
    There are two rules for success:
    1) Never tell everything you know.

    Workstation: Xeon E5-2620V3 X2 | Asus Z10PE-D8 WS | Samsung 32GB 2133MHz X2 | Samsung 950 Pro 512GB M.2 | Asus GTX1080 8GB | EVGA Supernova P2 PSU 1600W

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

    Προεπιλογή

    Το προβλημα των Float pin κατα το reset , το αντιμετωπιζεις με αντιστασεις προσδεσης.

    0 Not allowed! Not allowed!

  5. #5
    Μέλος Το avatar του χρήστη plouf
    Όνομα
    Χρήστος
    Εγγραφή
    Mar 2005
    Περιοχή
    Ιλιον,Αθήνα
    Μηνύματα
    2.103

    Προεπιλογή

    εφόσον το project σου ειναι τελειωμενο γιατι δεν απενεργοποιειες το ρεσετ ? με την ασφαλεια (fusebit) RSTDISBL

    λογικά βεβαια δεν θα μπορεις να ξαναπρογραματισεις τιν Mega328 μετα, παρα μόνο με HIghVoltage προγραμματισμο

    0 Not allowed! Not allowed!
    ​Χρήστος

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

    Προεπιλογή

    Διαβασε το πρωτο Post ολοκληρο...

    0 Not allowed! Not allowed!

  7. #7
    Μέλος Το avatar του χρήστη plouf
    Όνομα
    Χρήστος
    Εγγραφή
    Mar 2005
    Περιοχή
    Ιλιον,Αθήνα
    Μηνύματα
    2.103

    Προεπιλογή

    ψαχνει τρόπο να απενεργοποιησει την ανεπιθυμητη συμπεριφορα στο PC, αν όμως ΔΕΝ τον επηρεαζει λογο απενεργοποιημένου RESET τότε πιθανολογο να μην μας ενδιαφέρει η συμπεριφορα στο PC

    0 Not allowed! Not allowed!
    ​Χρήστος

  8. #8
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    To πρόβλημα με τα μοντουλάκια CP2102 για το σειριακό προγραμματισμό arduino μέσω USB, είναι γνωστό εδώ και αρκετό καιρό. Εντοπίζεται στο οτι μ/Ε φορτωμένοι με bootloader δεν μπορούν να συγχρονιστούν με το
    σήμα DTR που χρειάζεται ο arduino για να ξεκινήσει η σειριακή εγγραφή, γιατί απλά τα βασισμένα σε CP2102 modules (όχι τα τσιπάκια) δεν έχουν τέτοιο σήμα!
    Για να γίνουν λειτουργικά είναι μεγάλος μπελάς, διότι πρέπει να επεμβεί κάποιος με χειρουργικές ικανότητες και να κάνει κάποιες αλλαγές και κολλήματα σε package QFN.

    Υπάρχει ένα σχετικό και ενδιαφέρον άρθρο εδώ:

    http://www.kerrywong.com/2014/05/03/...no-programmer/

    Συμπέρασμα: Μην αγοράζετε σειριακούς προσαρμογείς βασισμένους στο CP2102!!! Κοιτάξτε πριν την αγορά σας, να είναι βασισμένοι στο FT232 της FTDI για να έχετε το κεφάλι σας ήσυχο!

    Υ.Γ.: Όταν διάβασα το modification, πήρα αυτό το μλκσμένο μοντουλάκι και το έκανα φλούδα με τη βαριοπούλα στη δουλειά.

    0 Not allowed! Not allowed!

  9. #9
    Μέλος Το avatar του χρήστη nanobot
    Όνομα
    Χρήστος
    Εγγραφή
    Dec 2015
    Περιοχή
    Λαμία
    Μηνύματα
    41

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από SavKok Εμφάνιση μηνυμάτων
    Το προβλημα των Float pin κατα το reset , το αντιμετωπιζεις με αντιστασεις προσδεσης.
    Πώς να το ψάξω στα αγγλικά αυτό για να δω πως δουλεύει κάτι τέτοιο και θεωρητικά και πρακτικά;

    Παράθεση Αρχικό μήνυμα από plouf Εμφάνιση μηνυμάτων
    εφόσον το project σου ειναι τελειωμενο γιατι δεν απενεργοποιειες το ρεσετ ? με την ασφαλεια (fusebit) RSTDISBL

    λογικά βεβαια δεν θα μπορεις να ξαναπρογραματισεις τιν Mega328 μετα, παρα μόνο με HIghVoltage προγραμματισμο
    Χρηστό σε ευχαριστώ για την απάντηση.

    Τα έχω δει τα fusebits και το σκεφτικά να το κάνω έτσι, αλλά το πρόβλημα είναι ότι θέλω η τελική συσκευή να μπορεί να είναι programmable χωρίς να χρειάζεται η διαδικασία της ενεργοποίησης του RSTDISBL flag. Φαντάσου μια συσκευή που τρέχει για αρκετό καιρό και κάποια στιγμή χρειαστεί να προσθέσουμε μια καινούργια λειτουργία ή εντοπίσαμε μια δυσλειτουργία και θέλουμε να την διορθώσουμε με νέο πρόγραμμα. Στην περίπτωση μου θα κάνω upload το νέο πρόγραμμα γυρνώντας το διακόπτη στην θέση programmable που θα συνδέει το DTR στο reset pin (πράγμα που και πρακτικό είναι, και το πρόβλημα λύνει και γενικώς δουλεύει πολύ καλά), αλλά θα ήθελα αυτή τι λειτουργία να την ελέγχω μέσω κώδικα χωρίς καθόλου διακόπτη, δηλαδή μέσω μιας συνθήκης στον κώδικα να ορίζω αν ο mcu παίρνει το DTR και είναι πλέων σε θέση να κάνει upload.

    Παράθεση Αρχικό μήνυμα από manolena Εμφάνιση μηνυμάτων
    To πρόβλημα με τα μοντουλάκια CP2102 για το σειριακό προγραμματισμό arduino μέσω USB, είναι γνωστό εδώ και αρκετό καιρό. Εντοπίζεται στο οτι μ/Ε φορτωμένοι με bootloader δεν μπορούν να συγχρονιστούν με το
    σήμα DTR που χρειάζεται ο arduino για να ξεκινήσει η σειριακή εγγραφή, γιατί απλά τα βασισμένα σε CP2102 modules (όχι τα τσιπάκια) δεν έχουν τέτοιο σήμα!
    Για να γίνουν λειτουργικά είναι μεγάλος μπελάς, διότι πρέπει να επεμβεί κάποιος με χειρουργικές ικανότητες και να κάνει κάποιες αλλαγές και κολλήματα σε package QFN.

    Υπάρχει ένα σχετικό και ενδιαφέρον άρθρο εδώ:

    http://www.kerrywong.com/2014/05/03/...no-programmer/

    Συμπέρασμα: Μην αγοράζετε σειριακούς προσαρμογείς βασισμένους στο CP2102!!! Κοιτάξτε πριν την αγορά σας, να είναι βασισμένοι στο FT232 της FTDI για να έχετε το κεφάλι σας ήσυχο!
    Μάνος σε ευχαριστώ για την απάντηση.

    Υπάρχουν και USB modules CP2102 που έχουν κανονικά το DTR συνδεδεμένο σε pin όπως αυτό που χρησιμοποιώ εγώ και είναι αυτό εδώ:

    cp2102-usb-serial.jpg

    Στο ebay από Κίνα:
    http://www.ebay.ie/itm/141685498714?...53.m2749.l2649

    Εσύ μιλάς για τα πολύ φθηνά κινέζικα που δεν έχουν καθόλου συνδεδεμένο το DTR από το τζιπάκι και για να το συνδέσω μου βγήκαν τα ματιά με το κολλητήρι και πολύ λεπτό καλώδιο!

    USV_CP2102_no_dtr.jpg

    Για να κάνεις upload με αυτά τα modules χωρίς DTR, πρέπει να έχεις το reset πατημένο πριν ξεκινήσεις το upload και όταν φτάσει να ανοίξει την COM για να γράψει το πρόγραμμα το αφήνεις!
    Το γνωρίζω το πρόβλημα αυτό, αλλά δεν έχει κάποια σχέση με αυτό που θέλω να κάνω.

    0 Not allowed! Not allowed!
    There are two rules for success:
    1) Never tell everything you know.

    Workstation: Xeon E5-2620V3 X2 | Asus Z10PE-D8 WS | Samsung 32GB 2133MHz X2 | Samsung 950 Pro 512GB M.2 | Asus GTX1080 8GB | EVGA Supernova P2 PSU 1600W

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

    Προεπιλογή

    Χρηστο ειναι απλο.Εαν το δεις σχεδιασμενο θα το καταλαβεις.

    Θα το κανω οταν σχολασω.

    0 Not allowed! Not allowed!

Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία

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

  1. Απαντήσεις: 4
    Τελευταίο Μήνυμα: 26-04-17, 23:15
  2. Αποστολή δεδομένων σε ATMEGA328 (FRAM)
    By acmilangr in forum Μικροελεγκτές
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 20-07-13, 21:25
  3. RS485 με ATMEGA328
    By acmilangr in forum Μικροελεγκτές
    Απαντήσεις: 15
    Τελευταίο Μήνυμα: 27-11-11, 15:53
  4. μΕ atmega328
    By gsouf in forum Μικροελεγκτές
    Απαντήσεις: 3
    Τελευταίο Μήνυμα: 09-12-10, 22:27
  5. ATMEGA328
    By andreas222 in forum Μικροελεγκτές
    Απαντήσεις: 9
    Τελευταίο Μήνυμα: 16-11-10, 19:12

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

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