#include "voltimeter.h"

ATmega16* Voltimeter::atmega = reinterpret_cast<ATmega16*>(0x00);
Display Voltimeter::display(Voltimeter::atmega, PORTB);
ADCControl Voltimeter::adc(Voltimeter::atmega);

// inicializa os registradores
void Voltimeter::Init()
{
	atmega->sreg = 0x80;//int global; habilitar so o que interessa
	atmega->gicr = 0xC0; //desabilita int 0, 1, 2
	atmega->timsk = 0x01;//habilita timer 0
	atmega->tccr0 = 0x05;//prescaler 1024
}

//inicia a convers�o
void Voltimeter::Start()
{
	adc.StartADC(); //verificar trigger
}

//limpa o sleep e se a convers�o estiver completa escreve na porta.
void Voltimeter::ActionPerformed(unsigned char event)
{
	atmega->mcucr &= 0xBF; //clear sleep
	
	if(event == ADCConversionComplete)
	{
		display.Show(~adc.GetHighValue());
		adc.StartADC();		
	}
}

//habilita o sleep.
void Voltimeter::Idle()
{
	atmega->mcucr |= 0x40;
	asm("sleep");
}

//interrup��o AD
void Voltimeter::ADCInt()
{
	adc.EndConversionInt();
	ActionPerformed(ADCConversionComplete);
}

//Interrup��o ADC
void __vector_14 (void)
{
	Voltimeter::ADCInt();
}

int main(void)
{
	Voltimeter::Init();
	Voltimeter::Start();
	
	while(1)
		Voltimeter::Idle();

	return 0;
}