#include <msp430f167.h>
#include <intrinsics.h>

void Init_ADC(void); //ADC init
void Read_ADC(void); //Temp. T1 - T8 lesen
void SendUSART0 (void);
void init_XT(void); //Ext. Quarz 8MHz

static char Digit[8];

void main(void)
{
	init_XT();  //Ext. Quarz 8MHz und Stop WDT

//Definition des Port C fÃ¼r P3.4 bis P3.5 für RS232

    P3SEL |= 0x30;                    //Port C P3.4 bis P3.5 Aux Funktion

    ME1 |= UTXE0 + URXE0;		       //USART0 Rx + Tx einschalten
    UCTL0 |= CHAR; 		             //USART0 8N1
    UTCTL0 |= SSEL0; 			//ACLK
    UBR00 = 0x45;                       // 115200 baud aus 8 MHz erzeugen
    UBR10 = 0x00;                       // 
    UMCTL0 = 0x00;                      // keine korrektur der division noetig
    UCTL0 &= ~SWRST;        		// USART0 freigeben
    IE1 |= UTXIE0;          		// TX-interrupt anschalten
    IFG1 &= ~UTXIFG0;  		      // initales interrupt-flag loeschen

__enable_interrupt();                   //Globale Intrrupts freigeben

	Init_ADC();                      //A/D- Wandler einstellen

	while (1)
	{

		Read_ADC();             //A/D- Wandler starten

	//	SendUSART0 ();  // Diese Funktion bringt nur Müll raus !!!

	}
}

//Ab hier Funktionen

void init_XT(void) // Ext. Quarz 8MhZ
{
  unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL
  do
  {
    IFG1 &= ~OFIFG;                       // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);           // Time for flag to set
  }
  while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)
}

/*                           Diese Funktion brigt nur Müll raus!!!
void SendUSART0 (void)
{
	char i, j;

	for (j=0; j<8; j++)
	{
  for (i=0; i < sizeof Digit[j]; i++)
    U0TXBUF = Digit[j];

	}
}
*/

void Init_ADC(void)
{
  P6SEL = 0xFF;                       // AnalogeingÃ¤nge A0 - A7 (P6.0 - P6.7)
  ADC12CTL0 = ADC12ON + MSC + SHT0_12;
  ADC12CTL1 = ADC12DIV_7 + SHP + CONSEQ_1;
  ADC12MCTL0 = SREF_2 + INCH_0;       // Wert von A0 landet in ADC12MEM0
  ADC12MCTL1 = SREF_2 + INCH_1;       // Wert von A1 landet in ADC12MEM1
  ADC12MCTL2 = SREF_2 + INCH_2;       // Wert von A2 landet in ADC12MEM2
  ADC12MCTL3 = SREF_2 + INCH_3;       // Wert von A3 landet in ADC12MEM3
  ADC12MCTL4 = SREF_2 + INCH_4;       // Wert von A4 landet in ADC12MEM4
  ADC12MCTL5 = SREF_2 + INCH_5;       // Wert von A5 landet in ADC12MEM5
  ADC12MCTL6 = SREF_2 + INCH_6;       // Wert von A6 landet in ADC12MEM6
  ADC12MCTL7 = SREF_2 + INCH_7 + EOS; // Wert von A7 landet in ADC12MEM7
  ADC12IE = 0x02;                     // ADC Interrupts freigeben
  ADC12CTL0 |= ENC;                   // Konvertierung freigenben
}

void Read_ADC(void)
{
  ADC12CTL0 |= ADC12SC;               // Neue Konvertierung starten
}

//Ab hier ISR's

#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{

	Digit[0] = ADC12MEM0;
	Digit[1] = ADC12MEM1;
	Digit[2] = ADC12MEM2;
	Digit[3] = ADC12MEM3;
	Digit[4] = ADC12MEM4;
	Digit[5] = ADC12MEM5;
	Digit[6] = ADC12MEM6;
	Digit[7] = ADC12MEM7;

}

// UART0 TX ISR                 Diese ISR bringt nichts raus!!!
#pragma vector=USART0TX_VECTOR
__interrupt void usart0_tx (void)
{
	char i, j;
	for (j=0; j<2; j++)
	{
  for (i=0; i < sizeof Digit[j]; i++)
    TXBUF0 = Digit[j];

	}
}