#include #include #include #define F_CPU 16000000 #include #include int uart_putchar(char c, FILE *unused); int uart_getchar(FILE* f); FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); FILE mystdin = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); #define WINDOWSIZE 12 #define MEDINTERVAL 20 //20 ms unsigned int vwindow[WINDOWSIZE]; void USART_init(void) { UBRRH=0; UBRRL=103; //comunicare pe 9600 bps UCSRB=(0< T1 -> external counter PORTB=0; PORTA=0; PORTA &= ~(1<<0); //setam bitul 0 LOW; PORTB |= (1<<0); //setam bitul 0 HIGH; // S0 = H S1 = H PORTA |= (1<<3); // PA3 = S_0 PORTA |= (1<<2); // PA2 = S_1 // S2 = L S3 = L //PORTB |= (0<<2); // PB2 = S2 = L; //PORTB |= (0<<3); // PB3 = S3 = L; COUNTER_init(); PORTC=(1<<1); //Activare RED LED currentpulses = 0; while (1) { _delay_ms(MEDINTERVAL); currentpulses=TCNT1; TCNT1=0; //resetare si numarare din nou if(i < WINDOWSIZE) //umplere initiala vwindow[i]=currentpulses; else{ signalout=0; //filtru Moving average for(j=0;jsignalout && signalmean>prevsignal&&i-lastpeak>20){ bpm3=bpm2; bpm2=bpm1; //noua valoare: //60000 ms intr-un minut //se extrapoleaza distanta intre varfuri pentru 1 minut //rezulta BPM bpm1=(60000/MEDINTERVAL)/(i-lastpeak); bpm=(bpm1+bpm2+bpm3)/3; #ifdef BPM_OUT printf("Peak at %u. BPM is %lu\n",i,bpm); #endif lastpeak=i; } #ifndef BPM_OUT printf("%u %lu \n",i,signalout); #endif prevsignal=signalout; } i++; counter++; signalsum += signalout; } return 0; } // Functie ce trateaza trimiterea unui caracter pe seriala int uart_putchar(char c, FILE *unused) { if (c == '\n') uart_putchar('\r', 0); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; } // Functie ce trateaza primirea unui caracter pe seriala int uart_getchar(FILE* f) { char c; loop_until_bit_is_set(UCSRA, RXC); c = UDR; if(c=='\r') c='\n'; uart_putchar(c,NULL); return c; }