реклама на сайте
подробности

 
 
> ATmega128, Оптимизация и стек
RAmsi
сообщение Nov 13 2010, 18:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



Всем доброго времени суток.
Вопрос в следующем. Решил попробовать на зуб Мегу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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 18:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01339 секунд с 7
ELECTRONIX ©2004-2016