АЦП в ATTINY13 настройка

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

Помогите пожалуйста разобраться с АЦП. Никак не пойму что надо настроить и как результат забрать............ ХЕЛП!...... Запутался конкретно....
Растолкуйте мне, как говорил мой наставник, на сковородках))))) Пишу на AVRStudio 4
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

А это читали?
Изображение only pure true norwegian blackx Изображение
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

а сколько ацп у attiny13 ?
Нужно 1 и частотой 1гц , и 2 с частотой 10гц . Больше частоты необязательно .
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

У тини13 один четырехканальный 10-битный АЦП с максимальным временем преобразования 260 мкс.
Изображение only pure true norwegian blackx Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

а как понять 4 канальный?
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Реклама
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

rus084 писал(а):а как понять 4 канальный?..
значит, что можно использовать четыре входа для преобразований аналогового сигнала в цифру
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

в 1 кб флеш памяти влезет прошивка эбу ?
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

А вы проверьте.
Изображение only pure true norwegian blackx Изображение
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

а что происходит с мк присподаче сигнала сброса? это тоже самое что выключить и включить питание ?
за сколько времени при сбросе мк , порты конфигурируются?
а то у меня идея как съэкономить немножко памяти : по сигналу от зажигания подавать сброс на мк , после впрыска переходить в спящий режим до следущего сброса .
но в таком случае нельзя сделать програмно эпхх и еще несколько проблем .
тогда что лучше : сделать преобразователь частота-напряжение (понятно ) и подавать на оставшийся неиспользованным канал ацп ; или програмно высчитывать частоту , есть несколько способов : неиспользовать сброс и считать как у всех эбу или еще способ :
искра дается 1 раз за оборот , а у 4т мотора топливо засасывается раз за 2 оборота ; значит делать сброс через делитель частоты на2 (тм2) ; по первому сбросу мк включается а когда идет следущий импульс , мк считает прошедшее время и вычисляет сколько впрыскивать .
какой способ лучше?
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

а что происходит с мк присподаче сигнала сброса?
Описано в даташите
это тоже самое что выключить и включить питание ?
Нет
за сколько времени при сбросе мк , порты конфигурируются?
Они сами не конфигурируются. Сконфигурировать их должны вы, а там, соответственно, будете знать время.
а то у меня идея как съэкономить немножко памяти : по сигналу от зажигания подавать сброс на мк
Плохая идея. И память так не сэкономите.

Вообще не пойму, мы в начале 90х живём и zx-спектрум - суперкомпьютер? Если не хватает ресурсов - возьмите МК пожирнее. Они сейчас в пять раз дешевле бутылки пива.
Родился
Сообщения: 14
Зарегистрирован: Ср сен 15, 2010 14:56:22

Сообщение ak-47m »

Доброе время суток.
Есть ли у кого нибудь рабочий проект АЦП ATTINY13 для gcc ???
Если можно дайте исходники.
Уж сильно хочется разобратца с этим АЦП.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Такое, надеюсь, подойдет:

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

//
//
//
#include <avr/io.h>
#include <avr/interrupt.h>  //Для доступа к функции sei()
#include <avr/signal.h>     //Для доступа к макросу INTERRUPT

ISR (ADC_vect) //Обработчик прерывания от интегрированного АЦП
{
unsigned int ADCdata;  //Буферная переменная для. хранения
ADCdata = ADCW;        	//результата преобразования
if (ADCdata > (2046 / 5)) PORTB = 1; //Если U > 2 В
else if (ADCdata < (1023 / 5)) PORTB = 4; //Если U < 1 В
else PORTB = 2;  //Если U = 1..2 В
ADCSRA = ADCSRA | 0x40; //Устанавливаем разряд ADSC в регистре ADCSR, чтобы начать новое преобразование 
}
 
int main (void) 
{
DDRB = 7;		//Три младших разряда порта B - выходы  
ADMUX = 3; 		//Назначаем в качестве аналогового входа РBЗ ; 
ADCSRA = 0xCE; 	/* 0b11001110 - активизируем АЦП с коэффициентом деления 64, 
						разрешаем прерывание от АЦП и начинаем преобразование */  
sei();			//Общее разрешение прерываний
while(1) ; 	//Бесконечный цикл в ожидании прерывания от АЦП
}
Ни в железе, ни в протеусе не прогонял. Честно содрал в нэте и подрихтовал под тиньку13. :))
Docendo discimus
Контактная информация:
Родился
Сообщения: 14
Зарегистрирован: Ср сен 15, 2010 14:56:22

Сообщение ak-47m »

опгромное спасибо
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Пожалуйста.
Docendo discimus
Контактная информация:
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Здесь мой рабочий проект http://radiokot.ru/lab/controller/66/
Ацп применен для измерения тока
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

вроде все делаю по Евстифееву... но!
Не фурычит:(
Помогите провести операцию по трансплантации попы рук на место :)

