


*


int x=0;
int i;
int n=0;
int checksum, checksum16;
int tempCs=0;
int clock_tick;
int perioden_dauer;
float const ticks= 0.0179;  //   1/56
int nibble_anzahl=8;
int nibble_lengthinticks[8];
float messwerte_interrupt[8];

int druck [3];
int tepmeratur [3];
uint8_t messwerte_Druck [255];
uint8_t messwerte_Temperatur[255];
int messwerte_checksum;
float const zeit_in_us= 0.0167;       // 0,0167= 1/60 (prescaler=1)
bool synchronisiert_b = false;
bool  message_complete_b= false;
bool message_succeeded = false;
bool zaehler = false;
bool interrupt=false;
int sync_clk_tick =56;
int nibble_min;
int nibble_max;
int sync_min= 10080; 	  // 168 ?s
int sync_max = 12000;	  //200 ?s
//int sync_max_1= 231;
int n_nibble = 0;
int Abweichung=10;
float nibble_in_tick;
uint8_t  message[8]; //Werte in diesem Array reichen von 0 bis 15
int messwerte[8];
uint8_t value;
uint8_t value1;



int CRC4legacy_table[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
	13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2,
	7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,
	10,11,8,9,14,15,12,13,2,3,0,1,6,7,4,5,
	14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1,
	3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,
	9,8,11,10,13,12,15,14,1,0,3,2,5,4,7,6,
	4,5,6,7,0,1,2,3,12,13,14,15,8,9,10,11,
	1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,
	12,13,14,15,8,9,10,11,4,5,6,7,0,1,2,3,
	6,7,4,5,2,3,0,1,14,15,12,13,10,11,8,9,
	11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4,
	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,
	2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13,
	8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,
5,4,7,6,1,0,3,2,13,12,15,14,9,8,11,10};


int CRC4Recom_table[]=  {0,13,7,10,14,3,9,4,1,12,6,11,15,2,8,5};


 void messwerte_vergleich(void);





ISR (TCC0_OVF_vect)
{



if (interrupt)
{

TCC0.CNT=0 ;


}
}



void zaehler_auswerten(void)
{
	
	
	if (PORTC.PIN3CTRL==PORT_ISC_FALLING_gc)
	
	{
		
		//perioden_dauer = (int) round(TCC0.CNT * zeit_in_us);

		
		perioden_dauer = TCC0.CNT;
		
		TCC0.CNT= 0;
		zaehler=true;
		
		
	}
	

}




		 

ISR(PORTC_INT0_vect) // interrupt f?r I/O Port
{
	cli();
												
												 
												 
								
	zaehler_auswerten();
	interrupt=true;
	
	
	if (perioden_dauer >= sync_min && perioden_dauer <= sync_max)       // synchronization and Communication
	
	{
		 
		synchronisiert_b = true;
		clock_tick = perioden_dauer*ticks;
		
		n_nibble = 0;
	}
	
	messwerte_vergleich();

	sei();
}






void messwerte_vergleich(void)
{
	
	
	
	if(synchronisiert_b  && zaehler)                                                   // synchronisiert ?
	{
		
		nibble_min=12*clock_tick;
		nibble_max=27*clock_tick;
		
		
		if((perioden_dauer >= nibble_min && perioden_dauer <= nibble_max))  // zeit entspricht einer nibble Periode ?
		{
			
			messwerte[n_nibble] =  perioden_dauer;
			n_nibble++;
			zaehler=false;
			
		}
		if (n_nibble >= nibble_anzahl)                                 // ein message soll nicht l?nger als 9 nibble sein
		{
			
			n_nibble = 0;
			message_complete_b = true;
			                                
		}
	}
	
	else
	{
		
		synchronisiert_b = false;
		
	}
}









void messwerte_auswerten(void)
{
	int i;
	for(i = 0; i< nibble_anzahl; i++)
	{
		message[i] =  round ((messwerte[i]-nibble_min)/clock_tick);  // Nibblewert in dezimalzahlen zwischen 0..15 speichern
	}

}




