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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение 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 сразу горит светодиод

кстати можно ли вешать кнопку без подтягивающего резистора в реальном железе ?
Вложения
пульт.JPG
(211.84 КБ) 511 скачиваний
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Попробуйте перед разрешением прерываний сбросить регистров флагов внешних прерываний. ;) Дело, скорее всего, в том, что флаги в регистре устанавливаются не зависимо от того, разрешили Вы прерывания или нет. И вполне может случится так, что Вы прерывание разрешили, а событие уже когда-то было. ;) Оно и сработает.
Кнопки можно подтягивать и внутренними резисторами. Необходимо помнить, что их номинал колеблется от 30 до 100 кОм. поэтому здесь все зависит от конкретного применения. если контроллер работает в сильной помеховой обстановке, то возможны будут произвольные срабатывания. В этом случае лучше подтянуть их через внешние резисторы меньшим сопротивлением (5-10 кОм).
или это глюк протеуса???
Это скорее Ваше огромное желание как можно быстрей что-то сделать, за полным отсутствием желания сначала разобраться как это работает.
Торопитесь... Куда?
Fucking static initialization order fiasco
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение 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;
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Внимание! Сначала делаете подтяжку.

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

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

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

GIFR=0xFF;
Иначе сброс не будет иметь смысла.
Программу свою проанализируйте! Вы сначала разрешаете прерывания, а уж потом делаете подтяжку. Какой уровень у Вас на ножке, пока Вы ее не подтянули? НЕ знаете? Никто не знает. А Протеус считает, что было событие. ;) Большой шанс, что прерывание сработает непреднамеренно. Когда внешний резистор - нужный уровень изначально присутствует ДО настройки прерываний.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Pink-Pank писал(а):Внимание! Сначала делаете подтяжку.

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

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

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

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

сброс флагов это их включение ????,а причем тут PORTB.1=1? у меня же PORTB.0
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

не GICR, а GIFR. Вы не внимательны.
Сброс производится записью единицы. Читайте мануалы. Вы ленивы.
причем тут PORTB.1=1? у меня же PORTB.0
Вы опять не внимательны. кнопка у Вас заведена на порт B1.

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

PORTB.1=1;
Это включение внутреннего подтягивающего резистора к этой ноге. (Естесственно, если она настроена на вход)
Fucking static initialization order fiasco
Контактная информация:
Реклама
Ответить

Вернуться в «AVR»