vadik802007 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Привет всем любителям AVR. Впервые в своей жизни решил настроить прерывание и как вы думаете? НЕПОЛУЧИЛОСЬ :-) Подскажите кто может в чем проблема. Код приведен ниже. Работаю в ICC AVR. #include <iom128v.h> #include <macros.h> #include "PU_v1.h" unsigned char EVENT_REG=0; void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x10; //m103 output only DDRC = 0x10; PORTD = 0x01; DDRD = 0x00; PORTE = 0x00; DDRE = 0x00; PORTF = 0x00; DDRF = 0x00; PORTG = 0x01; DDRG = 0x1F; } //Watchdog initialize // prescale: 2048K void watchdog_init(void) { WDR(); //this prevents a timout on enabling WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs } #pragma interrupt_handler int0_isr:2 void int0_isr(void) { PORTG|=BIT(Led_ERR); EVENT_REG|=BIT(Ena_SER_DATA); while (EVENT_REG&BIT(Ena_SER_DATA)) { PORTG|=BIT(0); delay3us(); delay3us(); PORTG&=~BIT(0); EVENT_REG&=~BIT(Ena_SER_DATA); } } void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts XDIV = 0x00; //xtal divider XMCRA = 0x00; //external memory port_init(); watchdog_init(); MCUCR = 0x00; EICRA = 0x03; //extended ext ints EICRB = 0x00; //extended ext ints EIMSK = 0x01; TIMSK = 0x00; //timer interrupt sources ETIMSK = 0x00; //extended timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void delay3us(void) { unsigned int i=0; for (i=0;i<48;i++) { NOP(); } } void main(void) { init_devices(); while(1) { WDR(); PORTG|=BIT(Led_RUN); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Проверьте fuse m103 (режим эмуляции меги103). Он установлен изначально производителем. Вообще говоря, хрен знает, что делает мега128 при обращении к регистрам которых нет в 103 в этом режиме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadik802007 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Проверьте fuse m103 (режим эмуляции меги103). Он установлен изначально производителем. Вообще говоря, хрен знает, что делает мега128 при обращении к регистрам которых нет в 103 в этом режиме. Фузы лично прошивал. Режим 103 убрал. А в коде проблем нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба В инициализации того что связано с прерыванием INT0 ничего криминального не увидел. Может быть ты в прерывания попадаешь первый раз, а потом виснешь в цикле while и не можешь оттуда выйти. Устанавливай какую-нибудь ногу в прерываниях в 1, а в фоне сбрасывай в 0 и посмотри. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadik802007 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба В инициализации того что связано с прерыванием INT0 ничего криминального не увидел. Может быть ты в прерывания попадаешь первый раз, а потом виснешь в цикле while и не можешь оттуда выйти. Устанавливай какую-нибудь ногу в прерываниях в 1, а в фоне сбрасывай в 0 и посмотри. Если я захожу в прерывание то у меня засвечивается светодиод. Этого я не вижу. в цикле тоже не висну. Ставил значение порта принудительно 0 и циклично при этом входил и выходил из прерывания но этот способ игнорирует внешнее прерывание и работает по своему усмотрению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nss__ 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба А у вас достаточны условия генерации прерывания int0. Имею ввиду что за сигнал идет на ногу PD0 (INT0). Криминал в коде пока не заметил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadik802007 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба А у вас достаточны условия генерации прерывания int0. Имею ввиду что за сигнал идет на ногу PD0 (INT0). Криминал в коде пока не заметил. По даташиту прочитал не менее 50 нс Я задаю 1мкс длительность отрицательного импульса А период примерно 600 мкс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rumit2000 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба По даташиту прочитал не менее 50 нс Я задаю 1мкс длительность отрицательного импульса А период примерно 600 мкс А нет варианта что светодиод мигает, но очень быстро, есть возможность осцилой поглядеть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба А нет варианта что светодиод мигает, но очень быстро, есть возможность осцилой поглядеть? Судя по программе должен мигать со скважностью 100. Можно и не увидеть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadik802007 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Все ребята. Я нашел причину. Извините за невнимательность. Хреновая дорожка на плате была как раз по INT0 Пропаял и все заработало Спасибо что откликнулись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Ещё раз убеждаюсь, что программирование это наука о контактах. ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться