/*
 * TMC222.c
 *
 * Created: 01.09.2015 10:49:59
 *  Author: Chris
 */ 

//############################################################################
// Bibliotheken
//############################################################################

#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#include "TMC222_AVR.c"


//############################################################################
// Define
//############################################################################

#define F_CPU 16000000L								// Quarz
#define BAUD 250000L								// Baudrate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)		// clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))			// Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)			// Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif


//############################################################################
// Variablen
//############################################################################

volatile uint8_t dmx_array[5];							// DMX data
volatile uint8_t flag;							// new data available
volatile uint8_t dmx_adress=0;							// DMX Adress


//############################################################################
// Funktionen
//############################################################################

void delay_ms (uint16_t ms)
{
	for(uint16_t t=0; t<=ms; t++)
	_delay_ms(1);
}


//############################################################################
// DMX Empfangsrutine
ISR(USART_RXC_vect)
//############################################################################
{
	PORTB = (1<<PB0);
	static uint16_t dmx_channel, dmx_base;
	uint8_t status, data;
	int16_t index;

	// read UART data, also clears interrupt flag
	status = UCSRA;
	data = UDR;

	if (status & (1<<FE)) {					// frame error
		if (data==0) {						// break -> DMX Reset
			dmx_channel=0;
			dmx_base =dmx_adress ;			// DMX base address
			flag=1;							// trigger update
		}
		else								// rx error
		dmx_channel++;
	}
	else {
		index = dmx_channel-dmx_base;
		if (index>=0 && index<5)
		dmx_array[index]=data;
		dmx_channel++;
	}
	PORTB = 0;
}


//############################################################################
// Hauptprogramm
int main (void)
//############################################################################
{	
	char buffer[10];
	struct TMC222Par * value;
	value = (struct TMC222Par*)(unsigned char*)&buffer;
	
	struct TMC222Sta * value_sta1;
	value_sta1 = (struct TMC222Sta*)(unsigned char*)&buffer;
	
	uint16_t soll,ist;
	
	
	DDRA = 255;
	DDRB = (1<<PB0);
	
	
	//DMX-BUS
	UBRRH = (((F_CPU / (BAUD * 16L) - 1) & 0xFF00)>>8);
	UBRRL = (F_CPU / (BAUD * 16L) - 1) & 0x00FF;
	UCSRB|= (1 << RXEN) | (1<< RXCIE);							 // Enable RTX and Interupt
	UCSRC|= (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL) | (1<<USBS);    // 1 Stop bit, 8 Bits
	UDR    = 0;													 // clear USART data register
	UCSRA  = 0;
	
	sei();
	InitTWI();
	
	//Stepper Parameter
	value->IHold = 12;
	value->IRun = 15;
	value->VMin = 1;
	value->VMax = 4;
	value->Acc = 0;
	value->Shaft = 0x00;
	value->SecPosHi= 0x00;
	value->SecPosLo = 0x00;
	value->StepMode =  0x3;
	value->AccShape = 0;
	
	SetMotorParameters(value);
	GetFullStatus1(value_sta1);
		
	while(1){
		
		soll = dmx_array[1] * 66 + dmx_array[3];
		if (soll != ist){
			ist = soll;
			SetPosition(soll);
		}
	//	delay_ms(1000);
			
		PORTA = dmx_array[1];
	
		
	}
}