Aufgabe: Gefragt ist nach der zuverlässigen Erkennung eines sich verändernden Signals. Signaltypen: a: 100Hz Frequenz mit PWM von 25% b: 100Hz Frequenz mit PWM von 50% c: 100Hz Frequenz mit PWM von 75% ################################################################################ #include "msp430g2553.h" // Headerdatei für MSP430 G2553 einbinden //#include "addon_board.h" // Headerdatei für Erweiterungsplatine unsigned int rising_edge, falling_edge, time_impuls; int durchlauf = 1; void main (void) { WDTCTL = WDTPW + WDTHOLD; // Stoppt den WDT //Port konfigurieren P1DIR |= 0x10; // Ausgang für b-Signal P1DIR |= 0x20; // Ausgang für c-Signal P1DIR |= 0x40; // Ausgang für a-Signal P1DIR &=~0x08; // S2 als Eingang (Frequenzeingang) P1SEL |= 0x08; // TA1 Funktion //P1REN |= 0x08; // Eingang als Pull_Up auswählen (default Wert = "1") //P1OUT |= 0x08; // Eingang als Pull_Up aktivieren //P1IE |= 0x08; // Interrupt aktivieren bei bestätigen des S2 //P1IES = 0; // Auf neg. Flanke //P1IFG = 0; // Interruptflag auf 0 setzen //Timer konfigurieren: TA1CTL = TASSEL_2; // Taktquelle des Timers auswählen, hier SMCLK mit f=1MHZ => T= 1microSec TA1CTL = MC_1; // Einstellen des Modus, hier Up Mode => Timer zählt bis zum Wert TACCR0 TA1CTL = TACLR; // Reset von TAR, Clock divider und Zählrichtung TA1CCTL1= CM_3; // Erfassung bei steigenden und fallenden Flanke TA1CCTL1= CAP; // Capture mode ausgewählt CCTL1= CCIE; // Aktivierung der Interrupts TA1CCTL1= CCIS1; // Synchronisierung der des erfassten Wertes mit der TimerClock TACCR0 = 10000; // TACCR0-Wert beschreibt den maximalen Zählwert 10.000microSec = 100ms _BIS_SR(GIE); // Global Interrupt Enable while(1) { if (time_impuls > 7400) // Grenzen: 7400-7600 { P1OUT |= 0x20; } if (time_impuls > 4900) { // Grenzen: 4900-5100 P1OUT |= 0x10; } if (time_impuls > 2400) // Grenzen: 2400-2600 { P1OUT |= 0x40; } } } #pragma vector=TIMER1_A1_VECTOR __interrupt void Timer_isr (void) { if (durchlauf == 1) { TACCR1 = rising_edge; durchlauf++; } if (durchlauf == 2) { TACCR1 = falling_edge; time_impuls = (falling_edge - rising_edge); durchlauf = 1; falling_edge = 0; rising_edge = 0; P1IFG= 0; } }