//
//(Listing 1  Watchdog Beispiel)
//
#include <msp430.h>
int main(void) {
	WDTCTL=WDTPW|WDTHOLD;// Watchdog deaktivieren
	BCSCTL3|=LFXT1S_2;// ACLK = VLO (ca. 12 kHz)
	WDTCTL=WDTPW|WDTCNTCL|WDTSSEL;// Start Watchdog mit ACLK
	P1DIR|=0x01;// P1.0 als Ausgang festlegen (LED)
	for(;;) {
		volatile int i;
		P1OUT ^= 0x01;// LED Zustand ndern (Ein/Aus)
		for (i=10000;i>0;i--);// Warteschleife etwa 40 Millisek.
		WDTCTL=WDTPW|WDTCNTCL|WDTSSEL; // Rcksetzen des Watchdog
	}
}



//
//(Listing 2  GPIO mit Pullup/Pulldown)
//
int main(void) {
	int gpio_in;
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren
	P1DIR=0x0F; // Richtung, Bit 0-3 Ausgang, Bit 4-7 Eingang
	P1REN=0xF0; // Pullup/down Widerstand aktivieren, Bit 4-7
	P1OUT=0xC0; // Pullup fr Bit 6-7, Pulldown fr Bit 4-5
	P1OUT|=BIT0; // Ausgang Bit 0 setzen
	P1OUT&=~BIT0; // Ausgang Bit 0 zurcksetzen/lschen gpio_in=P1IN&0xF0; // Lesen der Eingnge, Bit 4-7
}



//
//(Listing 3  GPIO mit Interrupt)
//
int main(void) {
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren
	P1DIR=0x41; // P1.0 (LED Rot) und P1.6 (LED Grn) als Ausgang
	P1REN=BIT3; // P1.3 (Taster S2) Widerstand aktivieren
	P1OUT=BIT3; // Pullup fr P1.3 (S2)
	P1IE=BIT3; // Interrupt aktivieren fr P1.3 (S2)
	P1IES=BIT3; // High-Low Wechsel soll Interrupt auslsen
	_BIS_SR(GIE); // Interrupts global aktivieren
	P1OUT|=0x40; // Grne LED einschalten, rote LED ausschalten while (1) ; // Endlosschleife
}

#pragma vector = PORT1_VECTOR
__interrupt void GPIO_Port1(void)
{
	P1OUT^=0x41; // LED's wechseln mit XOR Funktion
	P1IFG&=~BIT3; // Interruptflag lschen
}



//
//(Listing 4  Timer mit Capture/Compare und Interrupt Routine)
//
int main(void) {
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren 
	BCSCTL3|=LFXT1S_2; // ACLK = VLO (12 kHz) 
	TACCR0=2400; // 5 Interrupts/Sekunde (12000/2400) 
	TACCTL0=CCIE; // Timer Interrupt fr CCR Event 
	TACTL=TASSEL_1|MC_1; // Timerclock = ACLK, Up Mode 
	P1DIR=0x41; // P1.0 (LED Rot) und P1.6 (LED Grn) als Ausgang 
	P1OUT|=0x40; // Grne LED einschalten, rote LED ausschalten 
	_BIS_SR(GIE); // Interrupts global aktivieren 
	while (1) ; // Endlosschleife
}

#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
	P1OUT^=0x41; // LED's wechseln mit XOR Funktion
	TACCTL0&=~CCIFG; // Interruptflag lschen
}



//
//(Listing 5  Timer erzeugt PWM Signal)
//
int main(void) {
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren 
	DCOCTL=CALDCO_1MHZ;// 1 MHz Takt, kalibriert 
	BCSCTL1=CALBC1_1MHZ;// 1 MHz Takt, kalibriert 
	TACCR0=10000;// PWM Frequenz 100Hz 
	TACCR1=625;// Tastverhltnis ~6% 
	TACCTL1=OUTMOD_6;// Timer Interrupt fr CCR Event 
	TACTL=TASSEL_2|MC_1; // Timerclock = SMCLK, Up Mode 
	P1DIR=0x40;// P1.6 (LED Grn) als Ausgang 
	P1SEL=0x40;// P1.6 mit Signal TA0.1 
	P1REN=BIT3;// P1.3 (Taster S2) Pullup Widerstand aktivieren 
	P1OUT=BIT3;// Pullup fr P1.3 (S2) 
	P1IE=BIT3;// Interrupt aktivieren fr P1.3 (S2) 
	P1IES=BIT3;// High-Low Wechsel soll Interrupt auslsen 
	_BIS_SR(GIE);// Interrupts global aktivieren 
	while (1) ;// Endlosschleife
}

#pragma vector = PORT1_VECTOR
__interrupt void GPIO_Port1(void)
{ 
	if (TACCR1==0) TACCR1=625; // Initialwert setzen 
	else TACCR1*=2;// Tastverhltnis verdoppeln 
	if (TACCR1>10000) TACCR1=0; // berlauf verhindern 
	P1IFG&=~BIT3; // Interruptflag lschen
}



