ATTiny2313 и INT0, INT1

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

ATTiny2313 и INT0, INT1

Сообщение mark13121971 »

Пишу просто от безысходности. На ATTiny2313 не хотят работать прерывания INT0, INT1, что в Proteus, что в реальном устройсве. Причем прерывание по изменению состояния на порте В отрабатывается нормально, не срабатывает именно INT0 и INT1. На той же меге8 в Протеусе INT0. INT1 работает нормально, как и должно работать. Уже не знаю что и делать :( И компаратор отключал и цифровые входы, и частоту ставил дефолтную (сначала стояла 20МГц, потом внутренний RC генератор на 8Мгц, хотя частота тут ни причем) , и другой микроконтроллер, все перепробовал, и в ImageCraft компилировал и в CodeVision ничего не помогает.

Вот пример кода из CodeVision:

файл init.c

Код: Выделить всё

#include <tiny2313.h>

void port_init(void) //DDR 1-выход, 0-вход
{
 // Port A initialization
 // Func2=In Func1=In Func0=In 
 // State2=T State1=T State0=T 
 PORTA=0x00;
 DDRA=0x00;
 // Port B initialization
 // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
 // State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P 
 PORTB=0xFF;
 DDRB=0x00;
 // Port D initialization
 // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
 // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
 PORTD=0x00;
 DDRD=0x7F;
}


// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// Interrupt on any change on pins PCINT0-7: Off

void init_devices(void)
{
 #asm("cli")
 port_init();
 GIMSK = 0b01000000;     //01000000 разрешение прерывания INT0, INT1  
 //GIMSK = 0b00100000;   //00100000 прерывания по входам PORTB разрешены
 MCUCR = 0b00000010; //00001010 INT0 по спаду
 //MCUCR=0x00;
 //PCMSK = 0x07;   //прерывания по входам PB0, PB1, PB2
 //EIFR=0x01000000;
 //ACSR = 0x80;
 //DIDR = 0x03;
 #asm("sei")
}
файл main.c:

Код: Выделить всё

#include <tiny2313.h>
#include "init.h"

//ToggleBit не использовать с операцией
#define        SetBit(x,y)                (x|=(1<<y)) 
#define        ClrBit(x,y)                (x&=~(1<<y))
#define        ToggleBit(x,y)             (x^=(1<<y))
#define        TestBit(x,y)               (x&(1<<y))

interrupt [EXT_INT0] void ext_int0_isr(void)
{
 unsigned char k;
 SetBit(PORTD,4);
 for(k=0; k<255; k++) {;}
 ClrBit(PORTD,4);
}

interrupt [PC_INT] void pin_change_isr0(void)
{
 unsigned char k;
 SetBit(PORTD,4);
 for(k=0; k<255; k++) {;}
 ClrBit(PORTD,4);
}

void main(void)
{
 init_devices();
 while (1) {;}
}
Просто тупо включил появление импульса на PD4 для проверки в момент срабатывания прерывания. На вход PB0 поступает короткий отрицательный импульс 200мкс. Ловлю по спаду. Потом просто повесил на PB0 кнопку, все равно на INT0 не реагирует, а на изменение состояния PORTB по тому же PB0 реагирует. Может что-то упустил. Все же просто, как дважды два, а работать не хочет...
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: ATTiny2313 и INT0, INT1

Сообщение SubDia »

Где-то у Вас очень шибко намудрено с конструкцией SetBit. К сожалению, разбираться нет времени.
Запустил с привычными мне конструкциями в CVAVR. Прерывание по нажатию (точнее, отжатию) кнопки отрабатывается.
Видоизменил вот так:

Код: Выделить всё

interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTD |= _BV(4);
delay_ms(100);
PORTD &= ~_BV(4);
delay_ms(100);
EIFR=0b01000000;
return;
}
Если смущает макрос _BV(x), пропишите его с помощью директивы #define (#devine _BV(x) (1<<x)). И библиотеку delay.h тоже включить не забудьте. И в init.h раскомментировать настройку регистра EIFR тоже - а то будете по вектору прерывания улетать сразу, как только подадите питание (только там нужно не "EIFR=0x01000000;" , а "EIFR=0b01000000;").
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Re: ATTiny2313 и INT0, INT1

