Jump to content

f2013 and HC-SR04. TimerA capture not triggering interrupt

Recommended Posts

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
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;
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
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...