

/*==========================================================================
	Deklarationen, Definitionen und Allgemeine Zuweisungen
==========================================================================*/

#ifndef F_CPU					// nur wenn noch nicht eingebunden
#define F_CPU 8000000	     	// Dem C-Compiler mitteilen, dass 
								// die Taktfrequenz 16MHz ist.
#endif							// Ende der Einbindungsanweisung



//--------------------------------------------------------------------------
//		Einbinden von Headerdateien


#include <avr/io.h>				// I/O - Namen und Adressen
#include <avr/interrupt.h>		// Interruptnamen mit Vektoradressen
#include <util/delay.h>
#include <stdio.h>
#include "lcd-routines.h"

//--------------------------------------------------------------------------
//	Deklaration der Funktionen (Unterprogramme)

void InitSPI(void);
void AS8002_ChipEnable(void);
void AS8002_ADC_Enable(void);
void AS8002_Spannungserfassung(void);
char ReadByteSPI(char addr);
//--------------------------------------------------------------------------
//	Definition globaler Konstanten



//--------------------------------------------------------------------------
//	Definition globaler Variablen


char ChipMSB[20], ChipLSB[20], bufferMSB1[20], bufferLSB1[20], bufferMSB2[20], bufferLSB2[20], bufferMSB3[20], bufferLSB3[20];
volatile unsigned char ChipByte1, ChipByte2, VoltMSB1, VoltLSB1, VoltMSB2, VoltLSB2, VoltMSB3, VoltLSB3;
char byte;

/*========================================================
	Hauptprogramm
========================================================*/

int main(void)
{

		lcd_init();
		lcd_clear();

		InitSPI();
 		
		while(1)
		{

		_delay_ms(3);							// wandlungszeit tINIT AS8002 Datenblatt 7.1					

		
		AS8002_ChipEnable();
		 
		_delay_us(300);							// wandlungszeit tWAKEUP AS8002 Datenblatt 7.1
		
		

		AS8002_ADC_Enable();

		_delay_us(10);


		sprintf(ChipMSB," %x ",ChipByte1);
		 
		lcd_setcursor( 0,1 );					
		lcd_string(ChipMSB);

		sprintf(ChipLSB," %x ",ChipByte2);
		 
		lcd_setcursor( 4,1 );					
		lcd_string(ChipLSB);

//-------------------------------------------------------------------------
		
		sprintf(bufferMSB1," %x ",VoltMSB1);
		 
		lcd_setcursor( 8,1 );					
		lcd_string(bufferMSB1);

		sprintf(bufferLSB1," %x ",VoltLSB1);
		 
		lcd_setcursor( 12,1 );					
		lcd_string(bufferLSB1);		

//-------------------------------------------------------------------------

		sprintf(bufferMSB2," %x ",VoltMSB2);
		 
		lcd_setcursor( 0,2 );					
		lcd_string(bufferMSB2);

		sprintf(bufferLSB2," %x ",VoltLSB2);
		 
		lcd_setcursor( 4,2 );					
		lcd_string(bufferLSB2);

//-------------------------------------------------------------------------

		sprintf(bufferMSB3," %x ",VoltMSB3);
		 
		lcd_setcursor( 8,2 );					
		lcd_string(bufferMSB3);

		sprintf(bufferLSB3," %x ",VoltLSB3);
		 
		lcd_setcursor( 12,2 );					
		lcd_string(bufferLSB3);


		}

		return 0;
}


/*========================================================
	Funktionen und Intitialisierungen 
========================================================*/

// 	SPI - Initialisierung

void InitSPI(void)
{
DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);	 // Setze /SS, SCK und MOSI als Ausgang
PORTB = (1<<PB4);			 		 // /SS auf high

SPCR = (1<<SPE)|(1<<MSTR)|	   		 // SPI aktivieren, uC als Master, F_CPU/4	
	   (1<<CPOL)|(1<<CPHA);	     // SPI Modus 3

}

