Прерываение от аналогового компаратора

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Сообщение DarkWolf »

Доброго времени суток, уважаемые форумчане!

Столкнулся с проблемой прерывания от аналогового компаратора AVR.

Использую в устройстве микроконтроллер 324P. Настраиваю компаратор так:

// Настраиваем порт B на вход
DDRB = 0x00;
PORTB = 0xF3; //0 в PB2, PB3

//Инициализация аналогового компаратора

// Влючаем компаратор, подключаем внутреннее опорное напряжение, включаем прерывание, прерывание по любому фронту
ACSR = (0<<ACD) | (1<<ACBG) | (0<<ACO) | (1<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

ADCSRB = (0<<ACME);
ACSR = (1<<ACI) ;
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR1=(1<<AIN0D) | (1<<AIN1D);

//Функция обработки прерывания
interrupt [ANA_COMP] void ana_comp_isr(void)
{
if ( (ACSR & 32) != 0)
{
AnComp = 1;
}
else
{
AnComp = 0;
}
}

Делаю все поп даташиту, но почему то прерывание не срабатывает.. Подскажите кто знает в какую сторону копать?
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

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

ACSR = (0<<ACD) | (1<<ACBG) | (0<<ACO) | (1<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

ADCSRB = (0<<ACME);
ACSR |= (1<<ACI) ;
//ACSR = (1<<ACI) ;
А так?
Реклама
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Сообщение DarkWolf »

[uquote="akl",url="/forum/viewtopic.php?p=3307282#p3307282"]

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

ACSR = (0<<ACD) | (1<<ACBG) | (0<<ACO) | (1<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

ADCSRB = (0<<ACME);
ACSR |= (1<<ACI) ;
//ACSR = (1<<ACI) ;
А так?[/uquote]

ничего не изменилось
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

ACSR |= (1<<ACI) ;
Это строка лишняя.
Схему подключения компаратора приведите, и, что бы десять раз не спрашивать, укажите значение опорного напряжения.
Это у вас весь код? Не вижу разрешения на обработку прерывания.
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Сообщение pavel1979 »

[uquote="DarkWolf",url="/forum/viewtopic.php?p=3307265#p3307265"]Доброго времени суток, уважаемые форумчане!

Столкнулся с проблемой прерывания от аналогового компаратора AVR.

Использую в устройстве микроконтроллер 324P. Настраиваю компаратор так:

// Настраиваем порт B на вход
DDRB = 0x00;
PORTB = 0xF3; //0 в PB2, PB3

//Инициализация аналогового компаратора

// Влючаем компаратор, подключаем внутреннее опорное напряжение, включаем прерывание, прерывание по любому фронту
ACSR = (0<<ACD) | (1<<ACBG) | (0<<ACO) | (1<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

ADCSRB = (0<<ACME);
ACSR = (1<<ACI) ;
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR1=(1<<AIN0D) | (1<<AIN1D);

//Функция обработки прерывания
interrupt [ANA_COMP] void ana_comp_isr(void)
{
if ( (ACSR & 32) != 0)
{
AnComp = 1;
}
else
{
AnComp = 0;
}
}

Делаю все поп даташиту, но почему то прерывание не срабатывает.. Подскажите кто знает в какую сторону копать?[/uquote]
ВОТ ТЫ ВАЛЕНОК...324P...
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

pavel1979 писал(а):ВОТ ТЫ ВАЛЕНОК...324P...
А что не так с 324Р?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

DarkWolf писал(а):но почему то прерывание не срабатывает..
Как Вы это определили и что именно имеется ввиду под "несрабатыванием"?

Что с глобальным разрешением прерываний?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3307342#p3307342"]

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

ACSR |= (1<<ACI) ;
Это строка лишняя.[/uquote]Сброс флага для устранения предистории лишним не бывает.
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Сообщение DarkWolf »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3307342#p3307342"]

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

ACSR |= (1<<ACI) ;
Это строка лишняя.
Схему подключения компаратора приведите, и, что бы десять раз не спрашивать, укажите значение опорного напряжения.
Это у вас весь код? Не вижу разрешения на обработку прерывания.[/uquote]

Разрешение на прерывание от компаратора здесь (1<<ACIE), Опорное напряжение внутреннее 1,22 подключаю здесь (1<<ACBG)

Глобальные прерывания разрешаю после инициализации.

"Не работает прерывание"
Проверял следующим образом: так как настроено на любое изменение фронта, то в функции обработки прерывания

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

interrupt [ANA_COMP] void ana_comp_isr(void)
{    
    if ( (ACSR & 32) != 0) 
        {    
            AnComp = 1;  
        }
        else 
        {
            AnComp = 0;  
        }
}
пробывал выводить на экран символ для проверки. Ничего не происходило.

Добавлено after 14 minutes 44 seconds:
Вот схема компаратора.
Вложения
IMG_20180213_085540.jpg
(243.66 КБ) 598 скачиваний
IMG_20180213_085540.jpg
Схема
(243.66 КБ) 551 скачивание
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

if ( (ACSR & 32) != 0) От этого условия в прерывании то что ждете? Импульс очень короткий и переменной длины и могут быть разные результаты?

Поставте такое же условие в основной цикл и выводите этот бит на какой-нибудь порт. Проверите работает у Вас компаратор или нет , затем дальше думайте.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

DarkWolf писал(а):пробывал выводить на экран символ для проверки. Ничего не происходило.
Выведите на экран значение регистров ACSR и SREG.
Там где у вас R27 R28 +9В, надеюсь при подаче +9В у вас должно происходит прерывание, а так же при снятии +9В, или у вас +9В постоянно подается?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

бывает (я сталкивался) у авр если питание на компаратор идет от внутреннего опорника - надо BOD фьюзы настраивать иначе опорник не включается
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

12.7.1. Voltage Reference Enable Signals and Start-up Time
The reference is on during the following situations:
1. When the BOD is enabled (by programming the BODLEVEL [2:0] Fuses).
2. When the bandgap reference is connected to the Analog Comparator (by setting the ACBG bit in
ACSR (ACSR.ACBG)).
3. When the ADC is enabled.
После включения Bandgap reference нужно выдержать start-up time порядка 100мкс...
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Сообщение DarkWolf »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3307753#p3307753"]
DarkWolf писал(а):пробывал выводить на экран символ для проверки. Ничего не происходило.
Выведите на экран значение регистров ACSR и SREG.
Там где у вас R27 R28 +9В, надеюсь при подаче +9В у вас должно происходит прерывание, а так же при снятии +9В, или у вас +9В постоянно подается?[/uquote]

Значение регистра ACSR = 0x48 значение регистра SREG = 0x80

+9В питание постоянное от батарейки. С помощью компаратора отслеживаю разряд батарейки.

Добавлено after 1 minute 15 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3307766#p3307766"]бывает (я сталкивался) у авр если питание на компаратор идет от внутреннего опорника - надо BOD фьюзы настраивать иначе опорник не включается[/uquote]

после настройки компаратора делаю задержку 100 us, ничего не помогло..
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

DarkWolf писал(а):Значение регистра ACSR = 0x48 значение регистра SREG = 0x80
+9В питание постоянное от батарейки. С помощью компаратора отслеживаю разряд батарейки.
При поданном напряжении +9В значение регистра ACSR = 0x48,
при убранном напряжении +9В значение ACSR = 0x68.
Проверьте еще раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

На самой лапе напряжение измеряли? Может сопля какая где на плате.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

А какие номиналы резисторов R27 R28?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

[uquote="DarkWolf",url="/forum/viewtopic.php?p=3307843#p3307843"][uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3307766#p3307766"]бывает (я сталкивался) у авр если питание на компаратор идет от внутреннего опорника - надо BOD фьюзы настраивать иначе опорник не включается[/uquote]после настройки компаратора делаю задержку 100 us, ничего не помогло..[/uquote] а BOD Level какой поставили? (хрен с ними, с задержками :) )
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

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