Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Tiny13 и АЦП непонятные результаты
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Викор
Для Tiny13L в CodeVisionAVR написал программу для работы с АЦП (Приведена ниже). Программа получает 10 результатов с АЦП (ADC2) и сохраняет их в EEPROM.
Замыкаю 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

      };
}
V_G
Это код без изъятий?
А то обработчик прерывания не имеет закрывающей скобки. Или вы в прерывание и задержки всандалили?
Палыч
Цитата(Викор @ Jan 19 2010, 16:53) *
Замыкаю PB4 с VCC
Ну, с первым нулем - всё понятно: Вы наращиваете переменную i до занесения результата (фактически первый результат измерения Вы считаете вторым). И первое измерение - почти то, что нужно. Объяснить падение результатов в следующих пяти измерениях - трудно... Замыкаете РВ4 на питание - куском провода?
Цитата(V_G @ Jan 20 2010, 09:57) *
А то обработчик прерывания не имеет закрывающей скобки. Или вы в прерывание и задержки всандалили?
Задержки, действительно, всандалены в прерывание. Кстати, какое максимальное значение может принимать параметр функции delay_ms ? Можно ли делать с помощью этой фукции задержку в секунду (1000 мс)? Т.е. десять измерений у автора занимают 11 секунд (измерения через 1,1 сек)? Что-то мне не вериться, что на входе АЦП так проседает напряжение (судя по измерениям в три раза) за столь большое время...
_Pasha
Цитата(Палыч @ Jan 20 2010, 13:21) *
Что-то мне не вериться, что на входе АЦП так проседает напряжение (судя по измерениям в три раза) за столь большое время...

Дык он же меряет мгновенное значение. Не суммирует. Если куском провода - всяко может быть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.