Αρχικό μήνυμα από
Fire Doger
Λάθος εγώ έχασα 1 μηδενικό κάπου, 1600 κύκλοι είναι.
Πρέπει να είσαι σίγουρος πως θα έχεις τουλάχιστον 1 δείγμα πάνω στον παλμό.
Αφού ο παλμός σου είναι 100uS τότε πρέπει να παίρνεις δείγμα κάθε <100us πχ κάθε 90uS άρα θα είσαι σίγουρος πως δεν θα χάσεις παλμό.
Σε αυτά τα 90uS θα πρέπει να ολοκληρώνετε ο ADC, να κάνεις την σύγκριση, να ενημερώνεις την LCD και να κάθετε ο μΕ μέχρι να έρθει το επόμενο interrupt.
Αν δεν γίνεται αυτό και χάσεις το δείγμα που είναι στο βελάκι τότε έχασες έναν παλμό.
Βέβαια μπορείς να το εξελίξεις και αφού ξέρεις ότι το ελάχιστο κενό είναι 60us και ο παλμός 100us τότε μπορείς να έχεις μεταβλητό χρόνο και όταν λάβεις παλμό ξέρεις πως ο επόμενος θα έρθει στην χειρότερη σε 60us και θα διαρκέσει 100us άρα έχεις <160us διαθέσιμα μέχρι να χαθεί ο επόμενος παλμός και μπορείς να πειράξεις τον timer έτσι ώστε να χτυπήσει σε 150us αντί για 90us και να κερδίσεις λίγο χρόνο πιάνοντας και τον επόμενο στο τέλος του..
καταλαβα απλα να προσθεσω διευκρινιζοντας οτι οι παλμοι δεν εχουν περιοδο 0n-off δηλαδη εμφανιζονται οταν υπαρχει σημα απλα οχι με κενο 60 us . αυτο το ειπα γιατι ειναι η μικρότερη περιοδος απο 60-90 us .
ο επομενος παλμος μπορει να κανει και 1ms να εμφανιστει μπορει 500us. Ελπιζω να ειναι θετικο αυτο.
μια ερωτηση , σε ενα κωδικα που βλεπω λιτο και απεριτο ! δεν ελεγχει τον timer.
Κώδικας:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
volatile int buttonState = 0; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
// Attach an interrupt to the ISR vector
attachInterrupt(0, pin_ISR, CHANGE);
}
void loop() {
// Nothing here!
}
void pin_ISR() {
buttonState = digitalRead(buttonPin);
digitalWrite(ledPin, buttonState);
}