All pastes #293643 Raw Edit

Someone

public text v1 · immutable
#293643 ·published 2006-12-27 19:47 UTC
rendered paste body
//----- Include Files ---------------------------------------------------------
#include <avr/io.h>			// include I/O definitions (port names, pin names, etc)
#include <avr/iom32.h>			// include I/O definitions (port names, pin names, etc)
#include <avr/interrupt.h>	// include interrupt support
#include <stdint.h> 

#include "global.h"		// include our global settings
#include "uart.h"		// include uart function library
#include "rprintf.h"	// include printf function library
#include "timer.h"		// include timer function library (timing, PWM, etc)

void timerTest(void);

//----- Begin Code ------------------------------------------------------------

uint32_t numofinterrupts;  // total number of time interrupts since reset
volatile uint64_t time;             // total number of microseconds since reset
volatile uint8_t pong = 0;
volatile uint64_t start_time = 0;
volatile uint64_t end_time = 0;

// Real time interupt function
// time will equal the number of ticks that have happened
// each tick is 4e-9 seconds
SIGNAL(SIG_OUTPUT_COMPARE2)
{
  numofinterrupts++;
  time = (uint64_t)numofinterrupts * 1000 + TCNT2;
}

SIGNAL(SIG_INTERRUPT2)
{
  pong = 1;
  end_time = time;
}

int pingSonar(void)
{
    // check the current time
    start_time = time;

    sbi(PORTB, 5);    // Power OFF the sonar module. Yes 1 = off, its a PN!P
    timerPause(10);
    // initiate ping
    cbi(PORTB, 5);    // Power ON the sonar module. Yes 0 = on, its a PNP!
    sbi(PORTB, 4);    // Ping! INIT on
    timerPause(10);
    cbi(PORTB, 4);    // Turn INIT off

    // Speed of sound at 19 degrees C = 342.785m/s

    return 0;
}

int pongSonar() {
  if (pong) {
    uint64_t elapsed = 0;

    // Calc the distance from times
    // 340 (m / s) = 0.00034 m / microseconds

    elapsed = end_time - start_time;
    elapsed = elapsed / 2;
    //elapsed = elapsed * 
    //THis is the part where I am stuck


    rprintf("PONG\n");
    pong = 0;
    end_time = 0;
    start_time = 0;
  }

  return 0;
}

int setup(void)
{
    // initialize our libraries
    // initialize the UART (serial port)
    uartInit();
    // set the baud rate of the UART for our debug/reporting output
    uartSetBaudRate(2400);
    // initialize rprintf system
    rprintfInit(uartSendByte);

    // print a little intro message so we know things are working
    rprintf("\r\n\n\nWelcome to the sonar test program!\r\n");

    // set the OC1A and OC1B for PWM output
    sbi(DDRD, PD4);
    sbi(DDRD, PD5);


    // initialize the timer for RTC
    sbi(TIMSK, OCIE2);
    TCCR2 = _BV(CS22)        // 64 prescale
           | _BV(WGM21);      // CTC mode, TOP = OCR2
    OCR2 = 250;

    // setup interrupts
    sbi(MCUCSR, ISC2);
    sbi(GICR, INT2);


    timerInit();

    // setup the sonar pins 
    sbi(DDRB, 4);		// sets PB4 to be an output - INIT
    sbi(DDRB, 5);		// sets PB5 to be an output - PWR
    cbi(DDRB, 2);		// sets PB3 to be an input - ECHO
    cbi(PORTB, 4);              // Dont ping yet
    cbi(PORTB, 5);		// Power ON the sonar module. Yes 0 = on, its a PNP!

    return 0;
}

int main(void)
{
 
    // Setup
    setup();
    pingSonar();

    while (1) {
      timerPause(500);
      pingSonar();
      pongSonar();
    }



}