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

 
 
 
Reply to this topicStart new topic
endasm
сообщение Aug 31 2012, 21:30
Сообщение #1


Участник
*

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



Изучаю прерывания в AVR и на отладочной плате собрал кое-какую схемку на ATmega16:

Собственно говоря на ней изображена сама проблема - подтянутые резисторами по 1к ножки прерываний INT0 и INT1 ведут себя совершенно пр-разному: прерывание INT0, как я догадываюсь, срабатывает постоянно и "спасает" если только подтянуть ножки прерывания INT0 напрямую к +5v без резистора - тогда второе прерывание INT1 нормально работает. Так же через ножку прерывания INT0 течет довольно большой ток и напряжение на резисторе подтяжки проседает до 0,7в. В чем проблема? Может у меня бракованный\палёный МК ? (Код прилагается ниже)
CODE
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 1000000UL
#include <util/delay.h>

int main(void)
{
DDRB=0b11111111; // настройка PORTB на выход
GICR=(1<<INT0|1<<INT1); // разрешаем прерывания для INT0 и INT1
MCUCR&=~(1<<ISC10|1<<ISC00|1<<ISC01|1<<ISC11); // настройка срабатывания прерывания по "0" на INT0 или INT1

sei(); // глобальное разрешение прерываний
while(1);
}

ISR(INT0_vect) // прерывание по INT0
{
cli(); // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
PORTB=0b00000001;
_delay_ms(500);
PORTB=0b00000000;
sei(); // "1" в 8-ой бит регистра SREG - глобальное разрешение прерываний
}

ISR(INT1_vect) // прерывание по INT1
{
cli(); // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
PORTB=0b00000010;
_delay_ms(500);
PORTB=0b00000000;
sei(); // глобальное разрешение прерываний
}


Сообщение отредактировал IgorKossak - Sep 5 2012, 12:20
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 1 2012, 03:43
Сообщение #2


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(endasm @ Sep 1 2012, 06:30) *
...через ножку прерывания INT0 течет довольно большой ток и напряжение на резисторе подтяжки проседает до 0,7в.

Что произойдёт, если вывод Reset соединить с GND ?
Если МК исправен, то все выводы PORTD должны перейти в 3-е состояние, и на подтянутых INT0 и INT1 должно быть +5V.
Если PORTD2 по-прежнему будет 0,7V, значит неисправен МК или есть дефект во внешней схеме - кнопка, монтаж и т.п.
Если дефект пропадает при сбросе - это программный баг, искать в HEX, который заливается в МК, что там на самом деле пишется в PORTD и DDRD. или проверить другой тестовой программой.
Go to the top of the page
 
+Quote Post
endasm
сообщение Sep 1 2012, 06:33
Сообщение #3


Участник
*

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



Проверил: в той точке всё равно держится 0,7 v и от ресета не меняется.
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Sep 1 2012, 07:16
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Значит или камень битый или где-то КЗ на плате или не к той ноге подпаялся....
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 1 2012, 07:17
Сообщение #5


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Отключите от PORTD2 все провода, кнопки, резисторы... всё отключите. Отключите питание и проверьте мультиметром в режиме прозвонки диодов PORTD2 на GND и VCC в обоих полярностях.
Также прозвоните 2-3 других вывода PORTD, показания сравните с PORTD2. Если последний заметно отличается в меньшую сторону - МК неисправен.
Go to the top of the page
 
+Quote Post
sadat
сообщение Sep 2 2012, 11:55
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 6-07-05
Из: Белгород
Пользователь №: 6 575



"DDRB=0b11111111; // настройка PORTB на выход"

А где настройка порта D на вход??? Обнулите DDRD, а там уж дальше надо смотреть....
Go to the top of the page
 
+Quote Post
endasm
сообщение Sep 2 2012, 23:02
Сообщение #7


Участник
*

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



а зачем его настраивать на вход когда прерывания это аппаратная фича и для этого не нужно настраивать порт на вход. Так?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 23:30
Сообщение #8


Гуру
******

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



Цитата(endasm @ Sep 3 2012, 02:02) *
а зачем его настраивать на вход

После сброса порт D - вход, и проблема наверное не в этом.

Цитата(endasm @ Sep 3 2012, 02:02) *
а зачем его настраивать на вход когда прерывания это аппаратная фича и для этого не нужно настраивать порт на вход. Так?


Ээээ..."отлить в граните".
Не так, может прерывания тоже не нужно разрешать, так как это "аппаратная фича" и не нужно ничего настраивать...

Код
ISR(INT0_vect)                       // прерывание по INT0
{
    cli();                           // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
    PORTB=0b00000001;
    _delay_ms(500);
    PORTB=0b00000000;
    sei();                             // "1" в 8-ой бит регистра SREG - глобальное разрешение прерываний
}

ISR(INT1_vect)                       // прерывание по INT1
{
    cli();                           // "0" в 8-ой бит регистра SREG - глобальное запрещение прерываний
    PORTB=0b00000010;
    _delay_ms(500);
    PORTB=0b00000000;
    sei();                             // глобальное разрешение прерываний
}


Не нужно делать cli/sei в обработчике прерываний мегаАвр - оно само запретит / разрешит на выходе.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 3 2012, 02:12
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
Отключите от PORTD2 все провода, кнопки, резисторы... всё отключите. ......
+1. Что-то мне подсказывает , что
Цитата
ножки прерывания INT0 напрямую к +5v без резистора
таки да , добили микросхему.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
sadat
сообщение Sep 3 2012, 16:32
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 6-07-05
Из: Белгород
Пользователь №: 6 575



Ножку допалить в принципе можно было +5в, но, скорее всего, если дело не в регистрах, то лапка была "пробита" простым 220в паяльником при запайке либо электростатикой...
upd. Прочитал более внимательно написанное выше - ДДРД не причем, вход пробит.
Go to the top of the page
 
+Quote Post
endasm
сообщение Sep 3 2012, 19:49
Сообщение #11


Участник
*

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



Цитата(_Артём_ @ Sep 3 2012, 02:30) *
После сброса порт D - вход, и проблема наверное не в этом.
...
Не нужно делать cli/sei в обработчике прерываний мегаАвр - оно само запретит / разрешит на выходе.

Когда началось прерывание точно не нужно запрещать прерывания? А как же ситуация когда во время выполнения одного прерывания может наступить условие для второго более приоритетного?

Сообщение отредактировал IgorKossak - Sep 5 2012, 12:21
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 3 2012, 20:48
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(endasm @ Sep 3 2012, 23:49) *
Когда началось прерывание точно не нужно запрещать прерывания? А как же ситуация когда во время выполнения одного прерывания может наступить условие для второго более приоритетного?

В atmega-х не может , если сами не разрешите. Почитайте классику - даташит


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 07:33
Рейтинг@Mail.ru


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