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

Θέμα: Γιατι το watchdog κανει Restart τον Επεξεργαστη

  1. #1
    Μέλος Το avatar του χρήστη billtech
    Όνομα
    Βασιλης
    Εγγραφή
    Mar 2006
    Περιοχή
    Χανια και Κυπρο
    Μηνύματα
    2.221

    Προεπιλογή Γιατι το watchdog κανει Restart τον Επεξεργαστη

    καλημερα παιδια,
    Παλευω αυτες τις μερες ενα κωδικα για μια συσκευη μετρησης θερμοκρασιας η οποια θα εχει τροφοδοσια μπαταρια.
    Επειδη ομως ο επεξεργαστης και η οθονη(LCD 2x26) εχουν καποια καταναλωση και επειδη το κυκλωμα δεν ειναι κατι που πρεπει να τρεχει ασταματητα ο επεξεργαστης σκεφτηκα να τον "κοιμηζω" για λιγο και μετα απο καποιο χρονο να ξαναδιαβαζω την θερμοκρασια. Ετσι ειπα να γινει με το watchdog.
    Η γλωσσα που γραφω τον κωδικα ειναι η Mikrobasic Pro. Διαβασα μεσα στην Mikroe.com και σε αλλα projects οτι για να δουλεψει ο watchdog πρεπει να ρυθμισω τον Option_REG. Συγκεκριμενα τον εκανα 00001111. Ο επεξεργαστης μου ειναι ο PIC16F877A.
    Αλλα εχω ενα προβλημα. καθε που βγαινει ο επεξεργαστης απο Sleep κανει restart τον επεξεργαστη. Πραγμα που δεν θελω.
    εγω θελω να:
    διαβαζει θερμοκρασια
    να την εμφανιζει
    να κοιματε
    να ξυπνα
    και να ξανακανει την ιδια διαδικασια.
    Χωρις να κανει επανεκκινηση του επεξεργαστη.

    τι φταει ομως και το κανει αυτο?

    0 Not allowed! Not allowed!
    Η γυναίκα και τα ηλεκτρονικά θέλουν γείωση!!!

  2. #2
    Μέλος
    Όνομα
    Γιώργος
    Εγγραφή
    Feb 2010
    Περιοχή
    Αθήνα
    Μηνύματα
    4.618

    Προεπιλογή

    Δουλειά του WDT είναι να κάνει reset!
    Εσύ θα γράψεις το πρόγραμμά σου βάζοντας κάπου το SLEEP και αμέσως μετά μια εντολή NOP (για άλλους λόγους). Οταν θα γίνει reset το πρόγραμμα θα ξεκινήσει από την αρχή αλλά το /TO bit στο STATUS register θα είναι LOW δείχνοντάς σου ότι πρόκειται για "watchdog TimeOut". Θα ελέγξεις ότι έγινε LOW και θα στείλεις το πρόγραμμα στο σωστό σημείο (χωρίς αρχικοποίηση όλων των δεδομένων).

    Για περισσότερα διάβασε το: http://ww1.microchip.com/downloads/e...Doc/31026a.pdf

    0 Not allowed! Not allowed!

  3. Ένα μέλος ευχαρίστησε τον GeorgeVita για αυτό το χρήσιμο μήνυμα:

    manolena (28-11-12)

  4. #3
    Μέλος Το avatar του χρήστη billtech
    Όνομα
    Βασιλης
    Εγγραφή
    Mar 2006
    Περιοχή
    Χανια και Κυπρο
    Μηνύματα
    2.221

    Προεπιλογή

    Γιωργο το διαβασα το PDF απο χτες.
    δηλαδη δεν μπορω να επανερχομαι απο sleep χωρις να κανει επανεκκινηση ο επεξεργαστης και χωρις να ξανασαρωνει την οθονη να γραψει τα παντα? απλα να την ενημερωνει?
    επισης ποσο καλο ειναι για τον επεξεργαστη τοτε να κανει συνεχεια επανεκκινησεις?
    Απο οσο διαβασα ως τωρα δεν ειναι απαραιτητο να κανει επανεκκινηση η συσκευη αμα γεμισει ο Watchdog.
    Δηλαδη καθε φορα που θα τελειωνει θα μου σαρωνει την οθονη και θα γραφει τα εισαγωγικα γραμματα και ολα αυτα?

    0 Not allowed! Not allowed!
    Η γυναίκα και τα ηλεκτρονικά θέλουν γείωση!!!

  5. #4
    Μέλος Το avatar του χρήστη tasosmos
    Όνομα
    Τάσος
    Εγγραφή
    Jul 2005
    Περιοχή
    Αθήνα
    Μηνύματα
    3.057

    Προεπιλογή

    Μπορεις να χρησιμοποιησεις εναν απλο timer για να επανερχεται απο sleep mode αντι για τον wdt. Δεν ξερω αν υπαρχουν "βαθυτερα" sleep modes στους pic που να απενεργοποιουν το clock στα περιφερειακα αλλα συμφωνα με το παραπανω εγγραφο υποστηριζεται ξυπνημα απο τον timer1 σε αυτο το mode.

    0 Not allowed! Not allowed!

  6. #5
    Μέλος Το avatar του χρήστη bchris
    Όνομα
    Χρηστος
    Εγγραφή
    Nov 2011
    Περιοχή
    Lugano
    Μηνύματα
    2.104

    Προεπιλογή

    Η δουλεια του WDT ναι κανει reset τον επεξεργαστη, στην περιπτωση που αυτος εχει κολλησει, ή το firmware εχει πεσει σε κανα ατερμονο loop.

    Δεν ειναι για τιποτα αλλο.
    Διαβασε το document που σου ειπε ο Γιωργος

    0 Not allowed! Not allowed!

  7. #6
    Μέλος Το avatar του χρήστη billtech
    Όνομα
    Βασιλης
    Εγγραφή
    Mar 2006
    Περιοχή
    Χανια και Κυπρο
    Μηνύματα
    2.221

    Προεπιλογή

    καπου μεσα στο PDF λεει αυτο:
    The TO and PD bits in the STATUS register can be
    used to determine the cause of device reset

    αν και δεν καταλαβα πως το εννοεις νομιζω ειναι αυτα τα δυο bit υπευθυνα για τα reset.σωστα? αλλα δεν λεει κατι πως να λυσω αυτο το προβλημα

    0 Not allowed! Not allowed!
    Η γυναίκα και τα ηλεκτρονικά θέλουν γείωση!!!

  8. #7
    Μέλος Το avatar του χρήστη bchris
    Όνομα
    Χρηστος
    Εγγραφή
    Nov 2011
    Περιοχή
    Lugano
    Μηνύματα
    2.104

    Προεπιλογή

    Αυτο που λεει το παραπανω ειναι οτι διαβαζοντας τα δυο αυτα bits μετα το reset, μπορεις να διευκρινησεις τον λογο για τον οποιον εγινε reset ο επεξεργαστης (και αναλογως να πραξεις...)

    Δεν ειναι αυτα υπευθυνα για το reset (με την εννοια οτι δεν το προκαλουν αυτα).

    ΥΓ:
    Εχεις δικιο, τελικα ο WDT μπορει να χρησιμοποιηθει και για να ξυπναει τον επεξεργαστη.

    Γισ ανεβασε τον κωδικα μπας και πιασει κατι το ματι μας που σου ξεφυγε

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη bchris : 28-11-12 στις 13:55

  9. #8
    Μέλος
    Όνομα
    Γιώργος
    Εγγραφή
    Feb 2010
    Περιοχή
    Αθήνα
    Μηνύματα
    4.618

    Προεπιλογή

    Ισχύουν όλα όσα γράφονται παραπάνω!
    Ο μC κάνει reset από κάποια αιτία (power on, WDT, μπέρδεμα στο πρόγραμμα, Brown Out Detect) και εμείς ελέγχοντας τα κατάλληλα bit στο STATUS register, μπορούμε να καταλάβουμε που οφείλεται το reset και να αλλάξουμε τη ροή του προγράμματος σύμφωνα με την ανάγκη μας.
    Συνήθως για SLEEP/WAKE UP χρησιμοποιούμε κάποιο timer, επειδή ανέφερες το WDT (timer και αυτό), έγραψα για τα STATUS bits.

    Στη χρήση WDT & εντολής SLEEP, ο χρόνος "ξυπνήματος" έχει μικρή ακρίβεια (όση το WDT) αλλά ρυθμίζεται εύκολα με το WDT prescaler για 1-2sec. Οι εντολές ελέγχου και αλλαγής ροής προγράμματος θα είναι στην αρχή του προγράμματος, δηλαδή πριν αρχίσεις τα "register/display initialization". Φαντάσου το σαν πρώτη εντολή να ελέγχεις το:
    Κώδικας:
    0000       goto     Start        ; reset vector, addr=0x0000
    ...
    ...
    Start      btfss    STATUS,TO
               goto     wasSLEEP
               clrf     Therm_1      ; classical "start" of program (after power on)
               clrf     Therm_2
               clrf     DispMode
    ...
    ...
    wasSLEEP   goto     getTEMPERATURE
    ...
    Στην περίπτωση του TIMER, πρέπει να ενεργοποιήσεις τα interrupts και τα flags του timer, όπως και να ρυθμίσεις/υπολογίσεις το χρόνο που θα κάνει overflow. Το πρόγραμμα θα συνεχίζει από εκεί που σταμάτησε, πάντα βάζεις ένα NOP μετά το SLEEP.
    Οι "πηγές" ξυπνήματος είναι πάρα πολλές, λ.χ. wake up on pin change.

    Ενα reset την ... ημέρα κάνει το debugging πέρα!
    (δηλαδή αν σχεδιάσεις το πρόγραμμα με βάση το reset, μπορείς να στείλεις την πλακέτα σου και στο διάστημα!)

    0 Not allowed! Not allowed!

  10. #9
    Μέλος Το avatar του χρήστη billtech
    Όνομα
    Βασιλης
    Εγγραφή
    Mar 2006
    Περιοχή
    Χανια και Κυπρο
    Μηνύματα
    2.221

    Προεπιλογή

    ο κωδικας που εκανα ειναι ο παρακατω:
    Κώδικας:
    main:
    '   Main program 
          ADCON1 = 0x06
          CMCON=7
          TRISC = 0x00
          TRISD = 0xFF   'EISODOI
          PORTC = 0x00   'EXODOI
          PORTC = 0x00
    
          LCD_init
          LCD_Cmd(_LCD_CLEAR)
          LCD_Cmd(_LCD_CURSOR_OFF)
    
          Option_Reg=$0F
          
          asm
    '         CLRWDT
             sleep
          end asm
    
    while 1
          Read_Temperature(PORTD,0)   
          Display(0)                  
          Read_Temperature(PORTD,1)   
          Display(1)                  
          Delay_ms(800)
          
    asm
             sleep
             'CLRWDT
          end asm
    wend
    Αυτος ο κωδικας δειχνει οτι δουλευει. Αλλα δεν ειμαι τοσο σιγουρος.
    δλδ οτι αλλαγη παω και κανω μεσα στα κομματια που asm -- end asm τοτε ξεκινα τα restart. Και αυτο ειναι που με σκαει. αν σβησω το κομματι
    asm
    ' CLRWDT
    sleep
    end asm

    που ειναι πριν το while().

    που αυτο το ειχα βαλει στην αρχη απλα για δοκιμη. αμα το αφαιρεσω δεν δουλευει και κανει επανεκκινησεις. Οπως ειναι τωρα δειχνει να δουλευει. Αλλα μαλλον απλα δουλευει λογω τυχης τωρα.
    Δεν μπορει να μην δουλευει χωρις επανεκκινησεις.

    0 Not allowed! Not allowed!
    Η γυναίκα και τα ηλεκτρονικά θέλουν γείωση!!!

  11. #10
    Μέλος Το avatar του χρήστη bchris
    Όνομα
    Χρηστος
    Εγγραφή
    Nov 2011
    Περιοχή
    Lugano
    Μηνύματα
    2.104

    Προεπιλογή

    Νομιζω οτι το προβλημα σου ειναι στο πως διαχειριζεται η basic το asm κομματι.
    Κοιτα αυτο:
    Κώδικας:
    When the SLEEP instruction is being executed, the next instruction (PC + 1) is pre-fetched. 
    For the device to wake-up through an interrupt event, the corresponding interrupt enable bit must be
    set (enabled). 
    Wake-up is regardless of the state of the GIE bit. 
    If the GIE bit is clear (disabled), the device continues execution at the instruction after the SLEEP instruction. 
    If the GIE bit is set (enabled), the device executes the instruction after the SLEEP instruction and then branches to the interrupt address (0004h). 
    In cases where the execution of the instruction following SLEEP is not desirable, the user should have an NOP after the SLEEP instruction.
    Δοκιμασε να το γραψεις σε assembly, ή προσπαθησε να διαχειριστεις την κατασταση μεσα απο την basic.

    0 Not allowed! Not allowed!

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

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

  1. Γιατι να ασχοληθει καποιος με τον Ρ/Ε
    By xqtr in forum Ραδιοερασιτεχνισμός
    Απαντήσεις: 18
    Τελευταίο Μήνυμα: 21-04-14, 10:00
  2. Απαντήσεις: 1
    Τελευταίο Μήνυμα: 16-05-13, 15:55
  3. Απαντήσεις: 3
    Τελευταίο Μήνυμα: 04-06-12, 13:24
  4. Απαντήσεις: 10
    Τελευταίο Μήνυμα: 23-01-12, 13:27
  5. Απαντήσεις: 18
    Τελευταίο Μήνυμα: 25-09-11, 18:19

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

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