Сообщение mark13121971 »

Увы, все равно не работает. Уже упростил до минимума:

Код: Выделить всё

interrupt [EXT_INT0] void ext_int0_isr(void)
{
 unsigned char k;
 //SetBit(PORTD,4);
 PORTD = 0b00010000;
 for(k=0; k<255; k++) {;}
 //ClrBit(PORTD,4);
 PORTD = 0b00000000;
 EIFR=0b01000000;
}
хотя чистить флаг в обработчике не нужно, он сам очищается при входе в подпрограмму.
А этот макрос #define SetBit(x,y) (x|=(1<<y)) никогда не подводил. Это макросы из хелпа для компилятора ImageCraft. Всегда их использую.
А проверяли в Протеусе?
Последний раз редактировалось mark13121971 Пн авг 22, 2011 13:09:33, всего редактировалось 1 раз.
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: ATTiny2313 и INT0, INT1

Сообщение SubDia »

В Протеусе проверял. Но со своим вариантом.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Re: ATTiny2313 и INT0, INT1

Сообщение mark13121971 »

М-да, чудеса какие-то... Вот же засада :( Просто могу обойтись и прерыванием по изменению сигнала на том же входе (interrupt [PC_INT] void pin_change_isr0(void)), которое успешно работает и в протеусе и в реале. Они же никак между собой не звязаны - это совершенно разные прерывания. Просто выставляешь нужные биты в настройках. Просто это уже дело принципа, заставить INT0 также работать.
Последний раз редактировалось mark13121971 Пн авг 22, 2011 13:16:50, всего редактировалось 1 раз.
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: ATTiny2313 и INT0, INT1

Сообщение SubDia »

Я тоже принципиально не отступаю никогда. =)
Сдается мне, все дело в обработчике. В прерывание-то МК входит нормально..
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Re: ATTiny2313 и INT0, INT1

Сообщение mark13121971 »

Но если два разных компилятора генерят такой код, который так работает, а так не работает, видимо с обработчиком все в порядке, где-то еще что-то выставить надо, наверное. А у вас как происходит настройка битов для прерываний INT0?
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: ATTiny2313 и INT0, INT1

Сообщение Леонид Иванович »

Как-то странно, вход INT0 - это PD2, а у Вас порт D настроен на вывод...
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Re: ATTiny2313 и INT0, INT1

Сообщение mark13121971 »

SubDia писал(а):Я тоже принципиально не отступаю никогда. =)
Сдается мне, все дело в обработчике. В прерывание-то МК входит нормально..
Так вот и неизвестно, входит он в прерывание INT0 или не входит. Похоже просто не входит.
В interrupt [PC_INT] void pin_change_isr0(void) входит и отрабатывает. А в interrupt [EXT_INT0] void ext_int0_isr(void) ни в какую не хочет...
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Re: ATTiny2313 и INT0, INT1

Сообщение mark13121971 »

Ничегонеработает писал(а):Как-то странно, вход INT0 - это PD2, а у Вас порт D настроен на вывод...
INT0 это альтернативная функция PB0, если верить даташиту.
PD2 это в Атмеге8
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Re: ATTiny2313 и INT0, INT1

Сообщение mark13121971 »

АААААААААААААААА!!!!!!!!!!!!!!!!!. Сори Ничегонеработает, все понял. Ну я и мудила...Не заметил самого главного, так всегда бывает. Так бы еще мудохался.
Всем спасибо, тема закрыта.
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: ATTiny2313 и INT0, INT1

Сообщение SubDia »

А, ну да. Я-то переписывал инициализацию портов. Прошу прощения, башка дырявая. =)
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»