Проблема с АЦП в atmega8

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Проблема с АЦП в atmega8

Сообщение master3763 »

Здравствуйте уважаемые коты !
Пытаюсь освоить АЦП. Вот и решил собрать вот эту схему.

http://my-avr.at.ua/publ/1-1-0-15

В протеусе после компиляции все работает а вот в практике на деле ничего не получается. Горят 4 первые лампочки порта D тупо в любом положении потенциометра. Иногда почемуто горит и пятая..
АVCCсоединил вроде с АREF и подал +5 вольт от питания.

В чем может быть проблема ? Что я тут не учел или не подключил ?
Некак не пойму, пробовал уже больше 30 вариянтов меня в основном исходный код.
Реклама
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

Проверь мультиметром правильно ли на вход АЦП напряжение приходит. Дальше попробуй светодиодами поуправлять без АЦП, будут ли работать правильно, потом попробуй влеить задержку куда-нибудь внутрь этого цикла:
while (1)
{
if(adc_data[0]>10) PORTD.0=1; //если значение ADC>10 (~0.2V)
else PORTD.0=0;
if(adc_data[0]>70) PORTD.1=1; //ADC>70 (~1.4)
else PORTD.1=0;
if(adc_data[0]>130) PORTD.2=1; //~2.5
else PORTD.2=0;
if(adc_data[0]>190) PORTD.3=1; //~3.7
else PORTD.3=0;
if(adc_data[0]>250) PORTD.4=1; //~ 4.9
else PORTD.4=0;
};
Привет, вот мы с вами пришли к освоению внутреннего АЦП. Итак, приступим. АЦП в микроконтроллере называется ADC, в ATMega8 4 встроеных АЦП (PORTC.0-PORTC-3).
Чувствуется автор статьи великий мастер, 4 АЦП у него в атмеге8 ну ну :) Может там и исходник напортачен где.
Реклама
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

Внутри прерывания у него
delay_us(10);

КРУТО :facepalm:
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение master3763 »

Напряжение проверил, все в порядке, остальное вроде все ок.
Может проблема в фюзах? Или каких какнибудь настроек в CodeVisionAVR ? Как можно настроить АЦП ?
В протеусе отлично работает. Некак не пойму что происходит. :(

Дайте пожалуйста какойнибуд толковый пример работы АЦП а то каждый что попало пишет в интенете.
Реклама
Эиком - электронные компоненты и радиодетали
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Проблема с АЦП в atmega8

Сообщение BerZerK-ku »

Avarges писал(а):Внутри прерывания у него
delay_us(10);
КРУТО :facepalm:
А что такого? чем задержка ТАМ помешала?
А вот зачем она вообще нужна непонятно.
Реклама
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

Любой обработчик прерывания должен быть написан максимально компактно. И что что, а задержку добавлять просто ЗАПРЕЩЕНО :)
Реклама
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение master3763 »

Думаете из за этого на практике не работает ?
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

Вряд ли из-за этого. Вы пробовали задержку в цикл добавить? Может там на подобие динамической индикации пополам с помехой происходит, так сразу и не угадаешь. Задержка 250мс позволит увидеть глазами переключения светов
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение master3763 »

Пробовал но ничего не вышло тотже самый результат. Скажите а настройки которые позазанны на сайте, они правильны ?

http://my-avr.at.ua/publ/1-1-0-15

может я просто неправильно настроил свой камушек ?
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

Попробуй вот такой код, с заводскими фьюзами (атмега8 на 1 МГц)

Код: Выделить всё

#include <mega8.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x20

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

// Declare your global variables here

void main(void)
{
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=T State6=T State5=T State4=0 State3=0 State2=0 State1=0 State0=0 
PORTD=0x00;
DDRD=0x1F;

// ADC initialization
// ADC Clock frequency: 31,250 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;

unsigned char x;

while (1)
      {
      // Place your code here
      x = read_adc(0);
if(x>10) PORTD.0=1; //если значение ADC>10 (~0.2V) 
 else PORTD.0=0; 
 if(x>70) PORTD.1=1; //ADC>70 (~1.4) 
 else PORTD.1=0; 
 if(x>130) PORTD.2=1; //~2.5 
 else PORTD.2=0; 
 if(x>190) PORTD.3=1; //~3.7 
 else PORTD.3=0; 
 if(x>250) PORTD.4=1; //~ 4.9 
 else PORTD.4=0;
      delay_ms(200);
      };
}
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение master3763 »

Спасибо большое все сработало ! Причина была в том что я вместо потенциометра поставил простой реостат для регулировки напряжения на выходе. )))

Извеняюсь за беспокойство )
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Проблема с АЦП в atmega8

Сообщение BerZerK-ku »

Avarges писал(а):Любой обработчик прерывания должен быть написан максимально компактно. И что что, а задержку добавлять просто ЗАПРЕЩЕНО :)
Жесть. "Слышал звон, да не знает откуда он". В данном случае речь шла не о эфемерном проекте, а о конкретной написанной программе. С АЦП считывается значение, согласно которому потом зажигается светодиод. Чем грозит задержка? о не-е-ет, светодиод зажжется на несколько микросекунд позже !!!
Правила/рекомендации хорошо, но ведь и головой думать надо.
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

Ко мне то что придираться, мои слова говорят о том, что у автора всё в едином стиле. Сел в протеусе поиграл и давай сразу статью писать, без какой-либо подготовки. Лучше бы сам статьи почитал.
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение master3763 »

А можно еще вопросик ? :)
Хочу вывести на сегментный индикатор с общим катодом цифры с 1 до 4 меняя положение потенциометра.

Делаю вот так,

Код: Выделить всё

if(adc_data[0]>10)  PORTD=00111111; // ADC>10 (~0.2V)                 -- цифра 0  
else PORTD=00000000;
if(adc_data[0]>70)  PORTD=00000110; //ADC>70 (~1.4)                    -- цифра 1 
else PORTD=00000000;
if(adc_data[0]>130) PORTD=01011011; //~2.5                                   --  цифра 2 
else PORTD=00000000;
if(adc_data[0]>190) PORTD=01001111; //~3.7                                   --  цифра 3 
else PORTD=00000000;
if(adc_data[0]>250) PORTD=01100110; //~ 4.9                                  --  цифра 4 
else PORTD=00000000; 
delay_ms(200);
Выводит нечто непонятное... в сегменте загорается только индикатор g и индикатор d и то когда на вxoде + 4 вольт и больше...

Как правильно выводить цифры на сегмент ?
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Проблема с АЦП в atmega8

Сообщение BerZerK-ku »

Правил нет. Ваш код подправить можно так:

Код: Выделить всё

if (adc_data[0] > 250)  
	PORTD = 00111111;  
else if (adc_data[0] > 190)  
	PORTD = 00000110;
else if (adc_data[0] > 130) 
	PORTD = 01011011; 
else if (adc_data[0] > 70)
	PORTD = 01001111; 
else if (adc_data[0] > 10) 
	PORTD = 01100110;  
else 
	PORTD = 00000000; 
delay_ms(200);
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение master3763 »

Так тоже не работает.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение urry »

я думаю :)

может, все-таки PORTD = 0b00111111;
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

:)
master3763
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 10, 2011 17:45:25
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение master3763 »

Ок все работает, спасибо огромное :)
Только вот непонятно одно почему тут обратная логика ? Тоесть чем больше значение adc_data[0] тем меньше напряжение на входе...
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: Проблема с АЦП в atmega8

Сообщение Avarges »

Мозг включи и код программы посмотри :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»