Arduino - čítanie z Ultrazvukového senzora pomocou prerušení

From DT^2
Revision as of 06:05, 3 August 2018 by Admin (talk | contribs) (Created page with "Tento program číta z ultrazvukového senzora pomocou prerušení: <syntaxhighlight lang="C" line=line> #define TRIG 7 #define ECHO 8 void setup() { init_ultrasonic();...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Tento program číta z ultrazvukového senzora pomocou prerušení:

<syntaxhighlight lang="C" line=line>

  1. define TRIG 7
  2. define ECHO 8

void setup() {

 init_ultrasonic();
 Serial.begin(9600);

}

static volatile uint32_t pulse_start; static volatile int16_t distance; static volatile uint8_t new_distance;

void init_ultrasonic() {

 pinMode(ECHO, INPUT);
 pinMode(TRIG, OUTPUT);
 
 PCMSK0 |= 1; //PCINT0;
 PCIFR &= ~1; //PCIF0;
 PCICR |= 1; // PCIE0;  

}

ISR(PCINT0_vect) {

 if (PINB & 1) pulse_start = micros();
 else 
 {
   distance = (int16_t)((micros() - pulse_start) / 58);
   new_distance = 1;
 }

}

void start_distance_measurement() {

 distance = -1;
 new_distance = 0;
 digitalWrite(TRIG, HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);

}

void wait_for_distance_measurement_to_complete() {

 uint8_t counter = 0;
 while ((counter < 20) && !new_distance) 
 {
   delay(1);
   counter++;
 }

}

uint16_t measure_distance() {

 start_distance_measurement();
 wait_for_distance_measurement_to_complete();
 return distance;

}

void loop() {

 uint16_t d = measure_distance();
 Serial.print("Distance: ");
 Serial.println(d);
 delay(100);

} </syntaxhighligh>