Quantcast
Channel: MSP430 Technical Forums
Viewing all articles
Browse latest Browse all 2077

f2013 and HC-SR04. TimerA capture not triggering interrupt

$
0
0

Hello, I'm a beginner so I think the answer is simple.

 

I have an HC-SR04 connected to 4 AA batteries at 5.4V. The echo from the ultrasonic sensor goes through a voltage divider with 20k and 10k ohm resistors before going into P1.1.

My f2013 is being powered by the usb programming tool and is using P1.2 as the out/trigger pin for the hc-sr04. 

 

I beleive the sr04 can take a 3.3V trigger. 

 

This is my code below, I just can't figure out why my interrupt isn't triggering.

 

I borrowed some code from the internet. I can't remember his username, but the guy with the wall racer with two hc-sr04's.

 

For quick reference:

F2013 Datasheet

 

 

#define LED0 BIT0
#define ECHO BIT1
#define TRIG BIT2


#include <msp430f2013.h>


volatile unsigned distance_in_cm=0;
volatile unsigned int start_time;
volatile unsigned int total_time;
volatile unsigned int up=0;


void main(void) {
//setup ports, cpu speed, timers
//send 2 microseconds of off to p1.1
//send 10 microseconds of on to p1.1
//wait 60 microseconds
// listen and count time on p1.0
//distance in cm is counted time/58


WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ; //set speed to 1 megahertz
TACTL = 0; //stop the clock



P1DIR = (LED0 + TRIG);  // set all of P1.0 P1.2 to output and P1.1 to input
P1SEL = ECHO; //select echo pin as input for timerA


TACCTL0 |= CM_3 + SCS + CAP + CCIE + CCIS_0;  //capture rising and falling edge, syncronize(always do this),capture mode, interrupt enabled
TACTL = TASSEL_2 + ID_0 + MC_2;   // SMCLK,/1, continuous up mode, clear


_BIS_SR(GIE);   // general interrupt enable


while (1)
    {
volatile unsigned int i = 0;
up = 1; //Next catch on Timer1A0 should be rising edge - helps with capture timer
        P1OUT |= TRIG; //turn trig on
           _delay_cycles(20); //double the required 10 microseconds for good measure //TODO set to 10 again if possible
           P1OUT &= ~TRIG; //turn trig off
           _delay_cycles(60000); //wait 60ms before testing again. the interrupt should happen somewhere here
    }
}


#pragma vector=TIMERA0_VECTOR
__interrupt void timerA0 (){
if (up){
start_time = TACCR0;
}
else {
total_time = TACCR0 - start_time;
distance_in_cm = total_time/58;




if (distance_in_cm < 20){
P1OUT |= LED0;
}
else{
P1OUT &= ~LED0;
}
}
up=!up; //if this was the rising edge, the next one will be a falling edge, and vice-versa
TA0CTL &= ~TAIFG; //clear timer A interrupt flag, so the chip knows we handled the interrupt
TACCTL0 &= ~CCIFG;//clears capture interrupt flag, should already be done automatically though TODO
}
/*
#define MC_0                   (0*0x10u)       Timer A mode control: 0 - Stop
#define MC_1                   (1*0x10u)       Timer A mode control: 1 - Up to CCR0
#define MC_2                   (2*0x10u)       Timer A mode control: 2 - Continous up
#define MC_3                   (3*0x10u)       Timer A mode control: 3 - Up/Down
#define ID_0                   (0*0x40u)       Timer A input divider: 0 - /1
#define ID_1                   (1*0x40u)       Timer A input divider: 1 - /2
#define ID_2                   (2*0x40u)       Timer A input divider: 2 - /4
#define ID_3                   (3*0x40u)       Timer A input divider: 3 - /8
#define TASSEL_0               (0*0x100u)      Timer A clock source select: 0 - TACLK
#define TASSEL_1               (1*0x100u)      Timer A clock source select: 1 - ACLK
#define TASSEL_2               (2*0x100u)      Timer A clock source select: 2 - SMCLK
#define TASSEL_3               (3*0x100u)      Timer A clock source select: 3 - INCLK
#define CCIS_0                 (0*0x1000u)     Capture input select: 0 - CCIxA
#define CCIS_1                 (1*0x1000u)     Capture input select: 1 - CCIxB
#define CCIS_2                 (2*0x1000u)     Capture input select: 2 - GND
#define CCIS_3                 (3*0x1000u)     Capture input select: 3 - Vcc
#define CM_0                   (0*0x4000u)     Capture mode: 0 - disabled
#define CM_1                   (1*0x4000u)     Capture mode: 1 - pos. edge
#define CM_2                   (2*0x4000u)     Capture mode: 1 - neg. edge
#define CM_3                   (3*0x4000u)     Capture mode: 1 - both edges
 */
 

Viewing all articles
Browse latest Browse all 2077

Trending Articles