#include "ioaduc7060.h"
#include "Definitions.h"
#include "intrinsics.h"
#include "stdio.h"

int newDataRdy = 0;
unsigned long ADC0_Result;
unsigned long ADC1_Result;
float Spannung1 = 0.0;
float Spannung2= 0.0;
float ADC_factor;
volatile int laufvar1 = 0;
volatile int laufvar2 = 0;
volatile int val = 0;
volatile int val2 = 0;
volatile int z = 0;
float ADC_Spannung1 = 0.0;
float ADC_Spannung2 = 0.0;
int AusgabeU1 = 0;
int AusgabeU2 = 0;
float U1BUF[200];
float U2BUF[200];
int dummy = 0;
int Kanalstatus = 0;

int main(void)
{	    
// CPU-Speed festlegen

	POWKEY1 = 0x1;							// Vorgabe muss (0x1)hex gesetzt werden
	POWCON0 = 0x78;							// (0x78)hex für maximalen CPU-Speed (10.24MHz)
	POWKEY2 = 0xF4;							// Vorgabe muss (0x1)hex gesetzt werden

        __enable_interrupt();    
        
// Ports definieren

	GP1DAT =  BIT30;	 					// Port1.6 (LED-Port) als Output setzen
       
        ADC0_Configuration();
        
// Timer1 konfigurieren
        
        //T1LD = 0x28000;                                                 // 5s
        T1LD = 0x147;                                                 // 100Hz
        T1CON = BIT6 +                                                  // periodic mode , count down
                BIT7;                                                   // Timer1 Enable Bit , 32.768 kHz
          
// Interrupts

	IRQEN =   BIT4;                                                // Timer 1 Interrupt
                  
        printf("Spannung[V]\n");
          
        ADC_factor = ((Uref / GainFaktor / 0xFFFFFF) / (R1 / (R1 + R2)));
        
	while(1)
	{ 
          //printf("test\n");
	  if(newDataRdy == 1)
          {
            FktSpannung();	
          
            if((AusgabeU1 == 1) && (dummy == 1))
              U1BUF[val++] = Spannung1;
            
            else if((AusgabeU2 == 1) && (dummy == 1))
              U2BUF[val2++] = Spannung2;
            
            if(val > 199)
            {
              while(z < 200)
              {
               printf("%8.6f\n",U1BUF[z]);
              // printf("%8.6f\n",U2BUF[z]);
               z++;
              }
              z = 0;
              val = 0;
              val2 = 0;
            }
            
            dummy++;
            if(dummy > 1)
               dummy = 0;
           }
          IRQEN =   BIT4;                                               // Timer1 Interrupt enable
        }   
}

void FktSpannung() 
{
  switch(Kanalstatus)
  {         
    case 0:  
    { 
      laufvar1++; 
      ADC_Spannung1 = ((float)ADC0_Result) * ADC_factor;
      Spannung1 = (ADC_Spannung1 - Offset) / Gain;
      newDataRdy = 0; 
      break;
     }
    case 1:  
    { 
      laufvar2++;
      ADC_Spannung2 = ((float)ADC0_Result) * ADC_factor;
      Spannung2 = (ADC_Spannung2 - Offset) / Gain;
      newDataRdy = 0;
      break;
    }
  }
  if(laufvar1 > 1)
              {
                Kanalstatus = 1;
                laufvar1 = 0;
              }
  
  if(laufvar2 > 1)
                {
                  Kanalstatus = 0;
                  laufvar2 = 0;
                }
}

__irq __arm void IRQ_Handler(void)
{
  unsigned long IRQSTATUS = 0;
  unsigned long ADCSTATUS = 0;

  IRQSTATUS = IRQSTA;                                                   // Interruptstatusübergabe
  ADCSTATUS = ADCSTA;
   
   if ((IRQSTATUS & BIT10) == BIT10)		                      // Überprüfen auf ADC Interrupt	
	{
	  if(newDataRdy == 0)
          {
            ADC0_Result = ADC0DAT;                                       // ADC-Result-Übergabe
            newDataRdy = 1;
          }
	  IRQCLR = BIT10;                                               // ADC Interrupt löschen
          GP1DAT ^= BIT22;
	  }
   
    if ((IRQSTATUS & BIT4) == BIT4)		                      // Überprüfen auf Timer1 Interrupt	
	{
	   switch(Kanalstatus)
           {
            case 0:  
            { 
              ADC0CON = BIT4 +                                                         // external reference inputs (VREF+, VREF-), Gain = 1
                        BIT12 +                                                       // if External Reference for ADC0 exceeds 1.35V
                        BIT15;                                                         // enable the Primary-ADC , AIN0/AIN1 (Differential mode)    

              T1CLRI = 0x55;		                                              // Clear the currently active Timer1 Irq
              AusgabeU1 = 1;
              AusgabeU2 = 0;
              IRQEN = BIT10;                                                          // ADC-Interrupt enable
              break;
             }
            case 1:  
             {
                ADC0CON = BIT4 +                                                        // external reference inputs (VREF+, VREF-), Gain = 1
                          BIT15 +                                                        // enable the Primary-ADC 
                          BIT12 +                                                        // if External Reference for ADC0 exceeds 1.35V
                          BIT6 + BIT8;                                                   // AIN2/AIN3 (Differential mode)

                T1CLRI = 0x55;		                                                // Clear the currently active Timer1 Irq
                AusgabeU1 = 0;
                AusgabeU2 = 1;
                IRQEN = BIT10;                                                     // ADC-Interrupt enable
                break;
              }
            }
           /*
           if ((ADCSTATUS & BIT0) == BIT0)		                      // Überprüfen auf ADC-Data-Rdy
	   {
	    if(newDataRdy == 0)
            {
              ADC0_Result = ADC0DAT;                                       // ADC-Result-Übergabe
              newDataRdy = 1;
            }
            GP1DAT ^= BIT22;
	   } 
           */
          
        }
}

void delay (int length)
{
	while (length >0)
    	length--;
}