#include "voltimeter.h" ATmega16* Voltimeter::atmega = reinterpret_cast(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; }