//
//(Listing 6  AD Wandler mit Vref 2,5V)
//
unsigned int value;

int main(void) {
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren 
	P1SEL2=BIT4; // P1.4 = Vref+ 
	ADC10CTL0&=~ENC; // AD Wandler vor Config abschalten 
	ADC10CTL0=SREF_1|ADC10SHT_1|REFOUT|REF2_5V|REFON|ADC10ON|ADC10IE; 
	ADC10CTL1=INCH_7|ADC10SSEL_0|CONSEQ_0; 
	ADC10AE0=BIT7; // Eingang als Analogeingang konfigurieren 
	ADC10CTL0|=ENC+ADC10SC;// Messung ausfhren 
	_BIS_SR(GIE); // Interrupts global aktivieren 
	while (1) ; // Endlosschleife
}

#pragma vector = ADC10_VECTOR
__interrupt void ADC10(void)
{
	unsigned int *CalADC25=(unsigned int*)0x10E6;
	value=ADC10MEM; // Messwert auslesen 
	value=*CalADC25/32768; // Messwert Korrektur
	ADC10CTL0=0; // AD Wandler abschalten
}



//
//(Listing 7  UART mit 9600 Baud)
//
unsigned char recByte[1];
unsigned char transData[]=0x77; // Zeichen 'w'

int main(void) {
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren 
	DCOCTL=CALDCO_1MHZ;// 1 MHz Takt, kalibriert 
	BCSCTL1=CALBC1_1MHZ;// 1 MHz Takt, kalibriert 
	P1SEL=BIT1|BIT2;// P1.1 = RXD, P1.2=TXD 
	P1SEL2=BIT1|BIT2;// P1.1 = RXD, P1.2=TXD 
	UCA0CTL0=0;// Format N81 (no parity) 
	UCA0CTL1|=UCSSEL_2|UCSWRST; // CLK = SMCLK 
	UCA0BR0=104;// 1MHz:9600=104,2 
	UCA0BR1=0x00; 
	UCA0MCTL=UCBRS0;// Modulation des Baudratentakt 
	UCA0CTL1&=~UCSWRST;// UART betriebsbereit schalten 
	IE2|=UCA0RXIE|UCA0TXIE; // TX/RX interrupt freigeben 
	_BIS_SR(GIE);// Interrupts global aktivieren 
	while (1) ;// Endlosschleife
}

#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI_TX(void)
{ 
	__delay_cycles(2000); // Warteschleife 2 Millisekunden 
	UCA0TXBUF=transData[0]; // Aktuelles Zeichen senden
}

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI_RX(void)
{ 
	recByte[0]=UCA0RXBUF;// Empfangsbyte speichern
	transData[0]=0x20;// Daten ndern bei Empfang, SPACE
}



//
//(Listing 8  Active Mode mit 12 kHz)
//
int main(void) {
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren 
	DCOCTL=0; 
	BCSCTL1=0; 
	BCSCTL2=SELM_3|SELS;// VLO=12kHz 
	BCSCTL3=LFXT1S_2;// niedrigste Taktfrequenz in Actice Mode
	while (1) ;// Endlosschleife
}



//
//(Listing 9  Low Power Mode 3)
//
unsigned char recByte[1];

int main(void) {
	WDTCTL=WDTPW|WDTHOLD; // Watchdog deaktivieren 
	BCSCTL3|= XCAP_3;// 12,5 pF fr 32,768 kHz Quarz 
	P1DIR=P2DIR=0xFF;// alle unbenutzten Pins als Ausgnge 
	P1OUT=P2OUT=0;// alle unbenutzten Ausgnge auf Low 
	P1SEL=BIT1|BIT2;// P1.1 = RXD, P1.2=TXD 
	P1SEL2=BIT1|BIT2;// P1.1 = RXD, P1.2=TXD 
	UCA0CTL0=0;// Format N81 (no parity) 
	UCA0CTL1|=UCSSEL_1|UCSWRST; // CLK = ACLK 
	UCA0BR0=3;// 32768:9600=3,41 
	UCA0BR1=0;// Baudratentakt 
	UCA0MCTL=UCBRS_3;// Modulation des Baudratentakt 
	UCA0CTL1&=~UCSWRST;// UART betriebsbereit schalten 
	IE2|=UCA0RXIE; // RX interrupt freigeben 
	_BIS_SR(LPM3_bits|GIE); // Interrupts aktivieren & Low Power Mode 3 
	while (1) ;// Endlosschleife
}

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI_RX(void)
{ 
	recByte[0]=UCA0RXBUF;// Empfangsbyte speichern 
	if (recByte[0]==0xFF) _BIC_SR_IRQ(LPM3_bits);
}
