Проблема с АЦП в atmega8
-
master3763
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Сб дек 10, 2011 17:45:25
- Контактная информация:
Проблема с АЦП в atmega8
Здравствуйте уважаемые коты !
Пытаюсь освоить АЦП. Вот и решил собрать вот эту схему.
http://my-avr.at.ua/publ/1-1-0-15
В протеусе после компиляции все работает а вот в практике на деле ничего не получается. Горят 4 первые лампочки порта D тупо в любом положении потенциометра. Иногда почемуто горит и пятая..
АVCCсоединил вроде с АREF и подал +5 вольт от питания.
В чем может быть проблема ? Что я тут не учел или не подключил ?
Некак не пойму, пробовал уже больше 30 вариянтов меня в основном исходный код.
Пытаюсь освоить АЦП. Вот и решил собрать вот эту схему.
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
Проверь мультиметром правильно ли на вход АЦП напряжение приходит. Дальше попробуй светодиодами поуправлять без АЦП, будут ли работать правильно, потом попробуй влеить задержку куда-нибудь внутрь этого цикла:
Может там и исходник напортачен где.
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;
};
Чувствуется автор статьи великий мастер, 4 АЦП у него в атмеге8 ну нуПривет, вот мы с вами пришли к освоению внутреннего АЦП. Итак, приступим. АЦП в микроконтроллере называется ADC, в ATMega8 4 встроеных АЦП (PORTC.0-PORTC-3).
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Re: Проблема с АЦП в atmega8
Внутри прерывания у него
delay_us(10);
КРУТО
delay_us(10);
КРУТО
-
master3763
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Сб дек 10, 2011 17:45:25
- Контактная информация:
Re: Проблема с АЦП в atmega8
Напряжение проверил, все в порядке, остальное вроде все ок.
Может проблема в фюзах? Или каких какнибудь настроек в CodeVisionAVR ? Как можно настроить АЦП ?
В протеусе отлично работает. Некак не пойму что происходит.
Дайте пожалуйста какойнибуд толковый пример работы АЦП а то каждый что попало пишет в интенете.
Может проблема в фюзах? Или каких какнибудь настроек в CodeVisionAVR ? Как можно настроить АЦП ?
В протеусе отлично работает. Некак не пойму что происходит.
Дайте пожалуйста какойнибуд толковый пример работы АЦП а то каждый что попало пишет в интенете.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Проблема с АЦП в atmega8
А что такого? чем задержка ТАМ помешала?Avarges писал(а):Внутри прерывания у него
delay_us(10);
КРУТО
А вот зачем она вообще нужна непонятно.
- Реклама
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Re: Проблема с АЦП в atmega8
Любой обработчик прерывания должен быть написан максимально компактно. И что что, а задержку добавлять просто ЗАПРЕЩЕНО 
-
master3763
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Сб дек 10, 2011 17:45:25
- Контактная информация:
Re: Проблема с АЦП в atmega8
Думаете из за этого на практике не работает ?
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Re: Проблема с АЦП в atmega8
Вряд ли из-за этого. Вы пробовали задержку в цикл добавить? Может там на подобие динамической индикации пополам с помехой происходит, так сразу и не угадаешь. Задержка 250мс позволит увидеть глазами переключения светов
-
master3763
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Сб дек 10, 2011 17:45:25
- Контактная информация:
Re: Проблема с АЦП в atmega8
Пробовал но ничего не вышло тотже самый результат. Скажите а настройки которые позазанны на сайте, они правильны ?
http://my-avr.at.ua/publ/1-1-0-15
может я просто неправильно настроил свой камушек ?
http://my-avr.at.ua/publ/1-1-0-15
может я просто неправильно настроил свой камушек ?
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Re: Проблема с АЦП в atmega8
Попробуй вот такой код, с заводскими фьюзами (атмега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
Спасибо большое все сработало ! Причина была в том что я вместо потенциометра поставил простой реостат для регулировки напряжения на выходе. )))
Извеняюсь за беспокойство )
Извеняюсь за беспокойство )
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Проблема с АЦП в atmega8
Жесть. "Слышал звон, да не знает откуда он". В данном случае речь шла не о эфемерном проекте, а о конкретной написанной программе. С АЦП считывается значение, согласно которому потом зажигается светодиод. Чем грозит задержка? о не-е-ет, светодиод зажжется на несколько микросекунд позже !!!Avarges писал(а):Любой обработчик прерывания должен быть написан максимально компактно. И что что, а задержку добавлять просто ЗАПРЕЩЕНО
Правила/рекомендации хорошо, но ведь и головой думать надо.
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Re: Проблема с АЦП в atmega8
Ко мне то что придираться, мои слова говорят о том, что у автора всё в едином стиле. Сел в протеусе поиграл и давай сразу статью писать, без какой-либо подготовки. Лучше бы сам статьи почитал.
-
master3763
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Сб дек 10, 2011 17:45:25
- Контактная информация:
Re: Проблема с АЦП в atmega8
А можно еще вопросик ?
Хочу вывести на сегментный индикатор с общим катодом цифры с 1 до 4 меняя положение потенциометра.
Делаю вот так,
Выводит нечто непонятное... в сегменте загорается только индикатор g и индикатор d и то когда на вxoде + 4 вольт и больше...
Как правильно выводить цифры на сегмент ?
Хочу вывести на сегментный индикатор с общим катодом цифры с 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);Как правильно выводить цифры на сегмент ?
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Проблема с АЦП в atmega8
Правил нет. Ваш код подправить можно так:
Код: Выделить всё
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
Так тоже не работает.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Проблема с АЦП в atmega8
я думаю 
может, все-таки PORTD = 0b00111111;
может, все-таки PORTD = 0b00111111;
-
master3763
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Сб дек 10, 2011 17:45:25
- Контактная информация:
Re: Проблема с АЦП в atmega8
Ок все работает, спасибо огромное 
Только вот непонятно одно почему тут обратная логика ? Тоесть чем больше значение adc_data[0] тем меньше напряжение на входе...
Только вот непонятно одно почему тут обратная логика ? Тоесть чем больше значение adc_data[0] тем меньше напряжение на входе...
- Avarges
- Вымогатель припоя
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
- Контактная информация:
Re: Проблема с АЦП в atmega8
Мозг включи и код программы посмотри 


