#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; }