- Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <MyLCD.inc>
interrupt [TIM0_OVF] void timer0_ovf_isr(void);
interrupt [ADC_INT] void adc_isr(void);
void lcd_putnum(unsigned char num);
void main(void);
//======== TIMER0 INTERRUPT HANDLER ========//
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
ADCSRA.6 = 1;
// delay_ms(500);
}
//==== END OF TIMER0 INTERRUPT HANDLER =====//
//======== ADC INTERRUPT HANDLER ========//
interrupt [ADC_INT] void adc_isr(void)
{
unsigned char adc_data;
adc_data = ADCH;
lcd_clear();
lcd_putsf("ADC = ");
lcd_putnum(adc_data);
delay_ms(200);
}
//==== END OF ADC INTERRUPT HANDLER =====//
void lcd_putnum(unsigned char num)
{
unsigned char tmp1, tmp2;
tmp1 = num / 100;
tmp2 = ( num / 10 ) % 10;
if (tmp1)
lcd_putchar(tmp1 + 48);
if ( ((!tmp2) && (tmp1)) ||(tmp2))
lcd_putchar(tmp2 + 48);
lcd_putchar((num%100)%10 + 48);
}
void main(void)
{
DDRC = 0b00110110;
PORTC = 0b00111110;
ADMUX = 0b01100000;
ADCSRA = 0x8B;
TCCR0=0x03;
TIMSK=0x01;
ACSR=0x80;
lcd_init();
lcd_putsf("TEST");
delay_ms(200);
ADCSRA.6 = 1;
#asm("sei");
while (1)
{
}
}
При комментировании delay(500) в прерывании от таймера, прерывание от АЦП СРАБАТЫВАЕТ. При внесении же delay_ms (500), т.е. "удлинения по времени" прерывания от таймера, прерывание от АЦП игнорируется. В чем может быть дело?
P.S. Контроль данных АЦП выводится на ЛСД дисплей (100% рабочий).
P.S.S. В протеусе все эмулится нормально.