Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работают порты
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
konstan
Проблема следующая

При возникновении прерывания ( ИНТ0 и ИНТ1) на Atmega8 не могу считать правильно состояния каналов PC5 и PC4. В чем может быть проблемы.

Также не понятно , прерывания ИНТ0 и ИНТ1 настраиваю по фронту, срабатывают по срезу? Полная ерунда.
_Pasha
smile.gif Телепатируйте фрагменты кода+ инициализацию портов+использование TWI
GDI
А без прерываний все читается?
konstan
Имею Atmega8-16AU.

Выводы:

PD2-INT0
PD3-INT1

Выводы PD2 и PD3 посажены через оттягивающее сопротивление на +5В.
Схема питается от конденсатора с большой емкостью. Таким образом после отключения контроллер некоторое время еще работает.

Выводы PD2 и PD3 подключены на вывод реле с 2 положениями. Таким образом если подать питание, реле замкнется и посадит PD2 на землю( PD3 - высокое напряжение). При пропадании напряжения, контроллер питается от конденсатора а реле выключается, замыкаю PD3 на землю ( PD2 - высокий уровень).

В соответствие с этим привожу кусок программы

#define sPWR 0b01110011
#define EN_C4 0b00010000
#define EN_C5 0b00100000

#define EN_D2 0b00000100
#define EN_D3 0b00001000;



cli(); // disavle resilving all interrupt

//Initialization ports MCU

DDRC=0x03; //PC0, PC1 - outport
PORTC=0;
DDRD=0b00000000; // PD3, PD2 - input for external interruprt INT1, INT0

// Exteranal interrupt INT1, INT0 property*/
delay();
loop_until_bit_is_clear(PIND,2);
loop_until_bit_is_set(PIND,3);

PORTC=0;
MCUCR=0b00001111; // INT1 - rising edge, INT0- rising edge
GICR=0b11000000; // INT1 , INT1 - enable
/*
PORTC=EN_C1;

INIT2();

PORTC=EN_C1;*/
PORTC=0;
sei ();



while(1);


//unsigned char type;
ISR (INT0_vect) //(DD2-1) interrupt int0 - onnnnnnnnnnnnn
{
PORTC=0;

do
{
PD=PINC;
PD&=EN_C5; //(PD3)
}
while(PD!=0);


/////////start/////////

}

ISR(INT1_vect) // (PD3-1)interrupt int1 - off
{
PORTC=0;

do
{
PD=PINC;
PD&=EN_C4; //(PD2)
}

while(PD!=0);
////////////stop///////////////
}


Проблема такая
1- не то инициалицируется прерывания ( менял уровень срабатывания прерываний по фронту - ничего не помагало, все равно вызывалось то же прерывание)
2- не могу прочитать состояния выводов порта D.

Объясните что не так сделано.

В даташите написано, что если включено прерывание INT1, INT0 то настройка выводов регистра DDRD - не имеет значение. Это тождество не подтвердилось.

Проект горит. Нужно это сделать правильно. Такая сложность объясняется наличием сигналов защиты.
=VRA=
Диагноз: вопиющая безграмотность в азах схемотехники, выразившаяся в попытках работать с контактами без всяких мер антидребезга.



Лечение: полный курс "Искусства схемотехники" Хоровица и Хилла в виде инъекций в ленивую филейную часть.



Рекомендации: никогда более не хвататься за работу, к которой не способен либо которой недостаточно обучен
konstan
Я с вами согласен, что есть дребезг.

Внимательно смотрите программу.

Допустим у меня вызвалос ложное прерывание INT0 ( то есть контактор PD2 изменил свое состояние с 0 на 1, что соответствует режиму пропаданию питания). В теле программы я опрашиваю состяния вывода PD3 ( так как у нас ложное срабатывание, то вывод не изменил свое состояние, как был 1 так и остался). Если PD3=0 то это не ложное срабатывание и программе нужно выполнить действия при отключении питания, иначе это ложное срабатыание и делать ничего не надо.

Такая же позиция относится к состоянию INT1.

