#include #include #include #include #include #include #include "FreeRTOS.h" #include "task.h" #include "croutine.h" #include "usart_ATmega1284.h" unsigned short reflectSensor, temperatureSensor, temperatureSensor2, pulseSensor = 0x0000; unsigned char pulseRate; int temperature = 0; int heartbeat, heart, counter = 0; int power = 0; int i = 0; enum ReflectanceSensor {read} state; enum PulseSensor{hold, process} pulseState; enum TemperatureSensor{wait, readIn} tempState; enum USARTCommunication{wait1, send} usartState; void ADC_init() { ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADATE); // ADEN: Enables analog-to-digital conversion // ADSC: Starts analog-to-digital conversion // ADATE: Enables auto-triggering, allowing for constant analog to digital conversions. } void convert() { ADCSRA |=(1<= 5000){ heart = heartConversion(heartbeat); PORTC = heart; heartbeat = 0; counter = 0; } break; default: break; } } void Temperature_Tick() { switch(tempState) // transitions { case wait: if(power == 0) tempState = wait; else if (power == 1) tempState = readIn; break; case readIn: if(power == 1) tempState = readIn; else if(power == 0) tempState = wait; default: tempState = wait; break; } switch(tempState) // actions { case wait: break; case readIn: Set_A2D_PIN(0x02); convert(); temperatureSensor = ADC; Set_A2D_PIN(0x03); convert(); temperatureSensor2 = ADC; temperature = degreeConversion(temperatureSensor, temperatureSensor2); break; default: break; } } void Reflectance_Task() { state = read; for(;;) { Reflectance_Tick(); vTaskDelay(500); } } void Pulse_Task() { pulseState = hold; for(;;) { Pulse_Tick(); vTaskDelay(1); ++counter; } } void Temperature_Task() { tempState = wait; for(;;) { Temperature_Tick(); vTaskDelay(500); } } void USART_Task() { usartState = wait; for(;;) { USART_Tick(); vTaskDelay(500); } } void StartFinalPulse(unsigned portBASE_TYPE Priority) { xTaskCreate(Reflectance_Task, (signed portCHAR *) "Reflectance_Task", configMINIMAL_STACK_SIZE, NULL, Priority, NULL); xTaskCreate(Pulse_Task, (signed portCHAR *) "Pulse_Task", configMINIMAL_STACK_SIZE, NULL, Priority, NULL); xTaskCreate(Temperature_Task, (signed portCHAR *) "Temperature_Task", configMINIMAL_STACK_SIZE, NULL, Priority, NULL); xTaskCreate(USART_Task, (signed portCHAR *) "USART_Task", configMINIMAL_STACK_SIZE, NULL, Priority, NULL); } int main(void) { initUSART(0); initUSART(1); ADC_init(); // Temperature Sensor // Heart Rate Sensor DDRA = 0x00; PORTA = 0xFF; //Reflectance Sensor DDRB = 0x00; PORTB = 0xFF; //USART DDRD = 0xFF; PORTD = 0x00; StartFinalPulse(1); vTaskStartScheduler(); }