Задержка на Attiny
Задержка на Attiny
Всем доброго дня.
Не могу понять что за лажа, пишу в AVRS 5, прога работает нормально, и весит нормально. Но как только добавляю функцию _delay_ms(), после компиляции вижу непонятное.
Device: attiny13
Program: 3836 bytes (374.6% Full)
(.text + .data + .bootloader)
Data: 8 bytes (12.5% Full)
(.data + .bss + .noinit)
Что я не правильно делаю?
Заранее всем спасибо.
Не могу понять что за лажа, пишу в AVRS 5, прога работает нормально, и весит нормально. Но как только добавляю функцию _delay_ms(), после компиляции вижу непонятное.
Device: attiny13
Program: 3836 bytes (374.6% Full)
(.text + .data + .bootloader)
Data: 8 bytes (12.5% Full)
(.data + .bss + .noinit)
Что я не правильно делаю?
Заранее всем спасибо.
- Реклама
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Задержка на Attiny
очевидно, в параметре функции _delay_ms() вы указываете переменную, а не константу. ну и само собой, не читали документацию по этой функции.
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Задержка на Attiny
в delay стоит константа, "_delay_ms(440)".
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: Задержка на Attiny
А Вы не забыли подключить <util/delay.h> ?
- Реклама
Re: Задержка на Attiny
Вот код:
Код: Выделить всё
#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);
}
}
}
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Задержка на Attiny
Вставил сюда:
Получил:
Код: Выделить всё
if (u > 685) // U=3.35V
{
OCR0A = 254;
OCR0B = OCR0B+1;
_delay_ms(10);
}
_delay_ms(440);
}
AVRS version 4.13 SP2Build 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)
Docendo discimus
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Задержка на Attiny
Программа разрастается до 3-4кБ , если отключить оптимизацию.
Re: Задержка на Attiny
с -O2 еще меньше: 20.3% Full
Re: Задержка на Attiny
А если дизассемблер поглядеть? Что там? С delay и без?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Задержка на Attiny
Проблема очевидна - выключена оптимизация. Зайдите а Project -> Properties, В закладке Toolchain -> AVR/GNU C Compiler -> optimization поставьте -Os и будет все гут.
Все будет только лучше, в крайнем случае - хуже.


