Перейти к содержанию

Goodefine

Members
  • Постов

    1 567
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Goodefine

  1. Ему не до лампочки, gcc все правильно трактовал, в соответствии со стандартом. Да и вообще, сравнивать эти два компилятора нельзя, кодевижн заточен под начинающих и строго стандартов не придерживается, да и оптимизация там оставляет желать лучшего. Gcc же весьма серьезный и строгий компилятор с хорошей оптимизацией. Иару уступает конечно, но далеко не всегда, а иногда и превосходит.

  2. Да чего удивлятся, там куча волательных переменных приводящихся к плавающим, во всяких ифах и прочих. Для примера, если их закомментировать, то одна строчка

    while( VP < VPSTART ) {}
    

    дает 90% флэша. (Со 110 на 20);

    а вариант

    while( VP < (unsigned int)VPSTART ) {}
    

    Занимает 1,3 % (21,3% с ней против 20 % вообще без этой строчки). Вопросы? А кодевижн это вообще нечто не стандартное, потому как считает знает тока его создатель

  3. Компилятор сделал ровно то, о чем его просили. Вы применяете параметризованные макросы с плавающей точкой, а в коде пишете, например:

    DAC_data = VCSNORM;
    

    где переменная приводится к плавающему типу, к тому же объявлена с квалификатором volatile. Так что литералами тут и не пахнет.

  4. Что за уровень оптимизации? У меня стоит Os - это оно?

    И логи компилирования - это что? Какой-то файл?

    Оно. А логи пишутся, например в Build Log вашей среды разработки, примерно в таком виде:

    -------------- Build: Release in joy ---------------
    [ 50.0%] avr-gcc.exe -Wall -mmcu=atmega8 -DF_CPU=12000000UL  -Os -g  -mmcu=atmega8 -Wall -Wa,-ahl=listing.lst    -c main.c -o obj\Release\main.o
    [100.0%] avr-g++.exe  -o bin\Release\joy.elf obj\Release\main.o   -mmcu=atmega8 -Wl,-Map=bin\Release\joy.elf.map,--cref -s 
    Output size is 636.00 bytes
    [ 33.3%] Running project post-build steps
    [ 66.7%] avr-size --mcu=atmega8 --format=avr bin\Release\joy.elf
    AVR Memory Usage
    ----------------
    Device: atmega8
    Program:	 338 bytes (4.1% Full)
    (.text + .data + .bootloader)
    Data:		  9 bytes (0.9% Full)
    (.data + .bss + .noinit)
    [100.0%] avr-objcopy -O ihex -R .eeprom -R .eesafe bin\Release\joy.elf bin\Release\joy.elf.hex
    avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex bin\Release\joy.elf bin\Release\joy.elf.eep.hex
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    

    Ну а в чем дело уже написали...

  5. Там все просто в принципе. Но из-за особенностей когда-то примененной среды AtmanAVR, получилось много лишних исходных файлов, часть которых можно было бы объединить в один. Можно собрать под Студией или Codeblock-ом с WinAvr. А с Кодевижном завязывайте, именно на этом проекте он зашился (только пятисимвольный) , один и тот же код при компиляции им не работал, WinAvr же справлялся отлично.

  6. А если бы ваш шеф на юбилей захотел новенький бмв, вы бы отписались на автофоруме, с просьбой накидать простенький чертежик с инструкцией по сборке? Так вот, со строкой, в вашем случае, это примерно равнозначно, поскольку итог будет один и тот же - это банально недостижимо с вашим уровнем знаний и навыков. Выход только один - купить, ну или завернуть кое что в газету ему на ДР...

  7. Да проблему то вы создали на ровном месте. Иногда нужно и даташит читать. Объясняю - регистр захвата физически состоит из двух регистров, которые надо считывать в определенном порядке: сначала младший, потом старший. Ваша запись:

    val=ICR1H<<8|ICR1L;
    

    не дает однозначного задания последовательности считывания регистров компилятору. Поэтому периодически (оптимизация) происходило считывание в неправильном порядке. В первом измерении байт терялся (256), а во втором он прибавлялся. Например, минимальный код:

    /*****************************************************
    Chip type			   : ATmega16
    Program type		    : Application
    AVR Core Clock frequency: 8,000000 MHz
    *****************************************************/
    #include <mega16.h>
    #include <delay.h>
    #include <stdlib.h>
    #include <stdio.h>
    unsigned char ch[10];
    volatile unsigned int val=0;
    volatile unsigned int last_val=0;
    volatile unsigned int buf=0;
    unsigned char fl_izm=0;
    // Timer1 input capture interrupt service routine
    interrupt [TIM1_CAPT] void timer1_capt_isr(void)
    {
    val=ICR1H<<8|ICR1L;
    buf=(val-last_val);
    last_val=val;
    fl_izm=1;
    }
    void main(void)
    {
    // Port D initialization
    PORTD=0xFF;
    DDRD=0x02;
    // Timer/Counter 1 initialization
    TCCR1B=0x02;
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x20;
    // USART initialization
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x08;
    // Analog Comparator initialization
    ACSR=0x80;
    SFIOR=0x00;
    // Global enable interrupts
    #asm("sei")
    while (1)
      { 
    	 if(fl_izm) 
    	 {  //#asm("cli")
    	    ltoa(buf,ch);
    	    //#asm("sei")
    	    puts(ch);
    	    putsf("\r\n");
    	    fl_izm=0;
    	 }					
      }
    }
    

    Дает примерно такое:

    250

    8720

    10256

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    9744

    10256

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    9744

    10256

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    9744

    10256

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    9744

    10256

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    Но стоит в обработчике однозначно указать последовательность считывания регистров:

    // Timer1 input capture interrupt service routine
    interrupt [TIM1_CAPT] void timer1_capt_isr(void)
    {
    val=ICR1L;
    val|=(ICR1H<<8);
    buf=(val-last_val);
    last_val=val;
    fl_izm=1;
    }
    

    И, вуаля:

    9210

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    10000

    Вот такие-вот грабельки ))) ...

  8. А сколько метров в 100 омах медной проволоки? :help:

    Примерно столько же, сколько ампер в розетке...

    Ампер-единица измерения силы тока.

    Вольт- единица измерения напряжения. Это две совершенно разные величины, так что ответа думаю нет.

    Вы не из тех 10-и? )))

  9. Ну минут десять погонять на сварочнике можно ведь?! ))...

    Хотите 10 минут, придется гонять на токах свыше 1,45. Опять таблицы. А гонять десять минут на 1.13 - смысла особого нет. Для достижения теплового равновесия, выключателям на такие токи, требуется порою больше часа. Учтите, что проверять надо с проводом определенного сечения (отъем тепла от биметалла), для 63А по памяти 16мм.кв., длиной не менее метра.

    будет ли это абсолютно такие же 63 Ампера , что и в бытовой сети 220 В именно для теплового расцепителя ? Вроде нагревание в данном случае ни с чем кроме протекания самого тока / т.е. его "действия" / не связано...

    Связано. Поскольку от формы тока зависит активное сопротивление биметалла (токи Фуко), соответственно и количество тепла рассеиваемого им. Локализация выделения также будет разной.

  10. А ПВ сварочника хватит на час при токе 71А? Сомневаюсь... Если амперметр измеряет действующий ток, то этого достаточно. Некоторую поправку можно сделать (по эталонному выключателю) на высшие гармоники (если есть). Если ток постоянный - то учесть, что при 50Гц нагрев будет немного другим - из-за токов Фуко. Этот коэфф. можно вычислить практически. Он будет примерно одинаков для всех типов. По памяти могу сказать, что отличие существенное (десятки процентов). В любом случае, берете эталон, и экспериментально подбираете ток, при котором выключатель не срабатывает при 30 град в состоянии теплового равновесия. Можно термопару припаять к биметаллу и сравнивать нагрев при 50Гц и от сварочника. Возможностей несколько, но все они подразумевают наличие некоторого оборудования. Вы же, как я понял, хотите готовый ответ без изыскательских работ, увы, так не бывает.

  11. 1.13Iном в течении часа - срабатывать не должен. 1.45Iном - должен. При 30С. Можно также проверять по т.н. калибровочным таблицам. Смысл - нагружается определенным током, обычно от 1.45Iном до 2.5Iном. Смотрят на соответствие времени срабатывания (попадание в вилку) в зависимости от температуры окружающей среды. Главный плюс этого способа - экономия времени. Минусы тоже есть, не совсем очевидные, но есть. Проверка занимает пару минут. У производителя данные таблицы есть. Их можно и самому составить, но тут нужны определенные навыки и опыт. Если интересно, могу кратко объяснить как. Для проверки потребуется соорудить стенд, способный отдать нужный переменный ток, при безопасном напряжении.

×
×
  • Создать...