Цитата(=GM= @ Jan 30 2008, 19:44)

Ну и где они? И не надо так кричать...
Если захода в прерывание нет, то
1) Проверьте, разрешено ли глобальное прерывание.
2) Проверьте по листингу, тот ли адрес вектора прерывания установлен.
Мои извинения. Отправить отправил, а прикрепились ли ....
Закоментировал надеюсь понятно. "Костяк" создавал на Кодевизарде.
Ниже Си-шника дизасм по PCINT0.
Chip type : ATmega48
Clock frequency : 0,015625 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*****************************************************/
#include <mega48.h>
// прерывание INT0
interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTD.4=~PORTD.4;
}
// прерывание PCINT
interrupt [PCINT0] void pin_change_isr0(void)
{
PORTD.5=~PORTD.5;
}
//прерывание таймер0 по переполнению
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xF0;//предварительная загрузка таймера
PORTD.6=~PORTD.6;
}
void main(void)
{
// Crystal Oscillator division factor: 256
#pragma optsize-
CLKPR=0x80;
CLKPR=0x08;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Port B initialization
PORTB=0x07;//установка РВ2-0 на вход с подтяжкой
DDRB=0x00;
// Port D initialization
PORTD=0xFF;//установка РD3-0 на вход с подтяжкой, а остальные выводы на выход
DDRD=0xF0;
// Timer/Counter 0 initialization
TCCR0A=0x00;
TCCR0B=0x01;//коэффициент делителя для таймера0
TCNT0=0xF0;// предварительная загрузка таймера0
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
EICRA=0x00;//прерыван. по низкому уровню на INT0
EIMSK=0x01;//разрешение прерыван. на INT0
EIFR=0x01;//обнуление флага прерывания INT0(зачем-то поставил сам компилятор)
PCICR=0x01;//выбор выводов РС7-0 для прерываний
PCMSK0=0x07;//разрешение прерыван. для РС2-0
PCIFR=0x01;//обнуление флага прерывания
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x01;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;
// Analog Comparator initialization
ACSR=0x80;
ADCSRB=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
По вашему совету проверить, а есть ли вектор и правильно ли сделан переход, засел за асм.
Коментариев нет, т.к. код простой. Но на мой не искушенный
взгляд все правильно. Есть вектор перехода и подпрограмма которая меняет бит в РD, но переход не выполняется. Может быть где-то стоит запрет, хотя тотже INT0 работает????
0001 rjamp ext_int0_isr
.
.
0003 rjamp pin_change_isr0
.
.
0054 ext_into_isr rcall 1_00b8
. clt
. sbis $05, 4
. set
. in r26, $0b
. bld r26, 4
. rcall 1_00bc
005b reti
005c pin_change_isr0 rcall 1_00b8
. clt
. sbis $0b, 5
. set
. in r26, $0b
. bld r26, 5
. rcall 1_00bc
0063 reti
.
.
00b8 1_00b8 st -Y, r26
. st-Y, r30
. in r30, $3f
00bb ret
00bc 1_00bc out $0b, r26
. out $3f, r30
. ld r30, Y+
. ld r26, Y+
. ret
Я нахожусь в другом часовом поясе и отвечаю как-бы с "утра".
PS. Не знаю почему, но дизасм отправляешь в нормальном виде, а он форматится и получается все в куче. По колонкам такая информация: | Addrr.. | Label | Disassemble |
Сообщение отредактировал j_serg - Jan 31 2008, 04:27