distance.c 1.5 KB
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

//#ifndef RETOUR_H_
//#define RETOUR_H_

#include "libretour.h"

//#endif 
#define PRESCALER 1024
#define TIME_SLOT 20
#define BAUDRATE	103

static volatile int pulse = 0;
static volatile int i = 0;


//////////////////////////////////////////////

ISR(INT0_vect){
  //i=1 indique l'écho HIGH
  if(i == 1)
  {
    //On arrête le timer
    TCCR1B = 0;
    //On stocke la valeur précédente du timer (l'aller-retour)
    pulse = TCNT1;
    //On reset la valeur de TCNT1 et de i à Zero
    TCNT1 = 0;
    i = 0;
  }
  
  //i=0 indique l'écho à LOW
  if(i==0)
  {
    //On set le bit CS10 à HIGH, debut du timer qui compte
    TCCR1B |= (1<<CS10);
    i = 1; 
  }
}


int main(void){
  init_serial();
  int16_t count_a = 0; 
  char show_a[16];
  //Trigger = PIND0 et ECHO = PIND2
  DDRD = 0b11111011;
  _delay_ms(50);
  //Selection INT0
  EIMSK |= (1<<INT0);
  //Interruption sur changement logique
  EICRA = 0x01;
  sei();
 
  while(1)
  { 
    //TRIGGER HIGH
    PORTD |= 1<<PIND0;
    //Durée de l'impulsion TRIGGER
    _delay_us(15);
    //TRIGGER LOW
    PORTD &= ~(1<<PIND0);
    //On calcule la distance en cm : pulse/(58/2/10)  (en cm)
    count_a = pulse/1160.0;
    
    itoa(count_a,show_a,10);
    //dtostrf(count_a, 5,2, show_a);
    sprintf(show_a, "%d", count_a);
    //send_serial('D');
    //send_serial('=');
    //RETOUR
    retour(show_a);
    _delay_ms(1000);
    
  }
  return 0;
}