Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания Attiny44
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
maksim-starcity
Вроде в электронике не нуб, написал простую программку, но контроллер, хоть убейся, не уходит в прерывание.
Отлаживал дебаггером AVR Studio 6
Протеус тоже пробовал....
CODE
#define F_CPU 1000000UL
#define CLK PINB2
#include <avr/eeprom.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


ISR(EXT_INT0_vect)
{

PORTA|=_BV(PORTA1);
}

int main(void)
{
//init
cli();
DDRA=0b00000111;
PORTA=0x00;
DDRB=0x00;
PORTB=0b0001100;
// MCUCR|=_BV(1); //Setting INT0 to falling edge interrupt
MCUCR|=1<<ISC01 | 1<<ISC00;
GIMSK|=(1<<INT0); //enable INT0 interrupt
//endinit
sei();
while(1)
{
// if (PINB&(1<<CLK))
{
PORTA|=_BV(PORTA0);
PORTA&=~_BV(PORTA0);
}
}
}

Что я не так делаю?
kovigor
Цитата(maksim-starcity @ Jan 25 2013, 19:18) *
Что я не так делаю?

Сравните сами:

Код
/*******************************************************
This program was created by the
CodeWizardAVR V2.60 Evaluation
Automatic Program Generator
*******************************************************/

#include <tiny44.h>

// Declare your global variables here

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here

}

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-11: Off
MCUCR=(1<<ISC01) | (0<<ISC00);
GIMSK=(1<<INT0) | (0<<PCIE1) | (0<<PCIE0);
GIFR=(1<<INTF0) | (0<<PCIF1) | (0<<PCIF0);

// USI initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
DIDR0=0x00;

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);


// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      }
}
maksim-starcity
с GIFR был косяк.
Хотя исходя из написанного:
• Bit 6 – INTF0: External Interrupt Flag 0
When an edge or logic change on the INT0 pin triggers an interrupt request, INTF0 becomes set
(one). If the I-bit in SREG and the INT0 bit in GIMSK are set (one), the MCU will jump to the corresponding
Interrupt Vector. The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared
when INT0 is configured as a level interrupt.
Можно понять, что INTF0 выставляется сам при уходе в прерывание.
А вообще судя по всему, тот же Simulator в студии и Proteus - косячат, т.к. протеус при добавлении задержек уже неведомую хрень выдает.
kovigor
Цитата(maksim-starcity @ Jan 25 2013, 21:07) *
А вообще судя по всему, тот же Simulator в студии и Proteus - косячат, т.к. протеус при добавлении задержек уже неведомую хрень выдает.

Тут без комментариев. Cимуляторами никогда не пользуюсь, отлаживаю на реальном"железе". AVR - это не тот случай, когда нужен симулятор (ИМХО) ...

Кстати, из приведенного вами текста следует всего лишь, что сначала выставляется INTF0, и уже вследствие этого "the MCU will jump to the corresponding
Interrupt Vector" ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.