Пару недель назад спрашивал почему не программируется mega128, кажется нашел решение
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено vvkvvk 01 августа 2005 г. 06:20

OSCCAL=AB, AC, A1, A1
BLEV=1
BODEN=1
SUT=2
CKSEL=F
BLB1=3
BLB0=3
OCDEN=1
JITAGEN=0
CKOPT=0
EESV=1
BSIZ=0
BRST=1
M103C=0
WDTON=1
Рабочий вариант программы:

#include
#include
#include
#include

int main(void)
{
DDRC = 0xff;
for (;;)
{
PORTC=0xff;
i=0;
while(i<=32000)
{j=0;
while(j<=100)
{j++;}
i++;
}
PORTC=0x00;
i=0;
while(i<=32000)
{j=0;
while(j<=100)
{j++;}
i++;
}
}
return 0;
}


Не рабочий вариант:

#include
#include
#include
#include

int i,j;

int wait(void)
{
i=0;
while(i<=32000)
{
j=0;
while(j<=100)
{j++;}
i++;
}
return 0;
}

int main(void)
{
DDRC = 0xff;
for (;;)
{
PORTC=0xff;
wait();
PORTC=0x00;
wait();
}
return 0;
}

Помогает изменение границы стека (вставить нужно до цикла FOR), для этого
Volatile uint8_t ptr;
Asm volatile{
“ldi r28,0xff” “\n\t”
“ldi r29,0x0f” “\n\t”
“out 0x3E,r29” “\n\t”
“out 0x3D,r28” “\n\t”
:
: “e”(ptr)
: “r24”
};

Передвинул границу стека с 0x10FF -> 0xFFF. Такая граница получается после компилирования в AVRGCC, и в документации на Mega128 сказано, что последний адрес SRAM памяти 0x10FF. Пробовал менять 0x10FF -> 0x1000 не работает, в общем теряется 256 ячеек памяти. Попробовал запрограммировать два микроконтроллера mega128 в обоих случаях пока не поменяешь границу стека программа не работает. Вопрос: может кто-то может объяснить почему так происходит?

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru