Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание ATmega128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Инж
Привет всем любителям 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
Проверьте fuse m103 (режим эмуляции меги103). Он установлен изначально производителем. Вообще говоря, хрен знает, что делает мега128 при обращении к регистрам которых нет в 103 в этом режиме.
Инж
Цитата(VladimirYU @ Apr 19 2007, 09:43) *
Проверьте fuse m103 (режим эмуляции меги103). Он установлен изначально производителем. Вообще говоря, хрен знает, что делает мега128 при обращении к регистрам которых нет в 103 в этом режиме.


Фузы лично прошивал. Режим 103 убрал.
А в коде проблем нет?
VladimirYU
В инициализации того что связано с прерыванием INT0 ничего криминального не увидел. Может быть ты в прерывания попадаешь первый раз, а потом виснешь в цикле while и не можешь оттуда выйти. Устанавливай какую-нибудь ногу в прерываниях в 1, а в фоне сбрасывай в 0 и посмотри.
Инж
Цитата(VladimirYU @ Apr 19 2007, 10:14) *
В инициализации того что связано с прерыванием INT0 ничего криминального не увидел. Может быть ты в прерывания попадаешь первый раз, а потом виснешь в цикле while и не можешь оттуда выйти. Устанавливай какую-нибудь ногу в прерываниях в 1, а в фоне сбрасывай в 0 и посмотри.


Если я захожу в прерывание то у меня засвечивается светодиод. Этого я не вижу. в цикле тоже не висну. Ставил значение порта принудительно 0 и циклично при этом входил и выходил из прерывания но этот способ игнорирует внешнее прерывание и работает по своему усмотрению.
nss
А у вас достаточны условия генерации прерывания int0.
Имею ввиду что за сигнал идет на ногу PD0 (INT0).
Криминал в коде пока не заметил.
Инж
Цитата(nss @ Apr 19 2007, 10:47) *
А у вас достаточны условия генерации прерывания int0.
Имею ввиду что за сигнал идет на ногу PD0 (INT0).
Криминал в коде пока не заметил.


По даташиту прочитал не менее 50 нс
Я задаю 1мкс длительность отрицательного импульса
А период примерно 600 мкс
rumit2000
Цитата(Инж @ Apr 19 2007, 11:18) *
По даташиту прочитал не менее 50 нс
Я задаю 1мкс длительность отрицательного импульса
А период примерно 600 мкс

А нет варианта что светодиод мигает, но очень быстро, есть возможность осцилой поглядеть?
IgorKossak
Цитата(rumit2000 @ Apr 19 2007, 10:55) *
А нет варианта что светодиод мигает, но очень быстро, есть возможность осцилой поглядеть?

Судя по программе должен мигать со скважностью 100.
Можно и не увидеть.
Инж
Все ребята. Я нашел причину.
Извините за невнимательность.
Хреновая дорожка на плате была как раз по INT0
Пропаял и все заработало
Спасибо что откликнулись.
IgorKossak
Ещё раз убеждаюсь, что программирование это наука о контактах. wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.