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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср янв 13, 2010 12:35:17

Сообщение 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 я использую другой метод паузы(который вы мне предложите) с отключенной оптимизацией(при которой работает ШИМ).
Реклама
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение 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().
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Нужна длинная пауза на С++
Точно на С++ ?..
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср янв 13, 2010 12:35:17

Сообщение CEBKA »

Goodefine писал(а):Точно на С++ ?..
Не, по привычке ++ полставил, просто на С
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

20 секунд паузы раскладывается на 9 строк на асме. Это много?
Реклама
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср янв 13, 2010 12:35:17

Сообщение CEBKA »

avreal писал(а):Надо так:

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

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

Вернуться в «AVR»