Проблема с опорным напряжением АЦП ATTINY45

titanium17
Offline
Зарегистрирован: 21.10.2019

Доброго времени суток, начал разбираться с работой АЦП сабжевого МК и столкнулся с такой неприятностью - код вроде и работает но судя по поведению, как будто слишком низкое опорное напряжение. В регистре прописал использование в качестве опорного напряжение питания МК, но код работает только в диапазоне входных напряжений от 0 до 0,25в, что явно не правильно. При попытке выбрать другой источник ОН - в протеусе вылетает ошибка связанная с температурным датчиком ( PC=0x005A. [AVR AD CONVERTER] Temperature Sensor is not supported. [U1]). Откуда? Я не использую температурный сенсор вообще.  

Вот собственно сам код: 

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

int ocr=0;
//--------------------------------------------------
void setup()
{
 DDRB   = 0b00000001; //конфигурирование пина для выхода генератора
 PORTB  = 0b00001000; //и 1 вход с подтяжкой к + для кнопки 0
 asm("cli");
   ADCSRA |= (1<<ADEN) //Разрешение использования АЦП
	    |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);    //Делитель 128 = 64 кГц
   ADMUX |= (REFS1 << 0)|(REFS0 << 0)|(ADLAR << 0)|(REFS2 << 0)  //опорное напряжение->напряжение питания
           |(MUX3  << 0)|(MUX2  << 0)|(MUX1  << 1)|(MUX0  << 0); //вход ADC2 
 asm("sei");
}
//---------------------------------------------------------
unsigned int ADC_convert (void)
{
	ADCSRA |= (1<<ADSC);         //Начинаем преобразование
	while((ADCSRA & (1<<ADSC))); //проверим закончилось ли аналого-цифровое преобразование
	return (unsigned int) ADC;
}

//-----------------------------------------------------------
int main()
{
    setup();
    while(1){  
		  
  ocr =  ADC_convert ();

       }
    return 0;
}

Прошу помощи и разъяснения - что я делаю не так или не делаю вообще?

Заранее благодарен за помощь и науку.

PS: Рад бы приложить проект для Протеуса, но не знаю как.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

titanium17 пишет:
Я не использую температурный сенсор вообще. 

https://www.youtube.com/watch?v=qdks9RV2uzk

Ещё как используешь. Чему по твоему равно выражение, которые ты в ADMUX пихаешь? Ты его напечатай в сериал и сам посмотри.

А не так ты записываешь формирование битовых масок типа

MUX3  << 0)|(MUX2  << 0)|(MUX1  << 1)|(MUX0  << 0);

Так как-то типа наоборот надо. Если не умеешь, лучше используй макрос bit. Не будет таких проблем.

titanium17
Offline
Зарегистрирован: 21.10.2019

Благодарю за науку!!!! Все заработало как нужно! И видос в тему. 2 дня убил чтобы понять но ниАсислил. А о битовых масках вроде и читал но ничего толком не понял, видать мозжечком еще не дорос))) Будем развивать...