Tool/software: Code Composer Studio
Hi,
i am new starting to learn about timers and push buttons.
My problem is that i want to implement a sensitive buton. If the pushed time is bellew 1s turn on a led. But i always end up in FaultISR().
can you please help me to solve it?
Regards.
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_ints.h" // Definicion de nombres de interrupciones (ej. INT_TIMER0A))
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_timer.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h" // Definicion de funciones de interrupcion (Int...())
#include "driverlib/gpio.h"
#include "driverlib/timer.h" // Definicion de funciones de Timer (Timer..())
#define F_CPU 16000000
const double temp = 1.0/40.0;
//Stores the pulse length
volatile uint32_t pulse=0;
//Tells the main code if the a pulse is being read at the moment
volatile uint8_t echowait=0;
// Programa principal
int main(void)
{
uint8_t ui8LEDS=0;
uint32_t ui32Period;
// Configura reloj del sistema a 40MHz (PLL a 200MHz/5=40MHz)
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
// Configuracion de puerto GPIOF (LEDs)
// Habilita Puerto F
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
// Configura pines PF1, PF2, y PF3 como salidas (control de LEDs)
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
// Y apaga los LEDs
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0);
// Configuracion TIMER0
// Habilita periferico Timer0
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
// Configura el Timer0 para cuenta periodica de 32 bits (no lo separa en TIMER0A y TIMER0B)
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC_UP);
// Periodo de cuenta de 0.05s. SysCtlClockGet() te proporciona la frecuencia del reloj del sistema, por lo que una cuenta
// del Timer a SysCtlClockGet() tardara 1 segundo, a 0.5*SysCtlClockGet(), 0.5seg, etc...
ui32Period = (SysCtlClockGet()/10)/2;
// Carga la cuenta en el Timer0A
TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period-1);
// Habilita interrupcion del modulo TIMER
//IntEnable(INT_TIMER0A);
// Y habilita, dentro del modulo TIMER0, la interrupcion de particular de "fin de cuenta"
//TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
// Habilita permiso general de interrupciones el sistema.
ButtonsInit();
GPIOIntClear(GPIO_PORTF_BASE,GPIO_PIN_4|GPIO_PIN_0);
GPIOIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4|GPIO_PIN_0);
GPIOIntTypeSet(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_4,GPIO_BOTH_EDGES);
IntEnable(INT_GPIOF);
IntMasterEnable();
// Activa el Timer0A (empezara a funcionar)
TimerEnable(TIMER0_BASE, TIMER_A);
while(1)
{
if(echowait != 1){
if(pulse < 1000000){
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, ~GPIO_PIN_1);
}
while(echowait != 0);
pulse =(uint32_t)(temp * pulse);
}
SysCtlDelay(400000);
}
}
void RutinaISR(void)
{
uint32_t status;
status=GPIOIntStatus(GPIO_PORTF_BASE,true);
if(status&GPIO_PIN_4){
TimerEnable(TIMER0_BASE,TIMER_A);
echowait=1;
} else {
pulse =TimerValueGet(TIMER0_BASE, TIMER_A);
TimerDisable(TIMER0_BASE,TIMER_A);
echowait=0;
}
GPIOIntClear(GPIO_PORTF_BASE,GPIO_PIN_4|GPIO_PIN_0);
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
}