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:
#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
*/