Перейти к содержанию
    

Прерывание ATmega128

Привет всем любителям 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);

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте fuse m103 (режим эмуляции меги103). Он установлен изначально производителем. Вообще говоря, хрен знает, что делает мега128 при обращении к регистрам которых нет в 103 в этом режиме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте fuse m103 (режим эмуляции меги103). Он установлен изначально производителем. Вообще говоря, хрен знает, что делает мега128 при обращении к регистрам которых нет в 103 в этом режиме.

 

Фузы лично прошивал. Режим 103 убрал.

А в коде проблем нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В инициализации того что связано с прерыванием INT0 ничего криминального не увидел. Может быть ты в прерывания попадаешь первый раз, а потом виснешь в цикле while и не можешь оттуда выйти. Устанавливай какую-нибудь ногу в прерываниях в 1, а в фоне сбрасывай в 0 и посмотри.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В инициализации того что связано с прерыванием INT0 ничего криминального не увидел. Может быть ты в прерывания попадаешь первый раз, а потом виснешь в цикле while и не можешь оттуда выйти. Устанавливай какую-нибудь ногу в прерываниях в 1, а в фоне сбрасывай в 0 и посмотри.

 

Если я захожу в прерывание то у меня засвечивается светодиод. Этого я не вижу. в цикле тоже не висну. Ставил значение порта принудительно 0 и циклично при этом входил и выходил из прерывания но этот способ игнорирует внешнее прерывание и работает по своему усмотрению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у вас достаточны условия генерации прерывания int0.

Имею ввиду что за сигнал идет на ногу PD0 (INT0).

Криминал в коде пока не заметил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у вас достаточны условия генерации прерывания int0.

Имею ввиду что за сигнал идет на ногу PD0 (INT0).

Криминал в коде пока не заметил.

 

По даташиту прочитал не менее 50 нс

Я задаю 1мкс длительность отрицательного импульса

А период примерно 600 мкс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По даташиту прочитал не менее 50 нс

Я задаю 1мкс длительность отрицательного импульса

А период примерно 600 мкс

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Судя по программе должен мигать со скважностью 100.

Можно и не увидеть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все ребята. Я нашел причину.

Извините за невнимательность.

Хреновая дорожка на плате была как раз по INT0

Пропаял и все заработало

Спасибо что откликнулись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё раз убеждаюсь, что программирование это наука о контактах. ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...