Страница 1 из 1

Нужна длинная пауза на С++

Добавлено: Пт сен 07, 2012 14:22:10
CEBKA
Уважаемые коты, нужна ваша помощь. Нужна длиная пауза (секунд 5-20 а то и больше). Сразу говорю, функция delay не нужна, она делает hex очень большим. Вот код:

#include <avr/io.h>
#include <util/delay.h>

void pause (unsigned int a)
{ unsigned int i;

for (i=a;i>0;i--)
;
}

void init_pwm (void)
{
TCCR1A=(1<<COM1A1)|(1<<WGM10); //Turn 1, if OCR1A==TCNT1, 8-bit PWM, phase correct
TCCR1B=(1<<CS10); //Psescallers= /1

OCR1A=0x00; //Set
}

int main(void)
{ unsigned char i;

DDRB=0x02; //init PB1 as output
init_pwm();


for (i=0;i<255;i++) //More brightness
{
OCR1A++;
pause(1000);
}
for (i=0;i<255;i++) //Less brightness
{
OCR1A--;
pause(1000);
}
{
OCR1A=0xFF;
i=30; while(--i) _delay_ms(100);
}


for (i=0;i<255;i++) //Less brightness
{
OCR1A--;
pause(1000);
}

for (i=0;i<255;i++) //More brightness
{
OCR1A++;
pause(1000);
}

}


Выделенная жирным, это и есть пауза, которую надо заменить. Дело в том, что 15сек delay занимают всю память ATMega8, а мне как минимум понадобится пауз в сумме минут на 5. Хекс получается большим, из за того что я не ставлю оптимизацию в AVR Studio 4.19. Зато когда я ее ставлю, хекс получается маленьким, не больше 1кб, но перестает работать ШИМ.
Нужно решить одну проблему из двух:
1. Когда я использую delay и оптимизацию, у меня должен работать ШИМ.
2. Вместо delay я использую другой метод паузы(который вы мне предложите) с отключенной оптимизацией(при которой работает ШИМ).

Re: Нужна длинная пауза на С++

Добавлено: Пт сен 07, 2012 16:22:06
avreal
CEBKA писал(а):Сразу говорю, функция delay не нужна, она делает hex очень большим.
Функции из util/delay.h не предназначены для работы при компиляции без оптимизации и при передаче аргументов, не являющихся константными выражениями.
In order for these functions to work as intended, compiler optimizations must be enabled, and the delay time must be an expression that is a known constant at compile-time.
CEBKA писал(а):

Код: Выделить всё

void pause (unsigned int a)
{
    unsigned int i;
    for (i=a;i>0;i--)
        ;
} 
Эта функция будет сноситься оптимизатором. Начисто, как курочка дедушке яичко.
Надо так:

Код: Выделить всё

void pause (unsigned int a)
{
    volatile unsigned int i;
    for (i=a;i>0;i--)
        ;
} 
А ещё лучше _delay_us().

Re: Нужна длинная пауза на С++

Добавлено: Пт сен 07, 2012 16:44:59
Goodefine
Нужна длинная пауза на С++
Точно на С++ ?..

Re: Нужна длинная пауза на С++

Добавлено: Пт сен 07, 2012 17:00:47
CEBKA
Goodefine писал(а):Точно на С++ ?..
Не, по привычке ++ полставил, просто на С

Re: Нужна длинная пауза на С++

Добавлено: Пт сен 07, 2012 17:27:22
__Alexander
20 секунд паузы раскладывается на 9 строк на асме. Это много?

Re: Нужна длинная пауза на С++

Добавлено: Пт сен 07, 2012 17:51:20
CEBKA
avreal писал(а):Надо так:

Код: Выделить всё

void pause (unsigned int a)
{
    volatile unsigned int i;
    for (i=a;i>0;i--)
        ;
} 
А ещё лучше _delay_us().
Спс, помогло, теперь все работает с оптимизацией. Не думал что из за одного слова будет такая проблема) еще раз спс