Страница 1 из 1

Внешние прерывания и подача питания

Добавлено: Пн окт 20, 2014 12:53:54
sirha
Всем привет должно ли срабатывать внешние прерывание как токо включил микроконтроллер?

Код: Выделить всё

#include <tiny13.h>

interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTB.0=1;
  
}

void main(void)

{

MCUCR=0x00;
GICR=0x40;
PORTB=0x02;
DDRB=0x01;
#asm ("sei");

while(1);

}
или это глюк протеуса???
когда подаю питание на attiny сразу горит светодиод

кстати можно ли вешать кнопку без подтягивающего резистора в реальном железе ?

Re: Внешние прерывания и подача питания

Добавлено: Пн окт 20, 2014 13:42:17
Pink-Pank
Попробуйте перед разрешением прерываний сбросить регистров флагов внешних прерываний. ;) Дело, скорее всего, в том, что флаги в регистре устанавливаются не зависимо от того, разрешили Вы прерывания или нет. И вполне может случится так, что Вы прерывание разрешили, а событие уже когда-то было. ;) Оно и сработает.
Кнопки можно подтягивать и внутренними резисторами. Необходимо помнить, что их номинал колеблется от 30 до 100 кОм. поэтому здесь все зависит от конкретного применения. если контроллер работает в сильной помеховой обстановке, то возможны будут произвольные срабатывания. В этом случае лучше подтянуть их через внешние резисторы меньшим сопротивлением (5-10 кОм).
или это глюк протеуса???
Это скорее Ваше огромное желание как можно быстрей что-то сделать, за полным отсутствием желания сначала разобраться как это работает.
Торопитесь... Куда?

Re: Внешние прерывания и подача питания

Добавлено: Пн окт 20, 2014 18:30:53
sirha
Pink-Pank писал(а):Попробуйте перед разрешением прерываний сбросить регистров флагов внешних прерываний. ;)
если контроллер работает в сильной помеховой обстановке, то возможны будут произвольные срабатывания. В этом случае лучше подтянуть их через внешние резисторы меньшим сопротивлением (5-10 кОм).
или это глюк протеуса???
Это скорее Ваше огромное желание как можно быстрей что-то сделать, за полным отсутствием желания сначала разобраться как это работает.
Торопитесь... Куда?

Насамом деле вы правы я тороплюсь))),но я хочу и раобраться быстрее и чтото сделать :)
бывает наоборот хочеться токо раобраться- человек настроения))

Вообщем прерывания перестали срабатывать в в начале при подаче питания как токо я подключил внешний резистор (все это в протеусе).
У меня когда я управлял двигателем -транзистор+ релюшка- то были ложные срабатывания как ра внешних резисторов не было- это может быть и-за этого?


а сбросить флаги внешних это вы имеете ввиду так?:

Код: Выделить всё

#include <tiny13.h>

interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTB.0=1;
  
}

void main(void)

{

MCUCR=0x00;
GICR=0x00;  // к сбросу   
PORTB=0x02;
DDRB=0x01;
GICR=0x40;  //прерыва нияразрешены
#asm ("sei");

}

когда вот так написал все заработало без внешнего резистора , но это токо в эмуляторе))):

Код: Выделить всё

PORTB=0x02;
DDRB=0x01;
MCUCR=0x00;
 GICR=0x40;

Re: Внешние прерывания и подача питания

Добавлено: Пн окт 20, 2014 19:05:27
Pink-Pank
Внимание! Сначала делаете подтяжку.

Код: Выделить всё

PORTB.1=1;
И ТОЛЬКО ПОСЛЕ ЭТОГО делаете сброс флагов.

Код: Выделить всё

GIFR=0xFF;
Иначе сброс не будет иметь смысла.
Программу свою проанализируйте! Вы сначала разрешаете прерывания, а уж потом делаете подтяжку. Какой уровень у Вас на ножке, пока Вы ее не подтянули? НЕ знаете? Никто не знает. А Протеус считает, что было событие. ;) Большой шанс, что прерывание сработает непреднамеренно. Когда внешний резистор - нужный уровень изначально присутствует ДО настройки прерываний.

Re: Внешние прерывания и подача питания

Добавлено: Пн окт 20, 2014 20:47:58
sirha
Pink-Pank писал(а):Внимание! Сначала делаете подтяжку.

Код: Выделить всё

PORTB.1=1;
И ТОЛЬКО ПОСЛЕ ЭТОГО делаете сброс флагов.

Код: Выделить всё

GIFR=0xFF;
Иначе сброс не будет иметь смысла.
Ничего не понимаю почему GICR = 0b111111;

сброс флагов это их включение ????,а причем тут PORTB.1=1? у меня же PORTB.0

Re: Внешние прерывания и подача питания

Добавлено: Пн окт 20, 2014 22:08:40
Pink-Pank
не GICR, а GIFR. Вы не внимательны.
Сброс производится записью единицы. Читайте мануалы. Вы ленивы.
причем тут PORTB.1=1? у меня же PORTB.0
Вы опять не внимательны. кнопка у Вас заведена на порт B1.

Код: Выделить всё

PORTB.1=1;
Это включение внутреннего подтягивающего резистора к этой ноге. (Естесственно, если она настроена на вход)