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

Θέμα: count external interrupt dspic 30f

  1. #1
    Μέλος Το avatar του χρήστη nio-4-
    Όνομα
    Γιάννης
    Εγγραφή
    Feb 2008
    Περιοχή
    Σέρρες
    Μηνύματα
    1.277

    Προεπιλογή count external interrupt dspic 30f

    Καλησπερα σε ολους,

    Συγγνωμη για την αγγλικη ονομασία του θεματος αλλα ειναι αμεσα κατανοητο...

    θελω να μετρησω παλμους μεσω Optocoupler 4,75v/2ms περιπου... Το προβλημα ειναι με τον κωδικα. Πως μπορω να μετρησω σε βαθος χρονου τους παλμους? π.χ. σε 500ms??

    παραθετω ενα κομματι κωδικα..την ειδικη συναρτηση. Μετα ως καθολικη μεταβλητη την διαβαζω στην main() αλλαααααα.......δεν μπορω να την μετρησω. οποιος θελει ας γραψει καποιο κομματι...

    Κώδικας:
    void __attribute__((__interrupt__ auto_psv)) _INT1Interrupt(void)
        {
            Count++;
            
            _INT1IF = 0;
        }
    Κώδικας:
    int main(){
    
    .
    .
    .
     _INT1IF = 1;
                //__delay32(15000000);
                
                
                for(d=0; d<10000000; d++)
                {
                    
                }
                _INT1IF = 0;
                gotoXY(42,4);
                sprintf(numstrd, "%d",Count);
                LCDString(numstrd);
                __delay32(15000000);
                
    .
    
    .

    0 Not allowed! Not allowed!

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

    Προεπιλογή

    Δεν εχει σχολια στον κωδικα και εαν καποιος δεν εχει ασχοληθει με dsPIC αντε να βγαλει ακρη.

    - Πως εχεις δηλωσει την μεταβλητη Count;
    - Εχεις δοκιμασει την εξωτερικη διακοπη και λειτουργει σωστα;
    - Το delay σου ειναι οντως 500mSec;
    - Οταν λες δε μπορεις να την μετρησεις..δε μπορεις να την μετρησεις ή δε μπορεις να την εμφανισεις σωστα;
    - Δεν μετρας σε βαθο χρονου με delay(), ειδικα οταν μετρας εξωτερικους παλμους.Θες 2ο Timer.

    1 Not allowed! Not allowed!

  3. #3
    Μέλος Το avatar του χρήστη picdev
    Όνομα
    akis
    Εγγραφή
    Jul 2007
    Περιοχή
    ____
    Μηνύματα
    7.381

    Προεπιλογή

    γιατί δεν το κάνεις με κάποιον counter , να μετράει μόνος του και μόλις γίνει overflow να κρατάς αυτό που μέτρησες ?

    1 Not allowed! Not allowed!

  4. #4
    Μέλος
    Όνομα
    Καλαρακης Μιχαλης
    Εγγραφή
    Jan 2011
    Περιοχή
    Ηρακλειο
    Μηνύματα
    2.043

    Προεπιλογή

    Υποχρεωτικα 2ο timer για να κρατα το χρο ο που θελεις να μετρησεις ποσοι παλμοι ερχονται πχ στα 500ms. Με τη λυξη του timef διαβαζεις το count.

    0 Not allowed! Not allowed!

  5. #5
    Μέλος Το avatar του χρήστη nio-4-
    Όνομα
    Γιάννης
    Εγγραφή
    Feb 2008
    Περιοχή
    Σέρρες
    Μηνύματα
    1.277

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από SavKok Εμφάνιση μηνυμάτων
    Δεν εχει σχολια στον κωδικα και εαν καποιος δεν εχει ασχοληθει με dsPIC αντε να βγαλει ακρη.

    - Πως εχεις δηλωσει την μεταβλητη Count;
    - Εχεις δοκιμασει την εξωτερικη διακοπη και λειτουργει σωστα;
    - Το delay σου ειναι οντως 500mSec;
    - Οταν λες δε μπορεις να την μετρησεις..δε μπορεις να την μετρησεις ή δε μπορεις να την εμφανισεις σωστα;
    - Δεν μετρας σε βαθο χρονου με delay(), ειδικα οταν μετρας εξωτερικους παλμους.Θες 2ο Timer.

    - int count
    - το delay λειτουργει σωστα γιατι ειναι προτυπη συναρτηση του xc16 compiler ( __delay32(ms) )
    - δεν μπορει ο count να φορτωσει τιμες γιατι κατι παιζει με τις παλιοσυναρτησεις ISR ρουτινες ...
    void __attribute__((__interrupt__ auto_psv)) _INT1Interrupt(void)

    γιατι σταματαν το προγραμμα αυτοματα αλλα αν την απενεργποιησω με το
    _INT1IF = 0;

    δεν παιρνω τιμες....
    κατι λαθος κανω...

    - μπορεις να μου γραψεις καποιο παραδειγμμα η παραπομπη λινκ... για αυτο που ΄λες μς δευτερο τιμερ??? και εγω αυτο φανταστηκα αλλα εχω μεσανυχτα με τιμερ

    0 Not allowed! Not allowed!

  6. #6
    Μέλος Το avatar του χρήστη picdev
    Όνομα
    akis
    Εγγραφή
    Jul 2007
    Περιοχή
    ____
    Μηνύματα
    7.381

    Προεπιλογή

    Όλα μαζί δεν γίνονται μάθε για αρχή να δουλεύεις timer Kai interrupt.
    Δηλαδή κάθε 500msec να έχεις ενa interrupt . Βάλε ένα λεντάκι να αναβοσβηνει και μέτρα το χρόνο με το παλμογραφο να δεις αν το πετυχες.
    Υπάρχουν πολλά tutorial για τους timer

    Sent from my Redmi 4 using Tapatalk

    0 Not allowed! Not allowed!

  7. #7
    Μέλος Το avatar του χρήστη Fire Doger
    Όνομα
    Στέφανος
    Εγγραφή
    Jan 2015
    Περιοχή
    .
    Μηνύματα
    1.519

    Προεπιλογή

    Θέλεις 2 μεταβλητές. Μια είναι το τελικό αποτέλεσμα που θα ενημερώνεται κάθε 500ms μέσω Timer ISR.
    Η άλλη θα είναι ο μετρητής που θα αυξάνεται κάθε 1 external interrupt.
    Όταν στην Main θα κάνεις refresh την οθόνη θα πάρεις την τιμή της πρώτης μεταβλητής, χωρίς delay, την καταμέτρηση θα την κάνει ασύγχρονα .

    Επίσης η _INT1F είναι το bit/flag στον IFS1 που σηκώνεται όταν υπάρχει interrupt και κατεβαίνει όταν βγαίνει από το ISR. (Λογικά, δεν νομίζω να πρέπει να το κατεβάζεις χειροκίνητα...)
    IFS0<15:0>, IFS1<15:0>, IFS2<15:0>All interrupt request flags are maintained in these three registers. The flags are set by their respective peripherals or external signals, and they are cleared via software.
    All interrupt event flags are sampled in the beginning of each instruction cycle by the IFSx registers. A pending interrupt request (IRQ) is indicated by the flag bit being equal to a ‘1’ in an IFSx register.
    Άρα αυτό που κάνεις είναι να τριγκάρεις ένα interrupt χειροκίνητα (εάν σου το επιτρέπει, πχ στους AVR γράφοντας 1 το κάνει 0 και γράφοντας 0 δεν κάνει τίποτα)
    Δεν υπάρχει ο κώδικας ρύθμισης external interrupt. Επίσης το pin ίσως έχει κάποια άλλη λειτουργία που πρέπει να απενεργοποιήσεις πρώτα.

    0 Not allowed! Not allowed!

  8. #8
    Μέλος Το avatar του χρήστη nio-4-
    Όνομα
    Γιάννης
    Εγγραφή
    Feb 2008
    Περιοχή
    Σέρρες
    Μηνύματα
    1.277

    Προεπιλογή

    Ευχαριστω Μιχαλη,


    Μηπως μπορουμε να εχουμε κανενα παραδειγμα?????

    0 Not allowed! Not allowed!

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

    Προεπιλογή

    Σαν λογικη δες το, δεν εχω ασχοληθει με dsPIC. Για παραδειγμα:

    Κώδικας:
    external_ISR // Σε καθε παρυφη παλμου
    {
      count++;
    }
    
    timer_ISR // Καθε 500mSec
    {
      measure = count; // Αποθηκευσε τη μετρηση
      count=0;             // Μηδενισε τον μετρητη
      display_enable=1; // Ενημερωσε τη main() οτι πρεπει να ανανεωσει την LCD
    }
    
    
    volatile char display_enable=0;
    volatile u32 count=0;
    volatile u32 measure=0;
    
    
    main()
    {
         if(display_enable )
        {
           // print
           display_enable=0;
        }
    }
    Για παραδειγμα ψαξε για RPM meter

    1 Not allowed! Not allowed!

  10. #10
    Μέλος Το avatar του χρήστη nio-4-
    Όνομα
    Γιάννης
    Εγγραφή
    Feb 2008
    Περιοχή
    Σέρρες
    Μηνύματα
    1.277

    Προεπιλογή

    Καλημερα παιδια,

    καταρχας να ευχαριστησω τον Κ. Μιχαλη καλαρακη για την αμεση και μεγαλη βοηθεια του στον κωδικα...
    Φυσικα και ολους εσας...

    Εχω καταληξει στον κωδικα που παραθετω εδω , εχω κανει τις ρυθμισεις (τις βρηκα απο ενα ετοιμο κωδικα) δεν ειναι οτι βαριεμαι να διαβασω αλλα δεν βρηκα καποιο επισιμο αρχειο ναλεει τι χρειαζεται για την ρυθμιση του τιμερ . Στα datasheet τα λεει επιγγραμματικα . Το ψαχνω φυσικα συνεχεια και αλλου
    ο κωδικας ειναι αυτος και το led που εβαλα για 500 ms μονο αναβει δεν σβηνει

    Κώδικας:
    void InitTimer1(void)
        {
            // Configure Timer 1.
            // PR1 and TCKPS are set to call interrupt every 500ms.
            // Period = PR1 * prescaler * Tcy = 58594 * 256 * 33.33ns = 500ms
            T1CON = 0;            // Clear Timer 1 configuration
            T1CONbits.TCKPS = 3;  // Set timer 1 prescaler (0=1:1, 1=1:8, 2=1:64, 3=1:256)
            PR1 = 58594;          // Set Timer 1 period (max value is 65535)
            _T1IP = 1;            // Set Timer 1 interrupt priority
            _T1IF = 0;            // Clear Timer 1 interrupt flag
            _T1IE = 1;            // Enable Timer 1 interrupt
            T1CONbits.TON = 0;    // Turn off Timer 1
    
        }
       
        void __attribute__((__interrupt__ auto_psv)) _T1Interrupt(void)
        {
           
            PORTBbits.RB0 = - PORTBbits.RB0;   // κανει on και μετα off την πορτα RB0
           
            IFS0bits.T1IF = 0;  // Clear Timer 1 interrupt flag
    
        }
       
    int main()
    {
    
        PortCon();
        LCDInit();     // Initialising the Nokia LCD
        //IntInit();  // initialising intterrupts
        InitTimer1();
       
        #define _XT_FREQ_PLL16 7372800
    
        T1CONbits.TON = 1;    // Turn on Timer 1
     
        while(1)
        { 
            
        }
    }

    0 Not allowed! Not allowed!

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

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

  1. Προγραμματισμός DsPIC
    By nio-4- in forum Μικροελεγκτές
    Απαντήσεις: 3
    Τελευταίο Μήνυμα: 24-03-17, 22:30
  2. Count down timer για θάλαμο εμφάνισης pcb
    By kentar in forum Παρουσίαση Ολοκληρωμένων Κατασκευών
    Απαντήσεις: 26
    Τελευταίο Μήνυμα: 01-05-12, 14:23
  3. Pic18f4550 και external interrupt
    By antonis_x in forum Μικροελεγκτές
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 05-12-09, 14:59
  4. dsPIC vs PIC...
    By Lykos1986 in forum Μικροελεγκτές
    Απαντήσεις: 0
    Τελευταίο Μήνυμα: 20-11-05, 12:52

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

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