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

|
Не могу понять что за прикол ((( По инету, где описывают прерывание (включая видеоуроки), говорят, что подтягивающий резистор и само прерывание нужно подключать на общий провод. Но когда закинул мелкую прогу на ATtiny2313A (с 2-я прерываниями), прерывание на общем проводе не работали, а на VCC работали. На 8515 и 8535 работает нормально. )) Подскажите плз, что это за прикол. Почему так? Может что-то упустил из даташита? Для точности даю код и видео, как работает: http://www.youtube.com/watch?v=JBMInzEEQogCODE #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] для длинного кода!!!
|
|
|
|
|
Jul 27 2012, 15:32
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ZhukV @ Jul 27 2012, 18:22)  Не могу понять что за прикол ((( Объяснить тоже не очень получается. Цитата(ZhukV @ Jul 27 2012, 18:22)  По инету, где описывают прерывание (включая видеоуроки), говорят, что подтягивающий резистор и само прерывание нужно подключать на общий провод. Но когда закинул мелкую прогу на ATtiny2313A (с 2-я прерываниями), прерывание на общем проводе не работали, а на VCC работали. Видимо не туда подтяжку на входе включили, вот и не работает.
|
|
|
|
|
Jul 27 2012, 15:38
|
Группа: Новичок
Сообщений: 7
Регистрация: 26-07-12
Пользователь №: 72 921

|
Цитата Видимо не туда подтяжку на входе включили, вот и не работает. Можно по подробней, или ссылку, где можно об этом почитать?
|
|
|
|
|
Jul 27 2012, 15:47
|
Группа: Новичок
Сообщений: 7
Регистрация: 26-07-12
Пользователь №: 72 921

|
Ну как бы такого и ничего, просто пытаюсь более точно разобраться с контроллерами. Вопрос возник в том, почему не работает прерывание, когда подключено на общий провод, а заработал тогда, когда подключил на массу.
|
|
|
|
|
Jul 27 2012, 16:11
|
Гуру
     
Группа: Свой
Сообщений: 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/спаде на входе.
|
|
|
|
|
Jul 27 2012, 20:43
|

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

|
Там еще вроде программируется "falling or rising edge or a low level". Т.к. можно заказать, чтобы прерывание срабатывало от дерганья вверх, вниз или уровня. Например, если было установлено прерывание на подъем, то от VCC оно работать будет, а от земли нет, потому что через внутрений резистор подтяжки (там где-то 50 ком) напряжение нарастает медленнее, чем это требуется для срабатывания прерывания. В вашем случае, видимо, проще запрограммировать "low level", чтобы недостаточная скорость нарастания или спада сигнала не помешала детекции прерывания.
|
|
|
|
|
Jul 27 2012, 22:32
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Xenia @ Jul 28 2012, 00:32)  Нет, конечно. Как так? А зачем его тогда на входах ставят? Цитата(Xenia @ Jul 28 2012, 00:32)  А вот прерыванию по низкому уровню, кажется, ничто помешать не может. Может (если следовать вашей логике, конечно): раз перепада не возникло, то и уровня не было - формируются то они от одного и того же сигнала.
|
|
|
|
|
Jul 28 2012, 03:33
|
Участник

Группа: Участник
Сообщений: 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 цепочку вешать с постоянной несколько секунд - интегратор - и все будет работать нормально.
|
|
|
|
|
Jul 30 2012, 05:38
|
Группа: Новичок
Сообщений: 7
Регистрация: 26-07-12
Пользователь №: 72 921

|
SON.OF.STONE, Огромное спасибо. Действительно мой косяк! Все работает!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|