/* Messung eines "EKG" und Ausgabe auf Grafik-FKA + Speichern auf SD*/ // // MSP430F168 // ----------------- // | XIN|- 32,768kHz // | | // Taster rot--|RST (58) XOUT|- 32,768kHz // | P2.0|Programm Taster 1 // 8 Mhz X2IN- | P2.1|Programm Taster 2 // P2.2|RxD BSL // | P2.4|Programm Taster 3 // P2.5|Eingang Akku tief --- Überwachung der Akku-Spannung durch Schaltregler, //8 MHz X2OUT- | P1.1|TxD BSL // | P1.7|LED rot // | | // | P3.0| CS SPI SD-Karte (28) // | P3.1|-> Daten Ausgang (29) // URXD0 |P3.5 P3.2|<- Data In (SOMI0) (30) // UTXD1 |P3.6 P3.3|-> Serial Clock Out (UCLK) (31) // URXD1 |P3.7 P3.4| Vss2 SD // // P4.0-P4.7| Daten FKA (36)..(43) // P5.0| Steuerung FKA C/D // P5.1| Steuerung FKA /RD // P5.2| Steuerung FKA /WR // P5.3| Steuerung FKA /CE // P5.4| frei // P5.5| frei // P5.6| frei // P6.7| EKG spannung void EKG (void) { unsigned int adrr,YW,MW,MW1,MWabs,zm; int MWdif; MW1 = MWroh>>6; //4096/32=128 Anpassung an FKA if (MW1 >68)goto Bildpunkt_nicht_setzen ; //MW1 > 68 werden nicht zu Anzeige gebracht, damit MWdif = MW1-MWalt; // keine unlöschbaren Zeichen entstehen MWabs = abs(MWdif); if ((MW1 > MWalt)&&(MWabs > 4)) //bei Messwertdifferenz >4 Bildpunkte werden beide Bildpunkte //durch eine senkrechte Linie verbunden { for (zm=0;zm< MWabs;zm++) { MW =MWalt; YW=(128-MW)-B; // weil 0 oben ist; 128 Zeilen B= Verschiebung der Kurve in y-Richtung MWalt = MWalt+1; adrr=0x200 + XW/6 + YW*40; //cGraphColumns; // Berechnung der Adresse, 0x200 = Beginn des Grafikbereichs // 6 Bildpunkte pro Adresse; WriteData(adrr %256); // unteres Adressbyte mod = Rest adrr/256 WriteData(adrr >> 8); // oberes Adressbyte adrr >> 8 WriteCtrl(0x24); WriteCtrl(0xF8 | (5-XW % 6)); //1111 1 xxx 1 setz einen Bildpunkt; // WriteCtrl(0xF0 | (5-XW % 6)); //1111 0 xxx 0 löscht einen Bildpunkt; } MWalt= MW1; } if ((MW1 < MWalt)&&(MWabs >4)) { for (zm=0;zm < MWabs;zm++) { MW =MWalt; YW=(128-MW)-B; // weil 0 oben ist; 128 Zeilen MWalt = MWalt-1; adrr=0x200 + XW/6 + YW*40; //cGraphColumns; // Berechnung der Adresse, $200 = Beginn des Grafikbereichs // 6 Bildpunkte pro Adresse; WriteData(adrr %256); // unteres Adressbyte mod = Rest adrr/256 WriteData(adrr >> 8); // oberes Adressbyte adrr >> 8 WriteCtrl(0x24); WriteCtrl(0xF8 | (5-XW % 6)); //1111 1 xxx 1 setzt einen Bildpunkt; // WriteCtrl(0xF0 | (5-XW % 6)); //1111 0 xxx 0 löscht einen Bildpunkt; } MWalt= MW1; } else { MW = MW1+1; YW=(128-MW)-B; // weil 0 oben ist; 128 Zeilen adrr=0x200 + XW/6 + YW*40; //cGraphColumns; // Berechnung der Adresse, $200 = Beginn des Grafikbereichs // 6 Bildpunkte pro Adresse; WriteData(adrr %256); // unteres Adressbyte mod = Rest adrr/256 WriteData(adrr >> 8); // oberes Adressbyte adrr >> 8 WriteCtrl(0x24); WriteCtrl(0xF8 | (5-XW % 6)); //1111 1 xxx 1 setzt einen Bildpunkt; // WriteCtrl(0xF0 | (5-XW % 6)); //1111 0 xxx 0 löscht einen Bildpunkt; MWalt= MW1; } z=0; // Zählwert für Anzahl der Kurven Bildpunkt_nicht_setzen: //Marke XW=XW+1; } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { if ((P2IN&BIT5) != BIT5)Akku_tief(); //Akkuüberwachung MWroh= ADC12MEM0; //Übergabe des Messwertes an MWroh zwischenspeichern_1(); // für Speichern auf SD-Karte if (t==512) // für Speichern auf SD-Karte; mit 512 ist Sektor voll, eigentlich 511, { mmcWriteSector(sektor,mmc_buffer); // für Speichern auf SD-Karte; t=0; // für Speichern auf SD-Karte; sektor=sektor+1; // für Speichern auf SD-Karte; } Puls(); // Pulsberechnung und Anzeige if(z==2) // nur jeder 3.Wert für einen Bildpunkt auf FKA { EKG(); if (Bild2==2) { Grafik_loeschen(); XW=0; B=50; // B = Verschiebung der Kurve in y-Richtung Bild2=0; } if (XW > 239) { XW=0; B=0; Bild2 = Bild2+1; } } z=z+1; // Zählwert für Anzahl der Kurven }