Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятка с ATtiny2313A
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ZhukV
Не могу понять что за прикол (((

По инету, где описывают прерывание (включая видеоуроки), говорят, что подтягивающий резистор и само прерывание нужно подключать на общий провод.
Но когда закинул мелкую прогу на ATtiny2313A (с 2-я прерываниями), прерывание на общем проводе не работали, а на VCC работали.

На 8515 и 8535 работает нормально. ))

Подскажите плз, что это за прикол. Почему так? Может что-то упустил из даташита?

Для точности даю код и видео, как работает:
http://www.youtube.com/watch?v=JBMInzEEQog

CODE
#include <tiny2313a.h>
#include <delay.h>


// Speed
int speed = 1000;

// GoTo left
void toLeft(void)
{
if (PORTB.0 == 1) {
PORTB = 0b10000000;
delay_ms(speed);
}
PORTB = PORTB >> 0b1;

}

// GoTo right
void toRight(void)
{
PORTB = PORTB << 0b1;
if (PORTB.7 == 1) {
delay_ms(speed);
PORTB = 0b00000001;
}
}


interrupt[3] void changeType()
{
PORTD.0 ^= 1;
}

interrupt[2] void changeSpeed()
{
speed -= 100;
if (speed < 100) {
speed = 1000;
}
}


// Main
void main(void)
{
DDRB = 0xFF;
PORTB = 0x01;

DDRD = 0b00001101;
PORTD = 0b00000001;

MCUCR = 0b00001010;
GIMSK = 0b11000000;

#asm("sei");

while (1) {
delay_ms(speed);
if(PORTD.0 == 1) { toLeft(); }
else { toRight(); }
}
}



P.S.
Возможно для кого-то будет казаться вопрос смешным, то учтите, что только второй день как влез в эту "дребедень".
_Артём_
Цитата(ZhukV @ Jul 27 2012, 18:22) *
Не могу понять что за прикол (((

Объяснить тоже не очень получается.

Цитата(ZhukV @ Jul 27 2012, 18:22) *
По инету, где описывают прерывание (включая видеоуроки), говорят, что подтягивающий резистор и само прерывание нужно подключать на общий провод.
Но когда закинул мелкую прогу на ATtiny2313A (с 2-я прерываниями), прерывание на общем проводе не работали, а на VCC работали.

Видимо не туда подтяжку на входе включили, вот и не работает.
ZhukV
Цитата
Видимо не туда подтяжку на входе включили, вот и не работает.


Можно по подробней, или ссылку, где можно об этом почитать?
_Артём_
Цитата(ZhukV @ Jul 27 2012, 18:38) *
Можно по подробней, или ссылку, где можно об этом почитать?

Поподробней сложно - не совсем ясно что вам нужно. Опишите что должна делать ваша программа.
ZhukV
Ну как бы такого и ничего, просто пытаюсь более точно разобраться с контроллерами.
Вопрос возник в том, почему не работает прерывание, когда подключено на общий провод, а заработал тогда, когда подключил на массу.
_Артём_
Цитата(ZhukV @ Jul 27 2012, 18:47) *
Вопрос возник в том, почему не работает прерывание

видимо потому что не возникает условие на которое настроено прерывание.
Цитата(ZhukV @ Jul 27 2012, 18:47) *
когда подключено на общий провод

Что такое "общий провод"?

Цитата(ZhukV @ Jul 27 2012, 18:47) *
заработал тогда, когда подключил на массу.

Видимо запрос прерывания возникает при 0/спаде на входе.
Xenia
Там еще вроде программируется "falling or rising edge or a low level". Т.к. можно заказать, чтобы прерывание срабатывало от дерганья вверх, вниз или уровня. Например, если было установлено прерывание на подъем, то от VCC оно работать будет, а от земли нет, потому что через внутрений резистор подтяжки (там где-то 50 ком) напряжение нарастает медленнее, чем это требуется для срабатывания прерывания. В вашем случае, видимо, проще запрограммировать "low level", чтобы недостаточная скорость нарастания или спада сигнала не помешала детекции прерывания.
_Артём_
Цитата(Xenia @ Jul 27 2012, 23:43) *
В вашем случае, видимо, проще запрограммировать "low level", чтобы недостаточная скорость нарастания или спада сигнала не помешала детекции прерывания.

Как "недостаточная скорость нарастания" может помешать генерации прерывания по спаду?
Триггер Шмитта разве не поможет?
Xenia
Цитата(_Артём_ @ Jul 28 2012, 00:59) *
Как "недостаточная скорость нарастания" может помешать генерации прерывания по спаду?
Триггер Шмитта разве не поможет?


Нет, конечно. Недостаточная скорость нарастания может помешать генерации прерывания по подъёму, а недостаточная скорость падения - прерыванию по спаду. А вот прерыванию по низкому уровню, кажется, ничто помешать не может. sm.gif
_Артём_
Цитата(Xenia @ Jul 28 2012, 00:32) *
Нет, конечно.

Как так?
А зачем его тогда на входах ставят?

Цитата(Xenia @ Jul 28 2012, 00:32) *
А вот прерыванию по низкому уровню, кажется, ничто помешать не может.

Может (если следовать вашей логике, конечно): раз перепада не возникло, то и уровня не было - формируются то они от одного и того же сигнала.
SON.OF.STONE
У автора темы в коде явная ошибка:
DDRD = 0b00001101; (должно быть DDRD = 0b00000001;)
Это значит, что ноги запроса прерываний настроены не как ВХОДЫ а как ВЫХОДЫ на которых выставляется низкий логический уровень. Соответственно - при соединении этих ног микросхемы с + питания происходит короткое замыкание (теоретически даже микросхема может погореть, но я ни разу не наблюдал такого - всетаки какоето ограничение тока там происходит), напряжение на входной цепи все же превышает пороговое значение -> происходит срабатывание прерывания.
Правильная настройка PORTD с включенными резисторами подтяжки на входах запроса прерывания:
Код
  DDRD = 0b00000001;
  PORTD = 0b00001101;

Есть еще одна засада - нет никакой защиты от "дребезга" контактов кнопок, подключенных на входы запроса прерывания.. если одно прерывание отработат быстро четное число раз - то визуально это будет воспринято как отсутствие какого-либо эффекта.
Попробуйте изменить программу следующим образом:
Код
interrupt[3] void changeType()
{
  PORTD.0=0;
}

interrupt[2] void changeSpeed()
{
  PORTD.0=1;
}

P. S.
Цитата
Нет, конечно. Недостаточная скорость нарастания может помешать генерации прерывания по подъёму, а недостаточная скорость падения - прерыванию по спаду. А вот прерыванию по низкому уровню, кажется, ничто помешать не может.
Пины всех современных микроконтроллеров, если они сконфигурированны как вход работают с гистерезисом - т. е. фактически имеют на входе триггер Шмидта. Как бы плавно не спадало-наростало напряжение на входе - пин переключится при некотором пороговом напряжении (которое кстати, является функцией напряжения питания). Можно RC цепочку вешать с постоянной несколько секунд - интегратор - и все будет работать нормально.
ZhukV
SON.OF.STONE, Огромное спасибо. Действительно мой косяк! Все работает!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.