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

 
 
 
Reply to this topicStart new topic
> Непонятка с 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
_Артём_
сообщение Jul 27 2012, 15:32
Сообщение #2


Гуру
******

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



Цитата(ZhukV @ Jul 27 2012, 18:22) *
Не могу понять что за прикол (((

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

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

Видимо не туда подтяжку на входе включили, вот и не работает.
Go to the top of the page
 
+Quote Post
ZhukV
сообщение Jul 27 2012, 15:38
Сообщение #3





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



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


Можно по подробней, или ссылку, где можно об этом почитать?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 27 2012, 15:43
Сообщение #4


Гуру
******

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



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

Поподробней сложно - не совсем ясно что вам нужно. Опишите что должна делать ваша программа.
Go to the top of the page
 
+Quote Post
ZhukV
сообщение Jul 27 2012, 15:47
Сообщение #5





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



Ну как бы такого и ничего, просто пытаюсь более точно разобраться с контроллерами.
Вопрос возник в том, почему не работает прерывание, когда подключено на общий провод, а заработал тогда, когда подключил на массу.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 27 2012, 16:11
Сообщение #6


Гуру
******

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



Цитата(ZhukV @ Jul 27 2012, 18:47) *
Вопрос возник в том, почему не работает прерывание

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

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

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

Видимо запрос прерывания возникает при 0/спаде на входе.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 27 2012, 20:43
Сообщение #7


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Там еще вроде программируется "falling or rising edge or a low level". Т.к. можно заказать, чтобы прерывание срабатывало от дерганья вверх, вниз или уровня. Например, если было установлено прерывание на подъем, то от VCC оно работать будет, а от земли нет, потому что через внутрений резистор подтяжки (там где-то 50 ком) напряжение нарастает медленнее, чем это требуется для срабатывания прерывания. В вашем случае, видимо, проще запрограммировать "low level", чтобы недостаточная скорость нарастания или спада сигнала не помешала детекции прерывания.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 27 2012, 20:59
Сообщение #8


Гуру
******

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



Цитата(Xenia @ Jul 27 2012, 23:43) *
В вашем случае, видимо, проще запрограммировать "low level", чтобы недостаточная скорость нарастания или спада сигнала не помешала детекции прерывания.

Как "недостаточная скорость нарастания" может помешать генерации прерывания по спаду?
Триггер Шмитта разве не поможет?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 27 2012, 21:32
Сообщение #9


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



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


Нет, конечно. Недостаточная скорость нарастания может помешать генерации прерывания по подъёму, а недостаточная скорость падения - прерыванию по спаду. А вот прерыванию по низкому уровню, кажется, ничто помешать не может. sm.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 27 2012, 22:32
Сообщение #10


Гуру
******

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



Цитата(Xenia @ Jul 28 2012, 00:32) *
Нет, конечно.

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

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

Может (если следовать вашей логике, конечно): раз перепада не возникло, то и уровня не было - формируются то они от одного и того же сигнала.
Go to the top of the page
 
+Quote Post
SON.OF.STONE
сообщение Jul 28 2012, 03:33
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
ZhukV
сообщение Jul 30 2012, 05:38
Сообщение #12





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



SON.OF.STONE, Огромное спасибо. Действительно мой косяк! Все работает!
Go to the top of the page
 
+Quote Post

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

 


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


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