/*///////////////////////////////////////////////////////////////////////////////////////////////
Hinweis: Bei der Datenübertragung zum AS8002 ist darauf zu achten das, dass Adressbyte aus      /
		 oberen 7 Adressbits und einem unteren R/W Bit besteht. Deshalb müssen die im Datenblatt/
		 angegebenen Adressen immer um eins nach links geshiftet werden (Adresse << 1), weil	/
		 das erste Bit zum Lese - Schreibstatus benötigt wird (AS8002 Datenblatt Kapitel 7.6)	/									/
*////////////////////////////////////////////////////////////////////////////////////////////////		  


void AS8002_ChipEnable(void)
{

	PORTB &= ~(1<<PB4);			  // /SS auf low	 

//-----Control Register ansprechen und Daten übergeben------------------
 
	SPDR = 0x02;   				  // Adresse 01h + write mode = 0 ins SPDR schreiben							  
 	while (!(SPSR & (1<<SPIF)));  // Warten bis die Übertragung abgeschlossen ist
	SPDR;	



 	SPDR = 0x19;    			  // Daten ins Control Register schreiben 
								  // (chip_en=1 + pga_volt_en=1 + adcref_en=1)
 	while (!(SPSR & (1<<SPIF)));  // Warten bis die Übertragung abgeschlossen ist
	SPDR;

	PORTB |= (1<<PB4);  		  // /SS auf high

}

void AS8002_ADC_Enable(void)
{

	PORTB &= ~(1<<PB4);			  // /SS auf low	 

//-----Input Multiplexer Register ansprechen und Daten übergeben------------------
		

	SPDR = 0x06;    			  // Adresse 03h + write mode = 0 ins SPDR schreiben
 	while (!(SPSR & (1<<SPIF)));  // Warten bis die Übertragung abgeschlossen ist
	VoltMSB1 = SPDR;				  // Auslesen der 8Bit des MSB

 	SPDR = 0x11;    			  // Daten ins Input Multiplexer Register schreiben 
								  // (adc_en=1 + mux_sel=1)
 	while (!(SPSR & (1<<SPIF)));  // Warten bis die Übertragung abgeschlossen ist
	VoltLSB1 = SPDR;
	

	PORTB |= (1<<PB4);  		  // /SS auf high

	_delay_ms(1);

	PORTB &= ~(1<<PB4);			  // /SS auf low

	SPDR = 0x06;   				 							  
 	while (!(SPSR & (1<<SPIF)));  
	VoltMSB2 = SPDR;


	SPDR = 0x11;   				 							  
 	while (!(SPSR & (1<<SPIF))); 	
	VoltLSB2 = SPDR;
	

	PORTB |= (1<<PB4);  		  // /SS auf high

	_delay_ms(1);

	PORTB &= ~(1<<PB4);			  // /SS auf low

	SPDR = 0x06;   				 							  
 	while (!(SPSR & (1<<SPIF)));  
	VoltMSB3 = SPDR;

	SPDR = 0x11;   				 							  
 	while (!(SPSR & (1<<SPIF))); 	
	VoltLSB3 = SPDR;

	PORTB |= (1<<PB4);  		  // /SS auf high

}

void AS8002_Spannungserfassung(void)
{

		PORTB &= ~(1<<PB4);			  // /SS auf low	 

//--------Voltage Measurement MSB Register auslesen-----------------------------------
		 				
		SPDR = 0x25;    			  // Adresse 12h + read mode = 1 ins SPDR schreiben
 		while (!(SPSR & (1<<SPIF)));  // Warten bis die Übertragung abgeschlossen ist
// 		VoltMSB = SPDR;				  // Auslesen der 8Bit des MSB
 		
		

//--------Voltage Measurement LSB Register auslesen-----------------------------------		

		SPDR = 0x27;    			  // Adresse 13h + read mode = 1 ins SPDR schreiben
 		while (!(SPSR & (1<<SPIF)));  // Warten bis die Übertragung abgeschlossen ist
//		VoltLSB = SPDR;
		

		PORTB |= (1<<PB4);  		  // /SS auf high
 		
}

// 	SPI - Byte-Weise lesen

char ReadByteSPI(char byte)
{
	SPDR = byte;					//Load byte to Data register
	while(!(SPSR & (1<<SPIF))); 	// Wait for transmission complete 
	byte=SPDR;
	return byte;
}