Хочу АЦП запустить в режиме непрерывного преобразования... что бы в любой момент можно было бы достучаться до регистра ADCH... и получить с него показания....

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

//========Разрешения прерываний АЦП микроконтроллера======
	ADCSRA = ADCSRA|(1<<ADEN)|(1<<ADATE); //Установил разрешение на работу АЦП,подключил автозапуск.
	ADCSRA = ADCSRA|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); //установка предделителя для задания частоты АЦП в пределах 100-200кГц, 1/64 FCPU.
	ADCSRB = ADCSRB|(1<<ACME); //Установил режим работы непрерывного преобразования.
	ADMUX = ADMUX|(1<<MUX1)|(1<<MUX0);//указал, какой у меня вход задействован в качестве АЦП.
	ADMUX = ADMUX&(~(1<<REFS0));// установка источника опорного напряжения = VCC
	ADMUX = ADMUX|(1<<ADLAR); // Результат преобразования сдвинут вправо. Результат можно читать из ADCH при этом в ADCL будут храниться в 7 и 8 бите младшие разряды преобразования, ими в нашем случае можно пренебречь.
	DIDR0 =  DIDR0|(1<<ADC3D); // отключение цифрового буфера от канала ADC3.
		ADCSRA = ADCSRA|(1<<ADIE); // разрешил прерывания по окончании 
	ADCSRA = ADCSRA|(1<<ADSC);//Запуск первого преобразования!!!
	//=======КОНЕЦ Разрешения прерываний АЦП микроконтроллера=
