Das Hauptprogramm : case B_MESSEN : // a counter = 0; r = 0; e = 0; test_isrT1 = 0; // Laufvariablen für die Interrupt service routines test_isrT2 = 0; // vom Timer 1 und Timer 2 löschen while (r <= 1000) { while (e <= 1000) { // Timer 1 Control Byte (Timer 1 stoppen wird erst später benutzt) // TMOD = TMOD & 0x0F; TF1 = 0; // Timer 1 overflow bit (deleted) TR1 = 0; // Timer 1 run bit (deleted) // IT1 = 1; // Interrupt negativ flankengetriggert // Timer 2 Control Bits T2CON = 0x00; // Timer 2 gestoppt, kein Reload, negative Flanke für CC0 CCEN = 0x04; // CC1 capture on rising edge // Register der Timer löschen TL1 = 0; TH1 = 0; TL2 = 0; TH2 = 0; // Register der Capture - Unit (CC0 & CC1) vom Timer 2 löschen CRCL = 0; CRCH = 0; CCL1 = 0; CCH1 = 0; // Interrupt enable flags im IEN0 und IEN1 EAL = 1; // All interrupt are enabled EX1 = 0; // Disable Interrupt for T1 EX3 = 0; // Disable Interrupt for CC0 EX4 = 0; // Disable Interrupt for CC1 ET1 = 0; ET2 = 0; while ((!IEX4) && (counter < 500) && (test_isrT2 == 0)) { if (IEX4); // Erst wenn die Periode T2 begint wird Timer 2 gestartet { printf ("Here \n"); IEX4 = !(IEX4); T2CON = 0x01; // Timer 2 start in capture mode at 1MHz frequency EX4 = 1; // Enables the Interrupt for CC1 on rising edge } counter = counter + 1; } if (counter >= 500) { printf ("T2 konnte nicht gelesen werden"); r = 1001; e = 1001; } CCEN = 0x01; // Capture mode on CC0 printf ("bis here \n"); IEX3 = 0; IE1 = 0; if (IE1) { // Timer 2 in "capture mode", bei CC1 wird die Zeit T1 für die X-Achse gemessen. while (test_isrT2 == 1) { T2CON = 0x01; // Timer 2 starten in capture mode bei 1MHz EX3 = 1; // External interrupt enable for CC0 } while (test_isrT1 == 0) { TMOD = TMOD | 0x90; // Timer 1 in "gated mode", starts only if TR1 & IEX1 = 1 TR1 = 1; // Timer 1 starten EX1 = 1; // External interrupt enable for T1 } } } } printf("%c", B_MESSEN); e = 0; r = 0; break; Und die Interrupt Service Routinen : void timer1_Int (void) interrupt 2 // Y-Achse T1 { // Diese ISR wird die Impulsbreite T1 (ms) für die Y-Achse aufnehmen // und wird dann mit der Periodendauer T2 (die für X und Y gleich ist) // als Algorithmus die Beschleunigung ausgeben. TR1 = 0; // Timer 1 gestoppt // Timer 1 Register einlesen und g-Wert ausrechnen für Y T1_Y = TH1; T1_Y = T1_Y << 8; T1_Y = T1_Y | TL1; Y = (((T1_Y/T2)-0.5)/0.125); ACC_ARRAY_Y[e] = Y; // Wert als Array speichern e = e + 1; test_isrT1 = 1; // ISR Laufvariable TH1 = 0; // Register mit Zählwert TL1 = 0; // von T1 löschen IE1 = !(IE1); // Interrupt flag löschen } void timer2_CC0_Int (void) interrupt 10 // X-Achse T1 { // Diese ISR wird die Impulsbreite für die X-Achse einlesen // und zusammmen mit T2 den Beschlwert ausgeben T2CON = 0x00; // Timer 2 stoppen // Register der CC0 einlesen und g-Wert ausrechnen für X T1_X = CRCH; T1_X = T1_X << 8; T1_X = T1_X | CRCL; // Beschlwert berechnen und speichern X = (((T1_X/T2)-0.5)/0.125); ACC_ARRAY_X[r] = X; // Wert als Array speichern r = r + 1; test_isrT2 = 0; // ISR Laufvariable TL2 = 0; // Zählregister des TH2 = 0; // Timers und der CRCL = 0; // Capture unit CC0 CRCH = 0; // löschen IEX3 = 0; // Interrupt flag löschen } void timer2_CC1_Int (void) interrupt 11 // X & Y-Achse T2 { // Diese ISR wird die Periodendauer für die X und Y-Achse // T2 einlesen und weiterverarbeiten T2CON = 0x00; // Timer 2 stoppen // Register der CC1 einlesen und Periodendauer T2 speichern T2 = CCH1; T2 = T2 << 8; T2 = T2 | CCL1; // Register von Timer 2 löschen TL2 = 0; TH2 = 0; // Register der CC1 löschen CCL1 = 0; CCH1 = 0; counter = 0; // counter löschen test_isrT2 = 1; // Laufvariable setzen // printf ("bis here T2 \n"); IEX4 = 0; // Interrupt flag löschen }