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

Обсуждаем контроллеры компании Atmel.
Ответить
LeonOn1
Открыл глаза
Сообщения: 64
Зарегистрирован: Ср сен 09, 2015 15:36:25

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

Сообщение LeonOn1 »

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

Не срабатывает прерывание 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 КБ) 210 скачиваний
Ожидание что после переведения переменного резистора в минимальное положение светодиод должен загореться. Но увы.

При этом в 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

Сообщение Самсусамыч »

По своему действию рассматриваемый узел микроконтроллера яв-
ляется обычным компаратором. Если напряжение на выводе AIN0 (не-
инвертирующий вход) больше напряжения на выводе AIN1(инверти-
рующий вход), то результат сравнения будет равен «1». В противном
случае результат сравнения будет равен «0». Этот результат сохраняет-
ся в разряде ACO регистра ACSR.
Как уже было отмечено, в соответствии с результатом сравне-
ния схема компаратора может генерировать запрос на прерыва-
ние. Если состояние выхода компаратора (разряд ACO) измени-
лось заданным образом, устанавливается флаг прерывания ACI
регистра ACSR и генерируется запрос на прерывание. Как и для
других прерываний, этот флаг сбрасывается аппаратно при за-
пуске подпрограммы обработки прерывания или программно,
записью в него лог. 1. Для разрешения прерывания необходимо
установить в «1» разряд ACIE регистра ACSR и, разумеется, флаг
I регистра SREG.
Условие генерации запроса на прерывание от компаратора
определяется состоянием разрядов ACIS1:ACIS0 регистра ACSR
в соответствии с Табл. 1.49. При изменении этих разрядов преры-
вание от компаратора (как и для разряда ACD) должно быть за-
прещено.
Tab.png
LeonOn1
Открыл глаза
Сообщения: 64
Зарегистрирован: Ср сен 09, 2015 15:36:25

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

Сообщение LeonOn1 »

Самсусамыч, у меня эта книжка есть целиком. Ваши цитаты к сожалению не приблизили меня к ответу на вопрос почему прерывание не срабатывает. Если можно подскажите, пожалуйста, что именно в моей схеме / коде не так.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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

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

Сообщение Самсусамыч »

[uquote="LeonOn1",url="/forum/viewtopic.php?p=3780183#p3780183"]Если можно подскажите, пожалуйста, что именно в моей схеме / коде не так.[/uquote]
Я не знаю Си, потому мне сложно увидеть, что в коде не так. Единственно, чего я не увидел в коде, так это разрешение глобальных прерываний установленных в регистре SREG (бит I). Если его нет, то прерывание от компаратора (и других прерываний) не сработает, независимо от того, что в регистре компаратора ACSR установлен бит ACIE – включить прерывание.
LeonOn1
Открыл глаза
Сообщения: 64
Зарегистрирован: Ср сен 09, 2015 15:36:25

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

Сообщение LeonOn1 »

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

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

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

Сообщение Самсусамыч »

[uquote="LeonOn1",url="/forum/viewtopic.php?p=3780220#p3780220"]Самсусамыч, sei(); - это команда ассемблера SEI которая установленных в регистре SREG (бит I)[/uquote]
Теперь заметил… :)

Я могу написать рабочий код для компаратора тини2313, но только на АВ (Algorithm Builder). Но предполагаю он тебе не поможет. :dont_know:
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Настройки компаратора
регистр ACSR
режим выводов
регистр
DIDR (AIN1D, AIN0D)
8)
Ну и не забываем о инвертирующем и неинвертирующем входах...
:roll:
(предпочитаю тиньки под ассемблером)
:hunger:
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3780251#p3780251"]Я могу написать рабочий код для компаратора тини2313, но только на АВ (Algorithm Builder). Но предполагаю он тебе не поможет. :dont_know:[/uquote] поможет - имена регистров теже (особенно если не мастером настраивать, а порегистрово), принцип примерно тотже... ктомуже будет хекс, которым т.с. сможет проверить свой протеусовый проект...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Самсусамыч

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

Сообщение Самсусамыч »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3780328#p3780328"]поможет.[/uquote]
Тогда вот, можно пробовать… Схема взята у ТС… правда на вывод РВ0 подключён внутренний ИОН (1,23 В). При напряжении РВ1 выше 1,23 В светик должен не гореть, соответственно ниже 1,23 В должен загореться.
tiny2313_AC.hex
1.png
LeonOn1
Открыл глаза
Сообщения: 64
Зарегистрирован: Ср сен 09, 2015 15:36:25

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

Сообщение LeonOn1 »

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

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

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