[Menu]>[Guide to use the PIC]>[Circuits Gallery]>[Ultrasonic Range Meter]

Processing explanation of Ultrasonic Range Meter

This range meter detects a reflected wave from the object after sending out a ultrasonic pulse.
By measuring the time which returns after emitting a sound wave, a distance to the object is measured.

The operation of the following figure is repeatedly executed.
LED display processing is executed in parallel with this operation.

Label definition
;**************** Label Definition ********************
        cblock  h'20'
s_count                         ;Send-out pulse count adr

    I used CBLOCK directive for the definition of the workarea.
    When using this directive, workareas which were defined between CBLOCK and ENDC are automatically allocated in the order from the address which was specified by the operand of CBLOCK. It is convenient because it is possible to prevent the double allocation of the area. To confirm an allocated address, you confirm it by the assembly result.

    Lighting-up segment data for 7 segments LED are designated by EQU.
    The data from 0 to 9 is used for digital display. However, the 10th is used for the detection error display.
    At first, I make light up only center segment. But I turned off all segments because the display was confusing.

    The 11th is used for the interruption error display. It is for the debugging.

Environment designating and others
    As for LIST and INCLUDE directive and Program start, refer to "Light controller".

    The following specification is done as configuration word.
    Watchdog Timer:OFF
    Power-up Timer:enabled
    Low Voltage ICSP : OFF
    (RB3 can not be used for the input/output port when not making this OFF).

    The result is 3F72h.

Initialization process
;****************  Initial Process  *********************
    Port initialization
      Because the RA0/AN0 port is used for input of A/D converter, it is set to input mode. Other A ports are set to the output. All B ports are set to output because it is used for the LED segment control.
      RC2/CCP1 of C port is set to the input mode because it is used for input of capture.

    Ultrasonic transmission period timer(TMR0) initialization
      The transmission period of the ultrasonic is controlled using timer0. Because timer0 is a timer with byte, the count value is up to 256. However, it is making count 65535 by setting the prescaler to 256. (256 x 256 = 65535) This time, because it is using 4 MHz for the oscillator, 1 count is 1 microsecond. (1/(4 x 106))x4=10-6 seconds
      So, the time-out time of timer0 is about 65 milliseconds.

    Capture mode initialization
      Timer1 is used for capture. Timer1 is initialized.
      At the time of the initialization, it makes CCP1 OFF to prevent from a malfunction.

    A/D converter initialization
      Channel 0 is set as the converter input. Because the clock to use this time is 4 MHz, Fosc/8 is set to A/D conversion clock.
      Because the higher rank side of the A/D converted result are used, the storage of the result is made right justification (ADFM=0).
      Because A porta are used for the output of the digit specification of the LED, ports except RA0/AN0 are made digital specification.

    LED display period timer(TMR2) initialization
      Display data for 7 segments LED are set to workarea. The initial value of the display is "the error code".
      The time-out of timer2 is about 10 milliseconds.
      The interruption eable bits of the capture and timer2 are set.

    Interruption initialization
      It makes timer0 interruption, peripheral device interruption, global interruption possible.
      The interruption of the capture and timer2 doesn't occur when not making peripheral device interruption possible.
      By this process, interruption operation is started.

    When the initialization process ends, the interruption is waited for. It executes same address repeatedly.

Interruption process
;***************  Interruption Process  *****************
    Capture interruption, timer2 interruption, timer0 interruption are checked. The kind of the interruption is judged by each interruption flag. After that, it jumps to the corresponding interruption process.
    When the kind of the interruption is unsettled, processing is stopped. To confirm illegal interruption with the actual circuit, an in-circuit simulator is needed. There is a way of resetting but it isn't improved because it does the same operation even if it resets.
    A global interruption enable bit (the GIE bit) is automatically cleared when the interruption occurs. So, the interruption never occurs while processing in the interruption.

Illegal interruption process
;*************** Illegal interruption *****************
    It displays an interruption error to the LED when the illegal interruption occurs.
    This process is the process for debugging and is usable with the other checking, too.

