
#define F_CPU 8000000UL // 8 MHz clock speed


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/sleep.h>		//For Sleep-Mode
#include "global.h"
#include "i2cmaster.h"
#include "uart.h"
#include "rf12.h"


#define Dev1621 0x90
#define MY_SDA PC4
#define MY_SCL PC5

//RFM12
void send(unsigned char temp, unsigned char	temphalf);
void receive(void);


int main(void)
{

	//RFM
	rf12_init();					// ein paar Register setzen (z.B. CLK auf 10MHz)
	rf12_setfreq(RF12FREQ(433.92));	// Sende/Empfangsfrequenz auf 433,92MHz einstellen
	rf12_setbandwidth(4, 1, 4);		// 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
	rf12_setbaud(19200);			// 19200 baud
	rf12_setpower(0, 6);			// 1mW Ausgangangsleistung, 120kHz Frequenzshift

// 
// //DDRD |= (1<<PD6);	
// /	DDRC=0xff;

	// UART-Ausgabe
	 uart_init(UART_BAUD_SELECT(19200, F_CPU));
	 sei();
	 uart_puts_P("Atmega laeuft !\n");

	//I²C
	DDRB |= (1<<1);   //PB1 auf Ausgang für Spannungsversorgung DS1621
	unsigned char a[7];
	unsigned char b[7];
	a[0]=0;
	b[0]=0;
	//Initialisation for Sleep Mode
	DDRD &= ~(1<<PD2);		//INT0 als Eingang
	PORTD |= (1<<PD2);//Pullup aktivieren für INT0
	
	// Interrupt konfigurieren
	// level interrupt INT0 (low level)
	MCUCR &= ~((1 << ISC01) | (1 << ISC00));

	for (;;)
	{			
		float	calctemp=0.0;
		float	temp;
		float	temphalf;
		PORTB |= (1<<PB1);
		_delay_us(100);
	//I²C 
	
		i2c_init();
		
/*		uart_puts_P("I2c Init!\n");*/
		_delay_ms(100);
		i2c_start(Dev1621 + I2C_WRITE);	
		uart_puts_P("I2c Temp read!\n");
		i2c_write(0xEE);
		i2c_stop();
		i2c_start(Dev1621+I2C_WRITE);
		i2c_write(0xAA);
		i2c_stop();
		_delay_ms(700);
		
		i2c_start(Dev1621+I2C_READ);
		a[0]=i2c_readAck();
		b[0]=i2c_readNak();
		i2c_stop();
		temphalf=b[0];
		temp=a[0];
		uart_putc(temp);
		uart_putc(temphalf);
		//RFM12
		PORTB &= ~(1<<PB1);	//DS1621 Ausschalten
		send(temp, temphalf);
	rf12_trans(0xE920);    // Wakup-Timer 61000 ms E93F //E810 4000ms
	rf12_trans(0x0000);    // Statusregister auslesen;		
	rf12_trans(0x8203);    // Wakeup aktivieren, Clockoutput aus	

		//Sleep Mode
		GICR |= (1 << INT0);            // externen Interrupt freigeben        
		set_sleep_mode(SLEEP_MODE_PWR_DOWN);
		sleep_enable();                // in den Schlafmodus wechseln        
		sei();
		sleep_cpu();
		sleep_disable();
		// hier wachen wir wieder auf
		GICR &= ~(1 << INT0);           // externen Interrupt sperren
		// WICHTIG! falls der externe LOW Puls an INT0
		// sehr lange dauert        

	}
}



// externer Interrupt INT0

// Die Interruptroutine kann leer sein, ABER sie muss existieren!
// Sonst springt der AVR nach dem Aufwachen zum Reset, weil kein sinnvoller
// Interruptvektor eingetragen ist!
ISR(INT0_vect) {
	   TWCR &= ~((1 << TWSTO) | (1 << TWEN));
	   TWCR |= (1 << TWEN);
}

void receive(void)
{	unsigned char test[10];
	rf12_rxdata(test,10);
	for (unsigned char i=0; i<10; i++)
	uart_putc(test[i]);
}

void send(unsigned char temp, unsigned char temphalf)
{	unsigned char test[5];

	test[0]=temp;
	test[1]=temphalf;
	test[2]=20;			//Reserve
	test[3]=30;			//Reserve
	test[4]=40;			//Reserve
	rf12_txdata(test,5);
}




