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

 
 
> Не работают порты, Проблема считывания состояния портом
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
 
Start new topic
Ответов
konstan
сообщение Jan 30 2008, 13:36
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
ReAl
сообщение Jan 30 2008, 21:16
Сообщение #3


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 31st July 2025 - 20:57
Рейтинг@Mail.ru


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