Обсуждаем контроллеры компании Atmel.
Ответить

Не срабатывает прерывание компаратора attiny2313

Сб янв 25, 2020 23:47:28

Уважаемы товарищи, помогите плиз.

Не срабатывает прерывание ANA_COMP_vect
Вроде банальный код но не работает
Помогите пожааалуйста

Вот код:
Код:
#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>


ISR(ANA_COMP_vect)
{
    PORTB &= 0b11111011;
}

int main(void)
{
   DDRB = 0b00000100; //на выход 3 пин
   PORTB = 0b11111100; //два пина компоратора отключаем от подтягивающего резистора
   
   ACSR = 0b00001000; //разрешаем прерывание, срабатывает по любому изменению
   
   sei();
   
    while(1)
    {
    }
}


Вот схема
Capture1111.PNG
(23.51 KiB) Скачиваний: 186


Ожидание что после переведения переменного резистора в минимальное положение светодиод должен загореться. Но увы.

При этом в main делал считывание бита ACI

Код:
while(1)
    {
      
      if(ACSR&(1<<ACI))
      {
         PORTB &= 0b11111011;
      }
      else
      {
         PORTB |= 0b00000100;
      }
    }


и ACO

Код:
while(1)
    {
      
      if(ACSR&(1<<ACO))
      {
         PORTB &= 0b11111011;
      }
      else
      {
         PORTB |= 0b00000100;
      }
    }


Все работает логично.

ACO включает при переводе в нижнее положение резистора и выключает при переводе в вернее
а
ACI включает диод при первом переходе - т.е. флаг прерывания выставляется, но сам обработчик не срабатывает.

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 01:11:47

По своему действию рассматриваемый узел микроконтроллера яв-
ляется обычным компаратором. Если напряжение на выводе AIN0 (не-
инвертирующий вход) больше напряжения на выводе AIN1(инверти-
рующий вход), то результат сравнения будет равен «1». В противном
случае результат сравнения будет равен «0». Этот результат сохраняет-
ся в разряде ACO регистра ACSR.


Как уже было отмечено, в соответствии с результатом сравне-
ния схема компаратора может генерировать запрос на прерыва-
ние. Если состояние выхода компаратора (разряд ACO) измени-
лось заданным образом, устанавливается флаг прерывания ACI
регистра ACSR и генерируется запрос на прерывание. Как и для
других прерываний, этот флаг сбрасывается аппаратно при за-
пуске подпрограммы обработки прерывания или программно,
записью в него лог. 1. Для разрешения прерывания необходимо
установить в «1» разряд ACIE регистра ACSR и, разумеется, флаг
I регистра SREG.


Условие генерации запроса на прерывание от компаратора
определяется состоянием разрядов ACIS1:ACIS0 регистра ACSR
в соответствии с Табл. 1.49. При изменении этих разрядов преры-
вание от компаратора (как и для разряда ACD) должно быть за-
прещено.

Tab.png

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 09:43:05

Самсусамыч, у меня эта книжка есть целиком. Ваши цитаты к сожалению не приблизили меня к ответу на вопрос почему прерывание не срабатывает. Если можно подскажите, пожалуйста, что именно в моей схеме / коде не так.

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 09:58:35

Если проверять в железе, думаю, нужно вводить гистерезис.
Можно, для проверки, переключиться на срабатывание по спаду ACO.

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 10:53:58

Если можно подскажите, пожалуйста, что именно в моей схеме / коде не так.

Я не знаю Си, потому мне сложно увидеть, что в коде не так. Единственно, чего я не увидел в коде, так это разрешение глобальных прерываний установленных в регистре SREG (бит I). Если его нет, то прерывание от компаратора (и других прерываний) не сработает, независимо от того, что в регистре компаратора ACSR установлен бит ACIE – включить прерывание.

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 11:12:54

Самсусамыч, sei(); - это команда ассемблера SEI которая установленных в регистре SREG (бит I)
akl, до железа хочется убедиться что я правильно понимаю как вообще это сделать :) а пока я судя по всему не понимаю как это работает, хотя вроде все делаю ровно по описанию

Может у когоо есть работающий пример с этим прерыванием

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 12:00:57

Самсусамыч, sei(); - это команда ассемблера SEI которая установленных в регистре SREG (бит I)

Теперь заметил… :)

Я могу написать рабочий код для компаратора тини2313, но только на АВ (Algorithm Builder). Но предполагаю он тебе не поможет. :dont_know:

Re: Не срабатывает прерывание компаратора attiny2313

Вс янв 26, 2020 12:32:37

Настройки компаратора
регистр ACSR
режим выводов
регистр
DIDR (AIN1D, AIN0D)
8)
Ну и не забываем о инвертирующем и неинвертирующем входах...
:roll:
(предпочитаю тиньки под ассемблером)
:hunger:

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 14:02:12

Я могу написать рабочий код для компаратора тини2313, но только на АВ (Algorithm Builder). Но предполагаю он тебе не поможет. :dont_know:
поможет - имена регистров теже (особенно если не мастером настраивать, а порегистрово), принцип примерно тотже... ктомуже будет хекс, которым т.с. сможет проверить свой протеусовый проект...

Re: Не срабатывает прерывание компоратора attiny2313

Вс янв 26, 2020 15:06:40

поможет.

Тогда вот, можно пробовать… Схема взята у ТС… правда на вывод РВ0 подключён внутренний ИОН (1,23 В). При напряжении РВ1 выше 1,23 В светик должен не гореть, соответственно ниже 1,23 В должен загореться.
tiny2313_AC.hex

1.png

Re: Не срабатывает прерывание компаратора attiny2313

Вс янв 26, 2020 22:31:48

реализовал на макетке свой код, работает.

похоже протеус чудит.
Ответить