LINUX.ORG.RU

ATMEGA8 не вызывается прерывание

 


0

1

Доброго времени суток. В простом примере не получается вызвать прерывание от компаратора. Процесс моделирую в протеусе. Знаю что протеус сам по себе не надежный, но все-же думаю причина не в нем, а в коде ниже, но правда не могу найти где эта «собака» зарыта. Прошу подсказать.

СХЕМА http://s019.radikal.ru/i632/1609/34/6cfdca3a21de.jpg

Из особенностей: подключен ИОН и сравнивается с внешним напряжением через делитель. Но момент сравнения игнорируется прерыванием компаратора и не игнорируется коммандой PORTB = (ACSR&(1<<ACO));

#define F_CPU 1000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

unsigned char a = 0;
ISR(ANA_COMP_vect){
	a = 1; // НЕ СРАБАТЫВАЕТ
}


int main(void) {
	DDRD	= 0b01000000;
	PORTD	= 0b00000000;
	DDRC	= 255;
	PORTC	= 255;
	DDRB=0xFF;

	ACSR |= (0<<ACD) | (1<<ACBG) | (1<<ACIE) | (0<<ACIS0) | (0<<ACIS1) | (0<<ACIC);
	sei();
	//a = 1;
	while(1) {
		if (a){ // НЕ СРАБАТЫВАЕТ
			_delay_ms(50);
			PORTC = 0;
			_delay_ms(50);
			PORTC = 255;
		}
		PORTB = (ACSR&(1<<ACO));
	}
}


Последнее исправление: morkovkin (всего исправлений: 3)

Ответ на: комментарий от Int64

Увы :( Не сработал такой интересный подход. По прежнму отрабатывает PORTB = (ACSR&(1<<ACO)); и всячески игнорируется прерывание.

morkovkin
() автор топика
Ответ на: комментарий от Int64

На компаратор подается напряжение ИОН и внешнее, через делитель от 5 вольт. Строка PORTB = (ACSR&(1<<ACO)); в бесконечном цикле отрабатывает.

morkovkin
() автор топика
Ответ на: комментарий от morkovkin

Ну а может попробовать код:

_delay_ms(50);
PORTC = 0;
_delay_ms(50);
PORTC = 255;
внутрь прерывания? зачем он в главном цикле?

Int64 ★★★
()

У тебя всё правильно написано. Это, видимо, в протеусе прерывание не работает. Внутренне опорное напряжение на неинвертирующем входе компаратора 1.3 вольта, если что.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.