int checksum_legacy()
{
	checksum=5;
	for (i=1;i<nibble_anzahl-1;i++)
	{
		tempCs=message[i]+(checksum*16);
		checksum=CRC4legacy_table[tempCs];
	}
	// checksum with an extra "0" value
	/*tempCs=checksum*16;
	checksum=CRC4legacy_table[tempCs+1];*/
	return checksum;
}


int checksum_recomended()
{
	checksum16=5;
	for (i=1;i<nibble_anzahl-1;i++)
	{
		//checksum16= bitxor((message[i]),(CRC4Recom_table(checksum16+1)));
		checksum16= (message[i])^(CRC4Recom_table[checksum16]);
	}
	checksum16= 0 ^ CRC4Recom_table[checksum16];

	return checksum16;
}


//**********************************************************************************************************************************************************



/* output value when system is idle */
void SetIdleValue(void)
{
	if(Port == SER_PORT_AO0)
	{
		/* set AO0 */
		DACB.CH0DATA = IdleValue & 0x0FFF;	// limit output to 4095
	}
	else
	{
		int Port_bm;
		if(Port == SER_PORT_DO0)
		{
			Port_bm = PIN2_bm;
		}
		else
		{
			Port_bm = PIN3_bm;
		}
		
		if(IdleValue == 0)
		{
			PORTA.OUTCLR = Port_bm;
		}
		else
		{
			PORTA.OUTSET = Port_bm;
		}
	}
}







int main (void)
{
	
	sei();
	
	/* set system clock -> also change F_CPU definition in SENT2SERIAL.h! */
	funct_clock_init_PLL_60M();								// clock initialization 60 MHz
	//funct_clock_init_32M();								// clock initialization 32 MHz
	//funct_clock_init_2M();								// clock initialization  2 MHz
	//funct_clock_init_ext_16M();							// clock initialization 16 MHz
	
	
	
	funct_DACB_single0_enable(DAC_REFSEL_AVCC_gc);			// initialize DAC with internal Vcc		OR
	//funct_DACB_single0_enable(DAC_REFSEL_AREFA_gc);		// initialize DAC with external reference
	
	uart_InitUsartDriver();									// initialize RS232 communication
	
	
	IdleValue	= DEFAULT_IDLE_VAL;							// analog output -> 5 V (max.: 0x0FFF, 12 bit)
	Port		= SER_PORT_AO0;								// set analog output as idle port
	errorOut	= true;	   								    // turn off error messages by default
	debugOut	= true;									    // turn off debug messages by default
	
	
	
	if (debugOut)
	{
		uart_send_string(version);
		// send version number via RS232
		uart_send_string("\nSignalgenerator laeuft\n");
	}
	
	uart_send_string("\nSignalgenerator wurde initialisiert\n");
	
	func_glob_interrupt();
	funct_timer0_init();
	
	
	uart_send_string("\nENDE INITIALISIERUNGEN\n");
	
	
	
	
	/* main loop */
	

	
	while(1)
	{
		
		
		uart_StateMachine();
		
		if(synchronisiert_b && zaehler)
		{
			//uart_send_string("\nSignalgenerator Synchronisiert\n");
			
			//messwerte_vergleich();
			if(message_complete_b)
			{
				zaehler=false;
				messwerte_auswerten();
			
				//checksum_recomended();
				//uart_send_string("\n message_complete\n");
				  	
					 
				 //uart_send_data(message,8);
				//if(checksum16==message[8])
				
				if(checksum_recomended()==message[7])
				{
					
					//uart_send_string("\nMESSAGES Succeeded ON:\n");
					uart_send_string("\n-");
					  uart_send_data(message,8);
					
					
					
					
				}else
				{
					//uart_send_string("\nERROR Message ON:\n");
					//uart_send_data(message, 8);
					
					
				}
				
				
				
			}
			
		}
		
		
		
		
		
		
		
		
	}
	return 0;
}























