Всем доброго времени суток.
Вопрос в следующем. Решил попробовать на зуб Мегу128.
Написал простенькую программку мигания светодиодами.
В AVR Studio нормально все эмулируется. В железе - глюки. Светодиоды нормально мигают только при оптимизации -03. При остальных вариантах оптимизации - молчание.
Проблема полностью исчезает при жестком указании нижней границы стека Specify Initial Stack Address 0x1000. Мигают при любой установке оптимизатора, в том числе и при его отключении.
Объяснить такое поведение не могу - знаний и опыта маловато. Каким образом подъем начального адреса стека оказывает такое влияние - не могу понять.
Интуитивно догадываюсь, что проблемы связаны с адресацией памяти.
По старой привычке прошиваю КодВижном через AVR910. Тактирую кварцем 4МГц. Все фъюзы, в том числе и М103С = 1.
Подскажите, пожалуйста, куда копать. Железяка хоть и работает, и программка - проще некуда, но не хочется дальше двигаться не разобравшись.
Спасибо.
CODE
#define F_CPU 4000000UL
#include <util/delay.h>
#include <avr/io.h>
#define SET_bit(x) |=(1<<x)
#define CLEAR_bit(x) &=~(1<<x)
#define INVERT_bit(x) ^=(1<<x)
void blink(void)
{
PORTA = 0b00000000;
_delay_ms(70);
PORTA = 0b11111111;
_delay_ms(70);
PORTA = 0b00000000;
_delay_ms(70);
PORTA = 0b11111111;
_delay_ms(70);
PORTA = 0b00000000;
_delay_ms(70);
PORTA = 0b11111111;
_delay_ms(70);
PORTA = 0b00000000;
_delay_ms(200);
}
void IOinit(void)
{
PORTA = 0b00000000; // Port A all LL
DDRA = 0b11111111; // all OUT
PORTB = 0b11111111; // Port B all pull-up
DDRB = 0b00000000; // all IN
PORTC = 0b00000000; // Port C all LL
DDRC = 0b11111111; // all OUT
PORTD = 0b11111111; // Port D all pull-up
DDRD = 0b00000000; // all IN
PORTE = 0b11111111; // Port E all pull-up
DDRE = 0b00000000; // all IN
PORTF = 0b11111111; // Port F all pull-up
DDRF = 0b00000000; // all IN
PORTG = 0b00011111; // Port G all pull-up
DDRG = 0b00000000; // all IN
// Timer/Counter 0
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// External Interrupt(s)
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
// Timer(s)/Counter(s) Interrupt(s)
TIMSK=0x00;
ETIMSK=0x00;
// Analog Comparator
ACSR=0x80;
SFIOR=0x00;
}
int main ()
{
IOinit();
while (1)
{
blink();
};
return (0);
}
Сообщение отредактировал IgorKossak - Nov 13 2010, 19:34
Причина редактирования: Используйте тэги codebox