Σελίδα 38 από 55 ΠρώτηΠρώτη ... 28 36 37 38 39 40 48 ... ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 371 έως 380 από 543

Θέμα: Απορία για "κώδικα".

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

    Προεπιλογή

    Έχει μια βάση αυτό που έγραψες αλλά το πρόβλημα είναι ότι θα καταναλώνεις κύκλους σε κάθε loop για να γράψεις στον register το state ενώ μπορεί να είναι ίδιος.

    Μια ποιο σωστή προσέγγιση θα ήταν να είναι κάπως έτσι:
    Κώδικας:
    const byte ledPin = 13;
    const byte interruptPin = 2;
    byte state = LOW;
    volatile bool Change_State= False;
    
    void setup() {
       pinMode(ledPin, OUTPUT);
       pinMode(interruptPin, INPUT_PULLUP);
       attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
    }
    
    void loop() {
       if(Change_State){
           state=!state;
           digitalWrite(ledPin, state);
           Change_State= False;
       }
    
    }
    
    void blink() { 
    Change_State= True;
    }
    Όταν θα έρθει το interrupt θα ανεβεί μια σημαία να αλλάξει κατάσταση. Και στην loop που υποτίθεται δεν έχει κάτι καλύτερο να κάνει θα ελέγχει την σημαία και αν την βρει σηκωμένη θα αλλάζει κατάσταση και θα την κατεβάζει. Έτσι σε κάθε loop απλώς θα κάνει έλεγχο αν κάτι χρειάζεται ενημέρωση και μόνο τότε θα το ενημερώνει. Σε κάτι τόσο απλό μπορείς και απευθείας απ' το interrupt να αλλάζεις κατάσταση, το να κρατάς τα interrupt μικρά είναι ένας γενικός κανόνας για να αποφύγεις δυσάρεστες καταστάσεις αλλά εφόσον γνωρίζεις τι κάνεις μπορείς να κάνεις και άλλα πράγματα εκτός από σημαίες.

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

    Πολλές βιβλιοθήκες το λαμβάνουν υπόψιν αυτό, άλλες πάλι όχι οπότε πρέπει να είσαι πολύ προσεκτικός γιατί είναι ένα bug που δεν θα εμφανίζεται συνέχεια, 10 θα δουλεύει, 1 όχι.

    Επίσης, αν έχεις είσοδο κάποιο κουμπί, τα interrupt είναι γρήγορα και το bounce το αντιλαμβάνονται οπότε με αυτόν τον κώδικα θα σου έρθουν πολλά interrupt το ένα πίσω απ' το άλλο, όταν έχεις έξοδο στην σειριακή αυτή θα καθυστερεί τον έλεγχο της σημαίας και δεν θα βλέπεις να φλικάρει. Πολλά παλαβά μπορεί να προκύψουν. Αν πχ το Serial.print το βάλεις κάτω απ' το Change_State= False; πολύ πιθανό έτσι όπως το βλέπω να μην αλλάζει κατάσταση το led γιατί κατά την εκτύπωση στην σειριακή ένα interrupt να το ξανακάνει high και να ξανά αλλάξει το led στο επόμενο loop.

    Και τα external interrupt είναι συγκεκριμένα σε κάθε μΕ και μπορεί να μην υποστηρίζουν όλα το CHANGE ή το HIGH, LOW κλπ, αυτά τα βλέπεις στο datasheet.


    Η συνάρτηση του interrupt είναι μια απλή συνάρτηση, η οποία ξεκινάει σε μια θέση μνήμης, όταν έρχεται το interrupt ουσιαστικά εκτελεί μια εντολή τύπου GO_TO που το στέλνει σε αυτήν την θέση μνήμης. Μπορείς αυτήν την συνάρτηση να την καλέσεις κανονικά. Σε μερικούς μΕ μπορείς να προκαλέσεις interrupt μέσω software σηκώνοντας χειροκίνητα την σημαία που ελέγχει η CPU για να εξυπηρετήσει τα interrupt. Σε μερικούς δεν γίνεται γιατί είναι ρυθμισμένοι σε αυτήν την σημαία αν στέλνεις 1 να γράφεται 0 και αν στέλνεις 0 να μην γίνεται τίποτα (αν θυμάμαι καλά)

    Τα interrupt λύνουν πολλά προβλήματα αλλά πρέπει να τα παίζεις στα δάχτυλα για να μην σου δημιουργήσουν άλλα προβλήματα που είναι δύσκολο να βρεις χωρίς in circuit debugger.

    *Edit: Άλλαξα σε volatile την μεταβλητή που αλλάζει στο interrupt, by Savvas

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη Fire Doger : 26-12-16 στις 20:54

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

    Προεπιλογή

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

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

    1 Not allowed! Not allowed!

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

    Fire Doger (26-12-16)

  4. #373
    Μέλος Το avatar του χρήστη finos
    Όνομα
    Βαγγελης
    Εγγραφή
    Feb 2013
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    1.775

    Προεπιλογή

    εχω προβλημα ...δεν μου φτανουν τα Pin του Mega !!!!!!! για την ακριβια τα interupt
    αν θα βαλω due θα πρεπει να τα βαλω ολα 3,3ν το adc του due αντεχει και αυτο 3.3v ?
    η οθονη (20χ4) θα καταλαβαίνει τα 3,3 και τα mcp4151 θα καταλεβενουν τα 3.3 ?
    το due θα το βαλω μονο και μονο για τα interupt του , αξιζει ? α 12 κουμπια εχω (8 button 2 ecoders )

    0 Not allowed! Not allowed!

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

    Προεπιλογή

    Και μη χειρότερα!

    Τι ακριβώς φτιάχνεις ρε Βαγγέλη και δεν σου φτάνουν 69 ψηφιακά ΄(μόνο) πινάκια; Ή 24 διακοπές (PCINT23); 'H 15 αναλογικές είσοδοι;

    1 Not allowed! Not allowed!

  6. #375
    Μέλος Το avatar του χρήστη finos
    Όνομα
    Βαγγελης
    Εγγραφή
    Feb 2013
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    1.775

    Προεπιλογή

    το due θα το εβαζα μονο για το interupt του εχω 8buttons 2 encoders και 1 ακομα που διαβαζει το constant curent led απο την πλακετα και το βγαζει στην οθονη ....που να τραβαω led στο front panel 24 interut to mega ???
    Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21
    6 μοναχά λεει το site

    0 Not allowed! Not allowed!

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

    Προεπιλογή

    Τα σχετικά http://www.hlektronika.gr/forum/show...l=1#post801749 και




    ...τα έχεις μελετήσει; Έχεις 24 εξωτερικές διακοπές σε αλλαγή στάθμης αν θέλεις, τις βλέπεις που είναι; (PCINT23 ===>>> Pin Change INTerrupt)

    1 Not allowed! Not allowed!

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

    Προεπιλογή

    Διάβασε για τη βιβλιοθήκη PinChangeInterrupt στη διεύθυνση https://github.com/NicoHood/PinChangeInterrupt

    Κώδικας:
    /*
     Copyright (c) 2014-2015 NicoHood
     See the readme for credit to other people.
     PinChangeInterrupt_HowItWorks
     Shows how to manually setup a single PCINT function with a few helper functions.
     Connect a button/cable to pin 7 and ground.
     The led will change its state if pin 7 changes.
     PinChangeInterrupts are different than normal Interrupts.
     See readme for more information.
     Dont use Serial or delay inside interrupts!
     This library is not compatible with SoftSerial.
     The following pins are usable for PinChangeInterrupt:
     Arduino Uno/Nano/Mini: All pins are usable
     Arduino Mega: 10, 11, 12, 13, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64),
                   A11 (65), A12 (66), A13 (67), A14 (68), A15 (69)
     Arduino Leonardo/Micro: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)
     HoodLoader2: All (broken out 1-7) pins are usable
     Attiny 24/44/84: All pins are usable
     Attiny 25/45/85: All pins are usable
     Attiny 13: All pins are usable
     Attiny 441/841: All pins are usable
     ATmega644P/ATmega1284P: All pins are usable
     */
    https://www.arduino.cc/en/Hacking/PinMapping2560

    Arduino Mega 2560 PIN mapping table
    Pin Number Pin Name Mapped Pin Name
    1 PG5 ( OC0B ) Digital pin 4 (PWM)
    2 PE0 ( RXD0/PCINT8 ) Digital pin 0 (RX0)
    3 PE1 ( TXD0 ) Digital pin 1 (TX0)
    4 PE2 ( XCK0/AIN0 )
    5 PE3 ( OC3A/AIN1 ) Digital pin 5 (PWM)
    6 PE4 ( OC3B/INT4 ) Digital pin 2 (PWM)
    7 PE5 ( OC3C/INT5 ) Digital pin 3 (PWM)
    8 PE6 ( T3/INT6 )
    9 PE7 ( CLKO/ICP3/INT7 )
    10 VCC VCC
    11 GND GND
    12 PH0 ( RXD2 ) Digital pin 17 (RX2)
    13 PH1 ( TXD2 ) Digital pin 16 (TX2)
    14 PH2 ( XCK2 )
    15 PH3 ( OC4A ) Digital pin 6 (PWM)
    16 PH4 ( OC4B ) Digital pin 7 (PWM)
    17 PH5 ( OC4C ) Digital pin 8 (PWM)
    18 PH6 ( OC2B ) Digital pin 9 (PWM)
    19 PB0 ( SS/PCINT0 ) Digital pin 53 (SS)
    20 PB1 ( SCK/PCINT1 ) Digital pin 52 (SCK)
    21 PB2 ( MOSI/PCINT2 ) Digital pin 51 (MOSI)
    22 PB3 ( MISO/PCINT3 ) Digital pin 50 (MISO)
    23 PB4 ( OC2A/PCINT4 ) Digital pin 10 (PWM)
    24 PB5 ( OC1A/PCINT5 ) Digital pin 11 (PWM)
    25 PB6 ( OC1B/PCINT6 ) Digital pin 12 (PWM)
    26 PB7 ( OC0A/OC1C/PCINT7 ) Digital pin 13 (PWM)
    27 PH7 ( T4 )
    28 PG3 ( TOSC2 )
    29 PG4 ( TOSC1 )
    30 RESET RESET
    31 VCC VCC
    32 GND GND
    33 XTAL2 XTAL2
    34 XTAL1 XTAL1
    35 PL0 ( ICP4 ) Digital pin 49
    36 PL1 ( ICP5 ) Digital pin 48
    37 PL2 ( T5 ) Digital pin 47
    38 PL3 ( OC5A ) Digital pin 46 (PWM)
    39 PL4 ( OC5B ) Digital pin 45 (PWM)
    40 PL5 ( OC5C ) Digital pin 44 (PWM)
    41 PL6 Digital pin 43
    42 PL7 Digital pin 42
    43 PD0 ( SCL/INT0 ) Digital pin 21 (SCL)
    44 PD1 ( SDA/INT1 ) Digital pin 20 (SDA)
    45 PD2 ( RXDI/INT2 ) Digital pin 19 (RX1)
    46 PD3 ( TXD1/INT3 ) Digital pin 18 (TX1)
    47 PD4 ( ICP1 )
    48 PD5 ( XCK1 )
    49 PD6 ( T1 )
    50 PD7 ( T0 ) Digital pin 38
    51 PG0 ( WR ) Digital pin 41
    52 PG1 ( RD ) Digital pin 40
    53 PC0 ( A8 ) Digital pin 37
    54 PC1 ( A9 ) Digital pin 36
    55 PC2 ( A10 ) Digital pin 35
    56 PC3 ( A11 ) Digital pin 34
    57 PC4 ( A12 ) Digital pin 33
    58 PC5 ( A13 ) Digital pin 32
    59 PC6 ( A14 ) Digital pin 31
    60 PC7 ( A15 ) Digital pin 30
    61 VCC VCC
    62 GND GND
    63 PJ0 ( RXD3/PCINT9 ) Digital pin 15 (RX3)
    64 PJ1 ( TXD3/PCINT10 ) Digital pin 14 (TX3)
    65 PJ2 ( XCK3/PCINT11 )
    66 PJ3 ( PCINT12 )
    67 PJ4 ( PCINT13 )
    68 PJ5 ( PCINT14 )
    69 PJ6 ( PCINT 15 )
    70 PG2 ( ALE ) Digital pin 39
    71 PA7 ( AD7 ) Digital pin 29
    72 PA6 ( AD6 ) Digital pin 28
    73 PA5 ( AD5 ) Digital pin 27
    74 PA4 ( AD4 ) Digital pin 26
    75 PA3 ( AD3 ) Digital pin 25
    76 PA2 ( AD2 ) Digital pin 24
    77 PA1 ( AD1 ) Digital pin 23
    78 PA0 ( AD0 ) Digital pin 22
    79 PJ7
    80 VCC VCC
    81 GND GND
    82 PK7 ( ADC15/PCINT23 ) Analog pin 15
    83 PK6 ( ADC14/PCINT22 ) Analog pin 14
    84 PK5 ( ADC13/PCINT21 ) Analog pin 13
    85 PK4 ( ADC12/PCINT20 ) Analog pin 12
    86 PK3 ( ADC11/PCINT19 ) Analog pin 11
    87 PK2 ( ADC10/PCINT18 ) Analog pin 10
    88 PK1 ( ADC9/PCINT17 ) Analog pin 9
    89 PK0 ( ADC8/PCINT16 ) Analog pin 8
    90 PF7 ( ADC7 ) Analog pin 7
    91 PF6 ( ADC6 ) Analog pin 6
    92 PF5 ( ADC5/TMS ) Analog pin 5
    93 PF4 ( ADC4/TMK ) Analog pin 4
    94 PF3 ( ADC3 ) Analog pin 3
    95 PF2 ( ADC2 ) Analog pin 2
    96 PF1 ( ADC1 ) Analog pin 1
    97 PF0 ( ADC0 ) Analog pin 0
    98 AREF Analog Reference
    99 GND GND
    100 AVCC VCC

    0 Not allowed! Not allowed!

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

    Προεπιλογή

    Και 2 κανονικά ακόλλητα, δεν έχω ψάξει πως το πατσάρεις για να δουλέψουν

    0 Not allowed! Not allowed!

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

    Προεπιλογή

    Είναι όντως ακόλλητα Στέφανε τα INT6 και INT7, δεν υπάρχουν στα headers κανενός MEGA. Μόνο σε custom κατασκευές αν τα προβλέψεις, έχουν κανονικά όλες τις δυνατότητες των υπολοίπων ΙΝΤ pins.

    1 Not allowed! Not allowed!

  11. #380
    Μέλος Το avatar του χρήστη finos
    Όνομα
    Βαγγελης
    Εγγραφή
    Feb 2013
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    1.775

    Προεπιλογή

    με το ενσωματωμενο interupt δεν μπορώ να έχω πρόσβαση ?

    0 Not allowed! Not allowed!

Σελίδα 38 από 55 ΠρώτηΠρώτη ... 28 36 37 38 39 40 48 ... ΤελευταίαΤελευταία

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

  1. Απαντήσεις: 8
    Τελευταίο Μήνυμα: 01-05-20, 14:51
  2. Απαντήσεις: 1
    Τελευταίο Μήνυμα: 27-05-11, 08:48
  3. Απαντήσεις: 0
    Τελευταίο Μήνυμα: 22-10-10, 23:51
  4. Απαντήσεις: 9
    Τελευταίο Μήνυμα: 22-02-10, 14:01
  5. Απαντήσεις: 39
    Τελευταίο Μήνυμα: 17-04-09, 13:43

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

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