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

 
 
> Прерывания и странное явление с подтяжкой
endasm
сообщение Aug 31 2012, 21:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-07-12
Пользователь №: 72 673



Изучаю прерывания в 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(); // глобальное разрешение прерываний
}


Сообщение отредактировал IgorKossak - Sep 5 2012, 12:20
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
endasm
сообщение Sep 2 2012, 23:02
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-07-12
Пользователь №: 72 673



а зачем его настраивать на вход когда прерывания это аппаратная фича и для этого не нужно настраивать порт на вход. Так?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 23:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 в обработчике прерываний мегаАвр - оно само запретит / разрешит на выходе.
Go to the top of the page
 
+Quote Post



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

 


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


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