Громкие слова кидать не надо. Обратился, потому что есть проблема. Ее нужно помочь решить. Письма подобного рода ничем не помогают. То что есть здесь дребезг - беспорно. Проблема решается программно.

Прикрепляю файл.
=VRA=
Цитата
Обратился, потому что есть проблема. Ее нужно помочь решить. Письма подобного рода ничем не помогают
Ну, если даже рекомендация изучить Хоровица-Хилла не помогает - тогда я пас smile.gif
=GM=
Цитата(konstan @ Jan 30 2008, 13:36) *
Выводы PD2 и PD3 посажены через оттягивающее сопротивление на +5В.
Выводы PD2 и PD3 подключены на вывод реле с 2 положениями. Таким образом если подать питание, реле замкнется и посадит PD2 на землю (PD3 - высокое напряжение). При пропадании напряжения, контроллер питается от конденсатора, а реле выключается, замыкая PD3 на землю (PD2 - высокий уровень).

1- не то инициалицируется прерывание (менял уровень срабатывания прерываний по фронту - ничего не помагало, все равно вызывалось то же прерывание)
2- не могу прочитать состояния выводов порта D.

Объясните что не так сделано


1) Не надо паниковать, дедушка вра шутит. Надо успокоиться и внятно объяснить, как всё работает и что вы хотите. Ваше объяснение очень сумбурное. В приведённой программе вы НЕ читаете порт Д, вы читаете порт С. Что значит "не то инициалицируется прерывание"? Проинициализируйте то, какое надо, всё в ваших руках.

2) При пропадании питания возникает фронт на инт0, возможно с дребезгом, потом ничего не происходит, пока летит контакт (несколько мс, кстати), потом возникает спад на инт1. По фронту возникает прерывание, в прерывании вы читаете портС4, зачем - вы нам не объясняли, затем вы ждете внутри прерывания, пока портС4 станет 0. Так плохо делать, но допустимо. Что здесь не так, как вы планировали?

Цитата(konstan @ Jan 30 2008, 14:31) *
Допустим у меня вызвалось ложное прерывание INT0 (то есть контактор PD2 изменил свое состояние с 0 на 1, что соответствует режиму пропаданию питания). В теле программы я опрашиваю состяние вывода PD3 (так как у нас ложное срабатывание, то вывод не изменил свое состояние, как был 1 так и остался). Если PD3=0 то это не ложное срабатывание и программе нужно выполнить действия при отключении питания, иначе это ложное срабатыание и делать ничего не надо.

Такая же позиция относится к состоянию INT1

3) Опять нечёткое описание. Слов много, а инфы ноль. Ну где вы в теле программы опрашиваете состояние вывода PD3? У вас всё тело - это while(1).
_Pasha
bb-offtopic.gif
--Доктор, у меня ноги чернеют!
--А Вы не пробовали их мыть?
--А что, помогает?
bb-offtopic.gif
Я к чему: если выполнить программу пошагово, например в biggrin.gif AVRStudio biggrin.gif , то Вы с удивлением обнаружите, что вместо PIND зачем-то читаете PINC. И таких глюков обычно тонны. Так что не ленитесь.
ReAl
Цитата(konstan @ Jan 30 2008, 15:36) *
Имею Atmega8-16AU.
...
В даташите написано, что если включено прерывание INT1, INT0 то настройка выводов регистра DDRD - не имеет значение. Это тождество не подтвердилось.
Дежавю какое-то...
Недавно на этом же форуме мне уже приходилось делать вид, что под вечер я плохо соображаю и просить напомнить мне кое-что по AVR-кам. Тогда товарищ не понял :-)
Посему спрошу прямо - это КАК надо читать даташит, чтобы обнаружить там такое утверждение?
Как можно надеяться, что программа будет работать, если даташит прочитан ТАК?
(По поводу смысла слова "тождество" - срочно читать словарь. Только не как дед Щукарь. Боюсь, Хоровица-Хилла или Титце-Шенка читать рановато...)



p.s[0]="Чтобы заметить, что читаются входы с порта С - не надо даже студию запускать. Достаточно прочесть написанное.";
p.s[1]="Мне таки точно на курсы надо... Упомянутые мной в том треде про тини 26 и тини461...";
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.