Interruption ending process
;************  END of Interruption Process **************
    As for the software this time, all processing is done by the interruption except the initialization processing. The common registers(W register, Status register) are not used in the interrupted process (Main process). So, the saving and resaving process for them isn't need.
    In the interruption ending process, GIE bit is set by RETFIE instruction to enable interruption.

Ultrasonic pulse sending-out process
;***************  Pulse send-out Process ****************
    In the pulse sending-out process, the following process is done.

    Clear the interruption display
      The interruption flag of TMR0 is cleared. When not clearing this flag, the interruption occurs at once when interruption processing is ended without waiting a regular time-out.
      I clear the count area of timer0 because of the sure operation.

    Check the detection error
      When the detection of the reflected wave isn't done from the pulse sending-out in the last time until the pulse sending-out this time, it means measurement impossible and display is turned off. The previous data is displayed in the measurement impossible condition when not doing this process and the mistake occurs to the measurement.

    Stop the reflected wave detector
      Immediately after letting out a transmission pulse, the influence occurs to the receiver circuit and there is possibility to do wrong detection. To prevent from this, the operation of the reflected wave detector is stopped. The RA4 port is an open type and an external resistor is needed. So, I used RA5.

    Start the capture operation
      The count area of timer1 and the contents of the capture register are cleared. the rising edge detection mode capture is set and a capture interruption enable bit is set. And an interruption flag is cleared because of the sure operation.

    Send-out the 40KHz pulse
      The 40KHz pulse is the pulse which has 12.5 -sec as ON time and 12.5 -sec as OFF time in 1 cycle.
      Because 4-MHz clock is used at the circuit this time, the instruction execution time is 1 microsecond. So, correct 40KHz can not be sent out. When doing ON, OFF respectively with the 12 -sec, it is 41.7KHz. In case of 13 -sec, it is 38.5KHz. This time is adjusted by changing the number of the steps in the pulse sending-out processing.
      It is 0.5 milliseconds when sending out 20 pulses. (20pulses x 0.025milliseconds/pulse)

    Take-in the display revision data
      To make operate A/D converter, the GO bit of the ADCON0 register is set. When switching the input channel of A/D converter, after switching the input, about 20 microseconds waiting time is needed. This time, because the input channel is fixed on 0, waiting time isn't necessary. The completion of the A/D conversion is judged by the checking the GO bit. When GO bit is cleared, the conversion is completion. The upper 3 bits is picked up and add 54 as the conversion value.

    Error detection prevention
      A detector is stopped until the influence ends to the receiver after sending out a pulse. I set this time to about 1 millisecond. When few influences occur, it is to be OK even if it is shorter. When many influences occur, it is necessary to make longer.

    Start the reflected wave detection
      After the wrong detection prevention time elapse, it is made a enable condition in the reflected wave detection.

Capture interruption process
;******************  Capture Process ********************
    In the capture interruption process, the following process is done.

    Clear the interruption display
      Capture interruption flag is cleared.

    Distance conversion processing
      The count value of the timer0 which was stopped by the capture operation is proportional to the propagation time of the sound wave. It isn't possible to use for the display just as it is. In the processing this time, division by some value is done and is converted into the distance numerical value.
      For example, I will explaine in case to have been reflected from the 1-m distance.
      In the time that the sound wave goes and returns in 1 m, it is 2m/343m/sec=5831 microseconds in case of 20C. Because the clock of timer0 is 1-sec/count, the value of the timer0 when a capture is done is 5831. It is to be OK if using 58 as the divisor to make display this value as 100(It displays 1 m). The value to take in by the A/D converter is used for a divisor. So, when the temperature is different, the display can be revised if changing the input voltage to the A/D converter. But, because it is changed in the digital, it isn't possible to do fine adjustment.

    Display setting processing
      Because the type of distance value which is converted is binary, it can not be displayed on the LED just as it is.
      Binary number is converted into the decimal number and is set to each workarea(100th, 10th, 1st).
      When 100th digit exceeds 9, it makes error display.

LED display process
;****************  LED display control  *****************
    This is the process to display the distance numerical value which was gotten by the capture to the LED.
    One LED is controlled at each period. So, only 1 digit is displayed at the same time.
    Display is done every 10 milliseconds using timer2. When the display flickers, you should make the set value of timer2 more little and it quickens a period.