Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATmega128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
RAmsi
Всем доброго времени суток.
Вопрос в следующем. Решил попробовать на зуб Мегу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);
}
demiurg_spb
Обычно стек инициализируется примерно так: SP=RAMEND;
В Вашем случае объём ОЗУ = 4096 = 0x1000.
RAMEND=0x0fff

При каком объёме стека перестаёт работать программа?

Что у Вас со сторожевым таймером?
Он внутри процедуры _delay_ms(xxx) сбрасывается?
Что за компилятор?
Инициализацию всей периферии можно выкинуть (посмотрите чему равны значения регистров периферии после включения контроллера).
Оставьте только DDRA = 0xff;

Цитата(RAmsi @ Nov 13 2010, 21:57) *
Все фъюзы... = 1.
это смущает тоже.
RAmsi
Компиляция в WinAVR - GCC.
Нижнюю границу стека выставлял в Memory Settings. В Makefile появляется --defsym=__stack=0x1000 -Wl. С нижней границей памяти не экспериментировал - пробовал только одно значение 0х1000. Ну и судя по всему - нижний предел 0х10FF когда не выставлял границу принудительно. При эмуляции в Студии сбоев нет. Ну а до каких объемов он вырастает в железе - кто его знает.
Сторожевой таймер не активировал. WDE = 0x00.

PS
Глюки наступают при границе --defsym=__stack=0x1002 -Wl и ниже. Но все начинает работать, как только выставляю оптимизацию -O3
demiurg_spb
Цитата(RAmsi @ Nov 13 2010, 23:32) *
Ну а до каких объемов он вырастает в железе - кто его знает.
Судя по "сложности" тестовой программы ни до каких пор он не вырастает - максимум байт на 10.

Вы внешнюю RAM цепляеете?
Из-за чего танцы со стеком?

Цитата(RAmsi @ Nov 13 2010, 23:32) *
Компиляция в WinAVR - GCC.
Какая версия?
RAmsi
Цитата(demiurg_spb @ Nov 14 2010, 12:22) *
Судя по "сложности" тестовой программ ни до каких пор он не вырастает - максимум байт на 10.


Разбухать ему действительно не на чем. Памяти много. Затирание стека данными отпадает.

Цитата(demiurg_spb @ Nov 14 2010, 12:22) *
Вы внешнюю RAM цепляеете?
Из-за чего танцы со стеком?


Не из-за чего. Дополнительно память не цеплял. Просто менял разные параметры и смотрел на реакцию. Вот и наткнулся на стек.

Цитата(demiurg_spb @ Nov 14 2010, 12:22) *
Какая версия?


WinAVR - 20090313, AVRStudio - 4.16.628
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.