Замыкаю PB4 с VCC, подаю питание (5,25В.), но вместо ожидаемых максимальных значений (ADCL=0xff, ADCH=0x03) в EEPROM ложатся:
1 измерение
ADCL=0x00
ADCH=0x00
2 измерение
ADCL=0x31
ADCH=0x03
3 измерение
ADCL=0x10
ADCH=0x03
4 измерение
ADCL=0x6B
ADCH=0x02
5 измерение
ADCL=0xDE
ADCH=0x01
6 измерение
ADCL=0xA3
ADCH=0x01
7 измерение
ADCL=0x60
ADCH=0x01
8 измерение
ADCL=0xFE
ADCH=0x00
9 измерение
ADCL=0xFF
ADCH=0x03
10 измерение
ADCL=0xFF
ADCH=0x03
Почему так происходит? Если сохранять в eeprom измерения с 10 по 20, все работает отлично.
Код
#include <tiny13.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x20
eeprom unsigned char t[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char i=0;
unsigned char adc_data;
unsigned char adc_data_h;
// Read the 8 most significant bits
// of the AD conversion result
if (i<18)
i=i+2;
adc_data=ADCL;
adc_data_h=ADCH;
t[i]=adc_data;
t[i+1]=adc_data_h;
// Place your code here
//if(adc_data_h>1)
{
PORTB.1=1;
delay_ms(100);
PORTB.1=0;
delay_ms(1000);
};
ADCSRA=ADCSRA|0x40; //Запускаем преобразование
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State5=T State4=T State3=T State2=T State1=0 State0=T
PORTB=0x00;
DDRB=0x02;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
DIDR0=0x00;
ADMUX=0b00000010; // ADLAR=0; ADC2(PB4)
ADCSRA=0b10001111;
// 7 бит - разрешение АЦП
// 6 бит - 0 не начинаем преобразование
// 5 бит - 0 одиночное преобразование
// 4 бит - 0 прерывание от компаратора не требуется
// 3 бит - 1
// 2 - 1 бит - частота преобразования
// Global enable interrupts
#asm("sei")
ADCSRA=ADCSRA|0x40; //Запускаем преобразование
while (1)
{
// Place your code here
};
}
#include <delay.h>
#define ADC_VREF_TYPE 0x20
eeprom unsigned char t[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char i=0;
unsigned char adc_data;
unsigned char adc_data_h;
// Read the 8 most significant bits
// of the AD conversion result
if (i<18)
i=i+2;
adc_data=ADCL;
adc_data_h=ADCH;
t[i]=adc_data;
t[i+1]=adc_data_h;
// Place your code here
//if(adc_data_h>1)
{
PORTB.1=1;
delay_ms(100);
PORTB.1=0;
delay_ms(1000);
};
ADCSRA=ADCSRA|0x40; //Запускаем преобразование
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State5=T State4=T State3=T State2=T State1=0 State0=T
PORTB=0x00;
DDRB=0x02;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
DIDR0=0x00;
ADMUX=0b00000010; // ADLAR=0; ADC2(PB4)
ADCSRA=0b10001111;
// 7 бит - разрешение АЦП
// 6 бит - 0 не начинаем преобразование
// 5 бит - 0 одиночное преобразование
// 4 бит - 0 прерывание от компаратора не требуется
// 3 бит - 1
// 2 - 1 бит - частота преобразования
// Global enable interrupts
#asm("sei")
ADCSRA=ADCSRA|0x40; //Запускаем преобразование
while (1)
{
// Place your code here
};
}