реклама на сайте
подробности

 
 
> Atmega48 запуск АЦП по внешнему сигналу
Oleg_IT
сообщение Jan 5 2015, 13:30
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Есть такой код
CODE
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//#include "PortDefine.h"
#include "avrlibdefs.h"
#include "avrlibtypes.h"

//#define USE_INT0

union {
uint16_t ADC_Data;
uint8_t ADC_Bute[2];
} Data;

#ifdef USE_INT0
ISR (INT0_vect)
{
ADCSRA |= (1 << ADSC);
}
#endif // USE_INT0

ISR (ADC_vect)
{
PORTD |= 1;
Data.ADC_Data = (unsigned short)inb(ADCL) | (unsigned short)(inb(ADCH) << 8);
PORTD &=~ 1;
}

int main( void )
{
// ADC
ADMUX |= (1 << REFS0) | (1 << MUX0) | (1 << MUX2); // ADC5, AVCC
ADCSRA |= (1 << ADEN) | (1 << ADATE) | (1 << ADIE);
ADCSRB |= (1 << ADTS1);
DDRC = 0;
PORTC = 0;


#ifdef USE_INT0
EICRA |= (1 << ISC01) | (1 << ISC00);
EIMSK |= (1 << INT0);
#endif // USE_INT0


DDRD = 0x03;
PORTD = 4;

sei();

ADCSRA |= (1 << ADSC);
while (1)
{
PORTD ^= 2;
}
return 0;
}

По идеи он должен запускать оцифровку по внешнему сигналу, но этого не происходит.
Если я открываю строку //#define USE_INT0 всё работает правильно, но при этом теряется время.
Строку инициализации EICRA убирал из под ифа, не помогает.
Может я чего в инициализации упускаю.

Сообщение отредактировал IgorKossak - Jan 8 2015, 19:35
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Oleg_IT
сообщение Jan 16 2015, 09:47
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Так как Вы описали инициализацию работает, но выигрыш во времени не впечатлил, Atmega48, 10МГц, с запуском АЦП в обработчике внешнего прерывания от начала входного импульса на INT0 до начала прерывания АЦП 66,8 мкс, а тоже время с автоматическим запуском составляет 46,4 мкс.

По поводу |= или =. В данном случае это эквивалентно, т.к. регистры по умолчанию равны 0. Но |= всё таки правильнее, это нужно, что бы не повреждать те биты которые нужны для других целей.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 16 2015, 11:04
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Oleg_IT @ Jan 16 2015, 11:47) *
Но |= всё таки правильнее, это нужно, что бы не повреждать те биты которые нужны для других целей.
В данном случае вы инициализируете. И вам нужно не "не повредить" их, а вам нужно, чтобы в них были нули. Поэтому именно здесь правильнее "=". Кроме того, это даст более короткий код.


Цитата(Oleg_IT @ Jan 16 2015, 11:47) *
но выигрыш во времени не впечатлил
Какой выигрыш? АЦП запускается или сразу (аппаратно) или с задержкой (вручную в обработчике). Остальное время уходит на преобразование. Максимальная тактовая для АЦП (для получения 10 бит) - 1 МГц, вы можете затактировать АЦП частотой 10 МГц / 16 = 625 КГц, преобразование занимает 13.5 тактов, т.е. 21.6 мкС - это максимум, что можно выжать для вашего кварца и 10 бит. 40 мкС должно занимать первое преобразование после переключения канала. В вашем коде я не вижу смены канала, значит уже второе преобразование должно закончиться через 21.6 мкС. Но это только при условии, что вы настроите тактирование. В вашем коде я не вижу настройки предделителя АЦП, значит оно работает на 5 МГц и если при этом вы наблюдаете время преобразования 44 мкС, то я могу только предположить, что ваш процессор вместо 10 МГц работает от внутреннего RC-генератора деленного на 8, т.е. на 1 МГц. Хотя и тогда должно получиться около 27 мкС. В общем показывайте последний код, телепатировать не хочется.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016