|
|
  |
Не работают порты, Проблема считывания состояния портом |
|
|
|
Jan 30 2008, 13:36
|

Участник

Группа: Участник
Сообщений: 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 - не имеет значение. Это тождество не подтвердилось.
Проект горит. Нужно это сделать правильно. Такая сложность объясняется наличием сигналов защиты.
|
|
|
|
Guest_=VRA=_*
|
Jan 30 2008, 13:58
|
Guests

|
Диагноз: вопиющая безграмотность в азах схемотехники, выразившаяся в попытках работать с контактами без всяких мер антидребезга.
Лечение: полный курс "Искусства схемотехники" Хоровица и Хилла в виде инъекций в ленивую филейную часть.
Рекомендации: никогда более не хвататься за работу, к которой не способен либо которой недостаточно обучен
|
|
|
|
Guest_=VRA=_*
|
Jan 30 2008, 14:48
|
Guests

|
Цитата Обратился, потому что есть проблема. Ее нужно помочь решить. Письма подобного рода ничем не помогают Ну, если даже рекомендация изучить Хоровица-Хилла не помогает - тогда я пас
|
|
|
|
|
Jan 30 2008, 15:33
|

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).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jan 30 2008, 21:16
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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...";
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|