// Chapter 12 6812 C programs // Jonathan W. Valvano, 2/26/07 // This software accompanies the book, // Embedded Microcomputer Systems: Real Time Interfacing, Second Edition // published by Thomson Engineering, 2006 // table of multiple unsigned (x,y), piece-wise linear function unsigned short const ADCtable[8]= { 0, 8, 50, 96,146,199,255,65535}; unsigned short const Ttable[8]= { 500,500,450,400,350,300,250, 250}; unsigned short LookUp(unsigned short data); interrupt 11 void TOC3handler(void){ // TCNT is 4us unsigned short Data; // raw ADC result, 0 to 255 Data = ADC_In(0x81); // 0 to 255 Fifo_Put(LookUp(Data)); // 250 to 500 (0.1C) TC3 = TC3+25000; // every 0.1s at 4 MHz TFLG1 = 0x08; // acknowledge OC3 } //Program 12.2. Real-time measurement of temperature. interrupt 11 void TOC3handler(void){ // 480Hz static short sum=0,n=0; short data; data = (0x00FF&ADC_In(7))-128; // real EKG sum += data; // sum=x(n)+x(n-1)+x(n-2)+x(n-3) n++; if(n==4){ n = 0; Fifo_Put(sum/4); // 120Hz sum = 0; } TC3 = TC3+16667; // 2083.375us = 479.99 Hz TFLG1 = 0x08; // acknowledge OC3 } //Program 12.3. Real-time sampling of EKG. short Data; // ADC sample, -128 to +127, 8-bit signed ADC sample short x[50]; // 60Hz notch-filtered EKG, 120Hz short y[50]; // low pass filter, 120Hz short z[50]; // high pass filter, 120Hz short w[50]; // squared result, R-wave power, 120Hz short Rwav; // moving average of R-wave power, energy unsigned short n=25; // 25,26, ..., 49 unsigned short Trigger; #define HIGH 100 // trigger when over this #define LOW 20 // reset when under this unsigned short Rcount; // number of R-waves unsigned short Rfirst; // time of first R-wave unsigned short Rlast; // time of last R-wave unsigned short HeartRate; // units bpm void main(void) { unsigned short time; // units 1/120sec short lpfSum=0,hpfSum=0,RwavSum=0; LCD_Open(); LCD_OutString("EKG System - Valvano"); Fifo_Init(); ADC_Init(); // Activate ADC Timer_Init(); // initialize 480Hz OC3 Trigger =0; // looking for HIGH for(;;) { Rcount = 0; Rlast = 0; for(time=0;time<600;time++){ // 120 Hz, every 5 second while(Fifo_Get(&Data)){}; // Get data from background thread LCD_Plot(Data); // draw voltage versus time plot n++; if(n==50) n=25; x[n] = x[n-25] = Data; // new data lpfSum = lpfSum+x[n]-x[n-4]; y[n] = y[n-25] = lpfSum/4; // Low Pass Filter hpfSum = hpfSum+y[n]-y[n-10]; z[n] = z[n-25] = y[n]-hpfSum/10; // High Pass Filter w[n] = w[n-25] = (z[n]*z[n])/10; // Power calculation RwavSum = RwavSum+w[n]-w[n-24]; // 200ms wide moving average Rwav = RwavSum/24; if(Trigger){ if(RpowHIGH)&&((time-Rlast)>30)){ // max HR= 240bpm Trigger = 1; // found high if(Rcount){ Rlast = time; // mark time of last R-wave, units 1/120sec } else{ Rfirst = time; // mark time of first R-wave } Rcount++; } } } if(Rcount>=2){ HeartRate = (7200*(long)(Rcount-1))/(long)(Rlast-Rfirst); } else{ HeartRate = 0; } LCD_OutUDec(HeartRate); // display results } } //Program 12.4. Measurement of heart rate.