diff --git a/BPM.c b/BPM.c index 75eb45b..4120389 100644 --- a/BPM.c +++ b/BPM.c @@ -1,9 +1,105 @@ +#include +#include "tm4c123gh6pm.h" + +// Function prototypes +void Timer0A_Init(void); +void ADC0_Init(void); +void ADC0_Start(void); -/** - * main.c - */ +uint32_t ADC0_Read(void); +void Delay(uint32_t time); + +volatile uint32_t pulse_count = 0; +volatile uint32_t pulse_detected = 0; + int main(void) { - return 0; + Timer0A_Init(); // Initialize Timer0A for 1-minute interval + ADC0_Init(); // Initialize ADC0 + + while (1) + { + if (pulse_detected) + { + pulse_count++; // Increment pulse count + pulse_detected = 0; + } + } } + + + +// Timer0A Initialization: Configures Timer0A to generate an interrupt every 1 minute +void Timer0A_Init(void) + { + SYSCTL_RCGCTIMER_R |= 0x01; // Enable clock to Timer0 + TIMER0_CTL_R = 0; // Disable Timer0A during configuration + TIMER0_CFG_R = 0; // Set 32-bit timer configuration + TIMER0_TAMR_R = 0x02; // Configure Timer0A in periodic mode + TIMER0_TAILR_R = 48000000 * 60; // Load value for 1-minute interval + TIMER0_IMR_R |= 0x01; // Enable Timer0A timeout interrupt + TIMER0_CTL_R |= 0x01; // Enable Timer0A + NVIC_EN0_R |= (1 << 19); // Enable IRQ19 for Timer0A + } + +// ADC0 Initialization: Configures ADC0 for single-channel, single-conversion +void ADC0_Init(void) + { + SYSCTL_RCGCADC_R |= 0x01; // Enable ADC0 + SYSCTL_RCGCGPIO_R |= 0x10; // Enable clock for Port E + GPIO_PORTE_AFSEL_R |= 0x08; // Enable alternate function for PE3 + GPIO_PORTE_DEN_R &= ~0x08; // Disable digital I/O on PE3 + GPIO_PORTE_AMSEL_R |= 0x08; // Enable analog function on PE3 + ADC0_ACTSS_R &= ~0x08; // Disable SS3 during configuration + ADC0_EMUX_R &= ~0xF000; // Configure SS3 for software trigger + ADC0_SSMUX3_R = 0; // Set channel AIN0 (PE3) + ADC0_SSCTL3_R = 0x06; // Set END0 and IE0 bits for single sample + ADC0_ACTSS_R |= 0x08; // Enable SS3 + } + +// Start ADC0 Conversion +void ADC0_Start(void) + { + ADC0_PSSI_R |= 0x08; // Initiate SS3 + } + + +// Read ADC0 Value +uint32_t ADC0_Read(void) + { + while ((ADC0_RIS_R & 0x08) == 0); // Wait for conversion to complete + uint32_t result = ADC0_SSFIFO3_R & 0xFFF; // Read 12-bit ADC result + ADC0_ISC_R = 0x08; // Clear completion flag + return result; + } + +// Timer0A Interrupt Handler: Executes every 1 minute +void Timer0A_Handler(void) + { + TIMER0_ICR_R = 0x01; // Clear the timer interrupt flag + pulse_count = 0; // Reset pulse count for the next interval + } + +// Sample ADC and check for pulse presence +void check_pulse(void) + { + ADC0_Start(); + uint32_t adc_value = ADC0_Read(); + + // Convert ADC value to voltage (assuming 3.3V reference) + float voltage = (adc_value * 3.3) / 4095; + + if (voltage >= 0.4 && voltage <= 0.6) + { + pulse_detected = 1; // Signal a valid pulse + } + } + + +// Simple delay function +void Delay(uint32_t time) + { + volatile uint32_t count; + for(count = 0; count < time; count++); + }