#ifndef __ADCCONTROL_H__ #define __ADCCONTROL_H__ #include "atmega16.h" #include "listener.h" //Reference Selection Bits #define AREF 0x00 #define AVCC 0x40 #define INTERNAL 0xC0 //Analog Channel (Single Ended) #define ADC0 0x00; #define ADC1 0x01; #define ADC2 0x02; #define ADC3 0x03; #define ADC4 0x04; #define ADC5 0x05; #define ADC6 0x06; #define ADC7 0x07; //ADC Enable #define ADCENABLE 0x80 #define ADCDISABLE 0x00 //ADC Auto Trigger Enable #define TRIGGERENABLE 0x20 #define TRIGGERDISABLE 0x00 //ADC Interrupt Enable #define INTENABLE 0x08 #define INTDISABLE 0x00 //ADC Prescaler Select Bits #define DIV2 0x00 #define DIV2a 0x01 #define DIV4 0x02 #define DIV8 0x03 #define DIV16 0x04 #define DIV32 0x05 #define DIV64 0x06 #define DIV128 0x07 //ADC Auto Trigger Source #define FREE 0x00 #define ANALOGCOMP 0x20 #define EXTINT0 0x40 #define TCCOMP0 0x60 #define TCOVER0 0x80 #define TCCOMPB 0xA0 #define TCOVER1 0xC0 #define TCCEV1 0xE0 //ADMUX #define ADLARENABLE 0x20 #define ADLARDISABLE 0x00 /* Classe que implementa as funcionalidades do conversor A/D. */ class ADCControl { public: ADCControl(ATmega16* atmega16) { atmega = atmega16; //seta adlar para 1 atmega->admux = ADLARENABLE | AREF | ADC0; //habilita features para conversão A/D atmega->adcsra = ADCENABLE | TRIGGERENABLE | INTENABLE | DIV8; //habilita timer 0 atmega->sfior = TCOVER0; high = 0; low = 0; //Calibrate(); } void Calibrate(){} //ajusta o canal void SetChannel(unsigned char channel) { atmega->admux &= 0xE0; atmega->admux |= channel; } //inicializa conversão void StartADC() { //seta bit q habilita conversão atmega->adcsra |= 0x40; } unsigned short GetValue() { unsigned short value = atmega->adcl; value |= atmega->adch<<9; return value; } unsigned char GetLowValue() { return low; } unsigned char GetHighValue() { return high; } void SetReference(unsigned char reference) //se externa não pode alterada { atmega->admux &= 0x3F; atmega->admux |= reference; } void SetAutoTrigger(unsigned char enable) { atmega->adcsra &= 0xDF; atmega->adcsra |= enable; } void SetPrescaler(unsigned char prescaler) { atmega->adcsra &= 0xF8; atmega->adcsra |= prescaler; } void SetEnableADC(unsigned char enable) { atmega->adcsra &= 0x7F; atmega->adcsra |= enable; } void SetEnableADCInt(unsigned char enable) { atmega->adcsra &= 0xF7; atmega->adcsra |= enable; } void SetAutoTriggerSource(unsigned char source) { atmega->sfior &= 0x1F; atmega->sfior |= source; } unsigned char EndConversion() { return (atmega->adcsra & 0x10); } void EndConversionInt() { low = atmega->adcl; high = atmega->adch; } private: unsigned char high; unsigned char low; ATmega16* atmega; }; //Valor de AREF externa deve ser definido pelo UISP #endif