Страница 1 из 1
Задержка на Attiny
Добавлено: Чт янв 19, 2012 14:10:51
Frezerok
Всем доброго дня.
Не могу понять что за лажа, пишу в AVRS 5, прога работает нормально, и весит нормально. Но как только добавляю функцию _delay_ms(), после компиляции вижу непонятное.
Device: attiny13
Program: 3836 bytes (374.6% Full)
(.text + .data + .bootloader)
Data: 8 bytes (12.5% Full)
(.data + .bss + .noinit)
Что я не правильно делаю?
Заранее всем спасибо.
Re: Задержка на Attiny
Добавлено: Чт янв 19, 2012 14:19:41
Мастер Ломастер
очевидно, в параметре функции _delay_ms() вы указываете переменную, а не константу. ну и само собой, не читали документацию по этой функции.
Re: Задержка на Attiny
Добавлено: Чт янв 19, 2012 17:02:47
Frezerok
в delay стоит константа, "_delay_ms(440)".
Re: Задержка на Attiny
Добавлено: Чт янв 19, 2012 17:14:57
s_black
А Вы не забыли подключить <util/delay.h> ?
Re: Задержка на Attiny
Добавлено: Чт янв 19, 2012 17:15:34
pyzhman
Не плохо бы проект выложить.
Re: Задержка на Attiny
Добавлено: Чт янв 19, 2012 17:54:54
Frezerok
Вот код:
Код: Выделить всё
#define F_CPU 6000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0x03;
PORTB = 0x00;
ADCSRA |= (1 << ADEN)|(1 << ADPS1)|(1 << ADPS0);
ADMUX |= (0 << REFS0)|(1 << MUX0)|(1 << MUX1);
TCCR0A = (1 << COM0A1)|(0 << COM0A0)|(1 << COM0B1)|(0 << COM0B0)|(1 << WGM01)|(1 << WGM00);
TCCR0B = (0 << WGM02) |(0 << CS02) |(0 << CS01) |(1 << CS00);
TCNT0 = 0x00;
CLKPR = 0x80;
while(1)
{
unsigned int u;
ADCSRA |= (1 << ADSC);
while ((ADCSRA&(1 << ADIF))== 0);
u = (ADCL|ADCH << 8);
if (u < 645)
{
OCR0A = 0;
OCR0B = 0;
}
if ((u >= 645)&&(u < 665)) // U=3.15V
{
OCR0A = 77;
OCR0B = 0;
}
if ((u >= 665)&&(u < 675)) // U=3.25V
{
OCR0A = 128;
OCR0B = 0;
}
if ((u >= 675)&&(u < 685)) // U=3.30V
{
OCR0A = 204;
OCR0B = 0;
}
if (u > 685) // U=3.35V
{
OCR0A = 254;
OCR0B = OCR0B+1;
_delay_ms(10);
}
}
}
Re: Задержка на Attiny
Добавлено: Чт янв 19, 2012 18:10:43
pyzhman
Вставил сюда:
Код: Выделить всё
if (u > 685) // U=3.35V
{
OCR0A = 254;
OCR0B = OCR0B+1;
_delay_ms(10);
}
_delay_ms(440);
}
Получил:
Build started 19.1.2012 at 19:10:38
avr-gcc.exe -mmcu=attiny13 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ttt.o -MF dep/ttt.o.d -c ../ttt.c
avr-gcc.exe -mmcu=attiny13 -Wl,-Map=ttt.map ttt.o -o ttt.elf
avr-objcopy -O ihex -R .eeprom ttt.elf ttt.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex ttt.elf ttt.eep || exit 0
avr-objdump -h -S ttt.elf > ttt.lss
AVR Memory Usage
----------------
Device: attiny13
Program: 212 bytes (20.7% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
AVRS version 4.13 SP2
Re: Задержка на Attiny
Добавлено: Пт янв 20, 2012 03:58:04
BerZerK-ku
Программа разрастается до 3-4кБ , если отключить оптимизацию.
Re: Задержка на Attiny
Добавлено: Пт янв 20, 2012 08:32:17
a_skr
с -O2 еще меньше: 20.3% Full
Re: Задержка на Attiny
Добавлено: Сб янв 21, 2012 12:21:37
YS
А если дизассемблер поглядеть? Что там? С delay и без?
Re: Задержка на Attiny
Добавлено: Сб янв 21, 2012 15:46:31
coredumped
Проблема очевидна - выключена оптимизация. Зайдите а Project -> Properties, В закладке Toolchain -> AVR/GNU C Compiler -> optimization поставьте -Os и будет все гут.