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

 
 
> Непонятка с ATtiny2313A
ZhukV
сообщение Jul 27 2012, 15:22
Сообщение #1





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



Не могу понять что за прикол (((

По инету, где описывают прерывание (включая видеоуроки), говорят, что подтягивающий резистор и само прерывание нужно подключать на общий провод.
Но когда закинул мелкую прогу на 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.
Возможно для кого-то будет казаться вопрос смешным, то учтите, что только второй день как влез в эту "дребедень".

Сообщение отредактировал IgorKossak - Jul 27 2012, 19:30
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SON.OF.STONE
сообщение Jul 28 2012, 03:33
Сообщение #2


Участник
*

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



У автора темы в коде явная ошибка:
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 цепочку вешать с постоянной несколько секунд - интегратор - и все будет работать нормально.
Go to the top of the page
 
+Quote Post



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

 


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


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