Но АЦП почему то не завелся :(

помогите в вопросе трансплантологии.

Или ... или мне надо самому ручками в прерывании ISR(ADC_vect) каждый раз требовать продолжения банкета???

НО оно в прерывание не попадает... :shock:

А трансплантолог нужен риальне.. ибо пример
http://radiokot.ru/forum/viewtopic.php? ... 9#p1877209
в этой же теме - работает :))))..
а я в 3,14чале(((
Контактная информация:
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

c2n писал(а):Но АЦП почему то не завелся
в этой же теме - работает ..
А где у Вас собственно код обработчика прерывания по завершению АЦП-преобразования?
И вообще, что-то я не увидел в Вашем коде команды sei, которая глобально разрешает прерывания.
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Alkul писал(а): код обработчика прерывания
я понял, что можно завести АЦП в режиме непрерывного преобразования.
соответственно результат можно получить практически всегда из регистра ADCH/ADCL.

код тут:
Спойлер

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

#define F_CPU 9600000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

ISR(ADC_vect)
{
//ADCSRA = ADCSRA | 0x40; //Устанавливаем разряд ADSC в регистре ADCSR, чтобы начать новое преобразование 
//Что с этой строкой, что без этой строки - дурь выходит в протеусе
}


int main(void)
{
	cli(); //Запретил прерывания, дабы не повадно было
	DDRB = 0b00111; //установил пол порта на вход, половину на выход
	PORTB = 0b00000; //вЫключил порт
	//========Разрешения прерываний АЦП микроконтроллера======
	ADCSRA = ADCSRA|(1<<ADEN)|(1<<ADATE); //Установил разрешение на работу АЦП,подключил автозапуск.
	ADCSRA = ADCSRA|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); //установка предделителя для задания частоты АЦП в пределах 100-200кГц, 1/64 FCPU.
	ADCSRB = ADCSRB|(1<<ACME); //Установил режим работы непрерывного преобразования.
	ADMUX = ADMUX|(1<<MUX1)|(1<<MUX0);//указал, какой у меня вход задействован в качестве АЦП.
	ADMUX = ADMUX&(~(1<<REFS0));// установка источника опорного напряжения = VCC
	ADMUX = ADMUX|(1<<ADLAR); // Результат преобразования сдвинут вправо. Результат можно читать из ADCH при этом в ADCL будут храниться в 7 и 8 бите младшие разряды рпеобразования, ими в нашем случае можно пренебречь.
	DIDR0 =  DIDR0|(1<<ADC3D); // отключение цифрового буфера от канала ADC3.
//		ADCSRA = ADCSRA|(1<<ADIE); //Разрешение прерывания от АДЦ
//что с этой строкой, что без нее - дурь...
	ADCSRA = ADCSRA|(1<<ADSC);//Запуск первого преобразования!!!

//====кусок из примера на форуме=====
//	ADMUX = 3;       //Назначаем в качестве аналогового входа РBЗ ; Из примера
//	ADCSRA = 0xCE;    /* 0b11001110 - активизируем АЦП с коэффициентом деления 64, из примера*/
//====кусок из примера на форуме=====
	
	//=======КОНЕЦ Разрешения прерываний АЦП микроконтроллера=
	
	
	
	PORTB = (PORTB&0b111000); // обнулил младшие три бита порта.
	_delay_ms(100);
	
	sei(); //Разрешил прерывания
	
	while(1)
	{
		PORTB = ADCH;//(0^~Counter); //вывожу переменную с АЦП в порт.
		//в протеусе вообще ничего не происходит....на реальном железе непонятные поморгульки...

		
		
	}
}
Контактная информация:
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

c2n писал(а):соответственно результат можно получить практически всегда из регистра ADCH/ADCL.
Наверное, можно. Но правильнее было бы написать обработчик прерывания по завершению преобразования и брать данные уже там.

Дальше
Я пишу на ассемблере, а на Си программировал только для компьютеров, поэтому не очень хорошо знаком с Си-шными нотациями применительно к программированию для МК.
Но вот эта запись

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

PORTB = ADCH;//(0^~Counter); //вывожу переменную с АЦП в порт.

вызывает во мне смутные опасения. Допустимо ли так делать? Для надежности не лучше считывать данные в переменную, а уже её выводить в порт?
Но самое главное не в этом
Скажите, вы даташит читали?
Вот это там видели?
Изображение
Как так вы читаете только ADCH? Кто будет читать ADCL, который, к слову, даташит требует читать первым? Ибо там существует особая логика работы с этими регистрами. В даташите про все это написано.
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Разобрался поманешку.
Спойлер

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

#define F_CPU 9600000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

volatile unsigned char Counter=1;//тупо счетчик
volatile unsigned char ResultADC = 0; //результат АЦП


char _74HC595(unsigned char varible)
{
	for (char i = 0; i<8; i++)
	{
		PORTB = PORTB&0b111000; //PB1 = SCK Set is 0;
		PORTB = PORTB|((varible>>i)&1); //PB0 = DS. Show bit? getting of shr on pos geting circular counter i.
		PORTB = PORTB|0b010; //PB1 is set 1.
	}
	PORTB = (PORTB&0b111000)|0b000100; //PB3 is SW.
}


ISR(ADC_vect)
{
	if ((ADCH>>1) != (ResultADC>>1)) // отбрасываю младший разряд и проверяю, есть ли изменения. Устранение "дребезга"
	{
		ResultADC = ADCH;
	}
}


int main(void)
{
	cli(); //Запретил прерывания, дабы не повадно было
	DDRB = 0b00111; //установил пол порта на вход, половину на выход
	PORTB = 0b00000; //вЫключил порт
	//========Разрешения прерываний АЦП микроконтроллера======
	ADCSRA = ADCSRA|(1<<ADEN)|(1<<ADATE); //Установил разрешение на работу АЦП,подключил автозапуск.
	ADCSRA = ADCSRA|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); //установка предделителя для задания частоты АЦП в пределах 100-200кГц, 1/64 FCPU.
	ADCSRB = ADCSRB|(1<<ACME); //Установил режим работы непрерывного преобразования.
	ADMUX = ADMUX|(1<<MUX1)|(1<<MUX0);//указал, какой у меня вход задействован в качестве АЦП.
	ADMUX = ADMUX&(~(1<<REFS0));// установка источника опорного напряжения = VCC
	ADMUX = ADMUX|(1<<ADLAR); // Результат преобразования сдвинут вправо. Результат можно читать из ADCH при этом в ADCL будут храниться в 7 и 8 бите младшие разряды рпеобразования, ими в нашем случае можно пренебречь.
	DIDR0 =  DIDR0|(1<<ADC3D); // отключение цифрового буфера от канала ADC3.
	ADCSRB = (ADCSRB&0b11111000)|(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0); //Установка источника сигнала для выполнения преобразования...000 - непрерывное преобразование.
	ADCSRA = ADCSRA|(1<<ADIE); //Разрешение прерывания от АДЦ
	ADCSRA = ADCSRA|(1<<ADSC);//Запуск первого преобразования!!!
	//=======КОНЕЦ Разрешения прерываний АЦП микроконтроллера=
	sei(); //Разрешил прерывания
	
	while(1)
	{
		_74HC595(ResultADC);//Вывожу до посинения результат преобразования АЦП....
	}
}
соответственно этот код выводит в сдвиговый регистр значение "без проблем".

По поводу чтения из регистров.
В ДШ и у Евстифеева сказано, что регистры ADCL и ADCH блокируются для записи, до тех пор, пока не будет прочитан ADCH.
соответственно у меня идет выравнивание влево, и 2 разряда я игнорирую.
В протеусе - работает :)

Изображение
сказано:
если результат притянут влево, и 8 бит точности достаточно, достаточно прочитать АДЦХ....

В моем случае, 8 бит мне за глаза :)))

У меня код заведен на непрерывное преобразование. Но! есть одно но! Если в обработчике прерывания ADC_vect ничего нет - протеус деятельность не иммитирует.
Возможно в реальном камне такая же фигня. Так что по окончании преобразования, я подтираю шумок.... и протеус моделит. Я с этими граблями натрахался за 2 дня. Реализую наверное так.

Думаю мой код поможет кому нибудь :)
Контактная информация:
Ответить

Вернуться в «AVR»