реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не работают порты, Проблема считывания состояния портом
konstan
сообщение Jan 29 2008, 18:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 16-02-07
Из: Deutschland
Пользователь №: 25 408



Проблема следующая

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

Также не понятно , прерывания ИНТ0 и ИНТ1 настраиваю по фронту, срабатывают по срезу? Полная ерунда.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 29 2008, 18:46
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



smile.gif Телепатируйте фрагменты кода+ инициализацию портов+использование TWI
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 30 2008, 08:43
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



А без прерываний все читается?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
konstan
сообщение Jan 30 2008, 13:36
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 16-02-07
Из: Deutschland
Пользователь №: 25 408



Имею 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 - не имеет значение. Это тождество не подтвердилось.

Проект горит. Нужно это сделать правильно. Такая сложность объясняется наличием сигналов защиты.
Go to the top of the page
 
+Quote Post
Guest_=VRA=_*
сообщение Jan 30 2008, 13:58
Сообщение #5





Guests






Диагноз: вопиющая безграмотность в азах схемотехники, выразившаяся в попытках работать с контактами без всяких мер антидребезга.



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



Рекомендации: никогда более не хвататься за работу, к которой не способен либо которой недостаточно обучен
Go to the top of the page
 
+Quote Post
konstan
сообщение Jan 30 2008, 14:31
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 16-02-07
Из: Deutschland
Пользователь №: 25 408



Я с вами согласен, что есть дребезг.

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

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

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

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

Прикрепляю файл.
Go to the top of the page
 
+Quote Post
Guest_=VRA=_*
сообщение Jan 30 2008, 14:48
Сообщение #7





Guests






Цитата
Обратился, потому что есть проблема. Ее нужно помочь решить. Письма подобного рода ничем не помогают
Ну, если даже рекомендация изучить Хоровица-Хилла не помогает - тогда я пас smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jan 30 2008, 15:33
Сообщение #8


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(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).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 30 2008, 18:05
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



bb-offtopic.gif
--Доктор, у меня ноги чернеют!
--А Вы не пробовали их мыть?
--А что, помогает?
bb-offtopic.gif
Я к чему: если выполнить программу пошагово, например в biggrin.gif AVRStudio biggrin.gif , то Вы с удивлением обнаружите, что вместо PIND зачем-то читаете PINC. И таких глюков обычно тонны. Так что не ленитесь.

Сообщение отредактировал _Pasha - Jan 30 2008, 18:06
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 30 2008, 21:16
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(konstan @ Jan 30 2008, 15:36) *
Имею Atmega8-16AU.
...
В даташите написано, что если включено прерывание INT1, INT0 то настройка выводов регистра DDRD - не имеет значение. Это тождество не подтвердилось.
Дежавю какое-то...
Недавно на этом же форуме мне уже приходилось делать вид, что под вечер я плохо соображаю и просить напомнить мне кое-что по AVR-кам. Тогда товарищ не понял :-)
Посему спрошу прямо - это КАК надо читать даташит, чтобы обнаружить там такое утверждение?
Как можно надеяться, что программа будет работать, если даташит прочитан ТАК?
(По поводу смысла слова "тождество" - срочно читать словарь. Только не как дед Щукарь. Боюсь, Хоровица-Хилла или Титце-Шенка читать рановато...)



p.s[0]="Чтобы заметить, что читаются входы с порта С - не надо даже студию запускать. Достаточно прочесть написанное.";
p.s[1]="Мне таки точно на курсы надо... Упомянутые мной в том треде про тини 26 и тини461...";


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 02:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016