«

»

Jun 03

Analog Comparator pada ATmega16

Dalam beberapa tipe AVR, terdapat fitur Analog Comparator, yang dapat digunakan untuk membandingkan tegangan input dengan sebuah referensi.

Dalam program berikut, input positive comparator dihubungkan dengan internal voltage regulator 1.23V dengan men-set bit ACGB pada register ACSR. Sementara input negative comparator dihubungkan dengan input tegangan eksternal, yang akan dibandingkan, melalui ADC3.Sebagai indikator, dipasang sebuah LED pada pin PD0. Bila tegangan input lebih rendah dari 1.23V, maka LED akan padam, sementara bila lebih dari 1.23V, maka LED akan menyala. Kondisi LED dirubah melalui ISR ANA_COMP_vect, dengan memperhatikan bit ACO pada register ACSR.

void Init()
{
   cbi(DDRA,PA3);
   cbi(PORTA,PA3);
   sbi(DDRD,PD0);
   cbi(DDRD,PD0);
   sbi(SFIOR,ACME);  // enable multiplexer
   cbi(ADCSRA,ADEN); // disable ADC
   ADMUX |= (0<<MUX2)|(1<<MUX1)|(1<<MUX0); // ADC3 = negative AIN
   ACSR |=
	(0<<ACD)|	  // Comparator ON
	(1<<ACBG)|  // Connect 1.23V reference to AIN0
	(1<<ACIE)|  // Comparator Interrupt enable
	(0<<ACIC)|  // Input capture disabled
	(0<<ACIS1)| // Set interrupt on output toggle
        (0<<ACIS0);
	sei();            // Enable global interrupts
}

ISR(ANA_COMP_vect) {
   if ( bit_is_clear(ACSR, ACO) )
      sbi(PORTD,PD0); // LED menyala
   else
      cbi(PORTD,PD0); // LED padam
}

int main()
{
   init();
   while(1) {}
   return 0;
}