Other Parts Discussed in Thread: TM4C123AH6PM, TM4C129ENCPDT
Hi everyone. I am currently using timer.c from tivaware and built a code to use it for an ultrasound sensor. My problem is that my interruptions never get called. I will include part of my code in hope for someone can help me out. Thanks in advance.
Information: I am using TIMER1 so I use PF2 and PF3. The program keeps getting stucked in the while flagB loop and never gets out because the interruption TIMER1BHANDLER never runs and so flagB doesnt update to 1.
#include "timer.h" #include <stdint.h> #include "tm4c123gh6pm.h" #include "interrupt.h" #include "sysctl.h" #define TIMER1 0x40031000 #define PERIODO 62.5 #define ECHO 0x04 //PF2 #define TRIG 0x08 //PF3 uint8_t flagB; void ConfigGPIO(void){ SYSCTL_RCGCGPIO_R |= 0x20; while(!(SYSCTL_PRGPIO_R & 0x20)); GPIO_PORTF_DIR_R |= TRIG; GPIO_PORTF_DIR_R &= ~(ECHO); GPIO_PORTF_AFSEL_R |= (TRIG|ECHO); GPIO_PORTF_PCTL_R |= (GPIO_PORTF_PCTL_R & 0xFFFF00FF) | 0x7700; GPIO_PORTF_AMSEL_R &= ~(ECHO|TRIG); GPIO_PORTF_DEN_R |= (ECHO|TRIG); } void ConfigHCSR04(void){ SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER1)); TimerDisable(TIMER1,TIMER_BOTH); // (T1CCP0 connect to ECHO.) TimerConfigure(TIMER1,(TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_CAP_TIME|TIMER_CFG_B_ONE_SHOT)); TimerControlEvent(TIMER1,TIMER_A,TIMER_EVENT_BOTH_EDGES); TimerControlEvent(TIMER1,TIMER_B,TIMER_EVENT_NEG_EDGE); TimerIntEnable(TIMER1,(TIMER_CAPA_EVENT|TIMER_TIMB_TIMEOUT)); TimerIntRegister(TIMER1,TIMER_A,&Timer1AHandler); TimerIntRegister(TIMER1,TIMER_B,&Timer1BHandler); IntMasterEnable(); IntEnable(INT_TIMER1B); IntEnable(INT_TIMER1A); //TimerA 24 bits. TimerB 16 bits. TimerPrescaleSet(TIMER1,TIMER_A,0xFF); TimerLoadSet(TIMER1,TIMER_A,0xFFFF); TimerLoadSet(TIMER1,TIMER_B,(10000/PERIODO)); //timeout in 10 uS TimerEnable(TIMER1,TIMER_A); } void Timer1BHandler(void){ GPIO_PORTF_DATA_R &= ~(TRIG); TimerIntClear(TIMER1,TIMER_TIMB_TIMEOUT); flagB = 1; } void main(void){ ConfigHCSR04(); ConfigGPIO(); while(1){ if (!(GPIO_PORTF_DATA_R & ECHO)){ //Si no estoy haciendo medicion entonces emito ultrasonido. GPIO_PORTF_DATA_R |= TRIG; TimerEnable(TIMER1,TIMER_B); while(!flagB); flagB = 0; } }