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

Собственно говоря на ней изображена сама проблема - подтянутые резисторами по 1к ножки прерываний INT0 и INT1 ведут себя совершенно пр-разному: прерывание INT0, как я догадываюсь, срабатывает постоянно и "спасает" если только подтянуть ножки прерывания INT0 напрямую к +5v без резистора - тогда второе прерывание INT1 нормально работает. Так же через ножку прерывания INT0 течет довольно большой ток и напряжение на резисторе подтяжки проседает до 0,7в. В чем проблема? Может у меня бракованный\палёный МК ? (Код прилагается ниже)
CODE
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 1000000UL
#include <util/delay.h>

int main(void)
{
DDRB=0b11111111; // настройка PORTB на выход
GICR=(1<<INT0|1<<INT1); // разрешаем прерывания для INT0 и INT1
MCUCR&=~(1<<ISC10|1<<ISC00|1<<ISC01|1<<ISC11); // настройка срабатывания прерывания по "0" на INT0 или INT1

sei(); // глобальное разрешение прерываний
while(1);
}

ISR(INT0_vect) // прерывание по INT0
{
cli(); // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
PORTB=0b00000001;
_delay_ms(500);
PORTB=0b00000000;
sei(); // "1" в 8-ой бит регистра SREG - глобальное разрешение прерываний
}

ISR(INT1_vect) // прерывание по INT1
{
cli(); // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
PORTB=0b00000010;
_delay_ms(500);
PORTB=0b00000000;
sei(); // глобальное разрешение прерываний
}
ae_
Цитата(endasm @ Sep 1 2012, 06:30) *
...через ножку прерывания INT0 течет довольно большой ток и напряжение на резисторе подтяжки проседает до 0,7в.

Что произойдёт, если вывод Reset соединить с GND ?
Если МК исправен, то все выводы PORTD должны перейти в 3-е состояние, и на подтянутых INT0 и INT1 должно быть +5V.
Если PORTD2 по-прежнему будет 0,7V, значит неисправен МК или есть дефект во внешней схеме - кнопка, монтаж и т.п.
Если дефект пропадает при сбросе - это программный баг, искать в HEX, который заливается в МК, что там на самом деле пишется в PORTD и DDRD. или проверить другой тестовой программой.
endasm
Проверил: в той точке всё равно держится 0,7 v и от ресета не меняется.
ArtemKAD
Значит или камень битый или где-то КЗ на плате или не к той ноге подпаялся....
ae_
Отключите от PORTD2 все провода, кнопки, резисторы... всё отключите. Отключите питание и проверьте мультиметром в режиме прозвонки диодов PORTD2 на GND и VCC в обоих полярностях.
Также прозвоните 2-3 других вывода PORTD, показания сравните с PORTD2. Если последний заметно отличается в меньшую сторону - МК неисправен.
sadat
"DDRB=0b11111111; // настройка PORTB на выход"

А где настройка порта D на вход??? Обнулите DDRD, а там уж дальше надо смотреть....
endasm
а зачем его настраивать на вход когда прерывания это аппаратная фича и для этого не нужно настраивать порт на вход. Так?
_Артём_
Цитата(endasm @ Sep 3 2012, 02:02) *
а зачем его настраивать на вход

После сброса порт D - вход, и проблема наверное не в этом.

Цитата(endasm @ Sep 3 2012, 02:02) *
а зачем его настраивать на вход когда прерывания это аппаратная фича и для этого не нужно настраивать порт на вход. Так?


Ээээ..."отлить в граните".
Не так, может прерывания тоже не нужно разрешать, так как это "аппаратная фича" и не нужно ничего настраивать...

Код
ISR(INT0_vect)                       // прерывание по INT0
{
    cli();                           // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
    PORTB=0b00000001;
    _delay_ms(500);
    PORTB=0b00000000;
    sei();                             // "1" в 8-ой бит регистра SREG - глобальное разрешение прерываний
}

ISR(INT1_vect)                       // прерывание по INT1
{
    cli();                           // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
    PORTB=0b00000010;
    _delay_ms(500);
    PORTB=0b00000000;
    sei();                             // глобальное разрешение прерываний
}


Не нужно делать cli/sei в обработчике прерываний мегаАвр - оно само запретит / разрешит на выходе.
ILYAUL
Цитата
Отключите от PORTD2 все провода, кнопки, резисторы... всё отключите. ......
+1. Что-то мне подсказывает , что
Цитата
ножки прерывания INT0 напрямую к +5v без резистора
таки да , добили микросхему.
sadat
Ножку допалить в принципе можно было +5в, но, скорее всего, если дело не в регистрах, то лапка была "пробита" простым 220в паяльником при запайке либо электростатикой...
upd. Прочитал более внимательно написанное выше - ДДРД не причем, вход пробит.
endasm
Цитата(_Артём_ @ Sep 3 2012, 02:30) *
После сброса порт D - вход, и проблема наверное не в этом.
...
Не нужно делать cli/sei в обработчике прерываний мегаАвр - оно само запретит / разрешит на выходе.

Когда началось прерывание точно не нужно запрещать прерывания? А как же ситуация когда во время выполнения одного прерывания может наступить условие для второго более приоритетного?
ILYAUL
Цитата(endasm @ Sep 3 2012, 23:49) *
Когда началось прерывание точно не нужно запрещать прерывания? А как же ситуация когда во время выполнения одного прерывания может наступить условие для второго более приоритетного?

В atmega-х не может , если сами не разрешите. Почитайте классику - даташит
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.