Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 01:23

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 63 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 06 май 2020, 23:02 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2745
Откуда: Москва
CReW писал(а):
Больше негде?
Три сосны...

Это может быть не 64-я , а 103-я мега и хоть таймер может и работать , но может и совсем не так. Надо убедится с чем мы имеем дело.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 06 май 2020, 23:41 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Похоже он после этой инструкции
Код:
EICRA = (1<<ISC11)|(1<<ISC10);                           //Прерывание по нарастающему фронту на INT1

Туда заходит, там и время проводит


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 07 май 2020, 15:35 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
ILYAUL писал(а):
Цитата:
Also, the increased number of Interrupt Vectors might be a problem if the code uses absolute addresses.
Похоже у Вас очень правильная 64-ая и надо бы ее проверить на "вшивость". Особенно один fuse.


Как проверить на "вшивость"? Фьюз на совместимость с 103 снят, по умолчанию стоял. Запрограммирован SPIEN, CKOPT, CKSEL1, BOOTSZ0, BOOTRST и все. Пишу на Studio 6.2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 07 май 2020, 15:42 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
CReW писал(а):
Похоже он после этой инструкции
Код:
EICRA = (1<<ISC11)|(1<<ISC10);                           //Прерывание по нарастающему фронту на INT1

Туда заходит, там и время проводит


Да, когда появляется "рабочий" экран на ЖКИ 2004 и он должен заполнятся вычислениями, то ничего не происходит, но это понятно - датчика нет, но и нет прерывания по переполнению таймера. Я выше писал, что ставил EICRA = 0; и все равно прерывания нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 07 май 2020, 22:36 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Собственно, это апгрейд существующего на Mega16, но возникли новые мысли по улучшению и резерву, а у Mega16 осталась всего одна ножка... решил за зимний период перейти на 64-ю... переписал софт, в DipTrace сделал плату, заказал в Китае 5 штук, набил комплектующими, отладил по багам, залил загрузчик, залил ехе работающее в Proteus, и что? Оказывается все это было напрасно из за моей правильной 64-й? Может на 128 перейти?
Извините, просто уже бешусь, а мыслей нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 00:03 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Croco писал(а):
Бред какой то, даже вот так не уходит

Так у вас там в коде status = START закомментировано. Из-за этого по приведенному куску кода явно не работало бы.
Может так проверить, для теста:

Код:
// EICRA = (1<<ISC11)|(1<<ISC10);                           //Прерывание по нарастающему фронту на INT1

    for ( n = 1; n < 7; n++) {
     
   TIMSK = (1 << TOIE1);                              //разрешение прерывания по переполнению TMR1
   EIMSK &= ~(1<<INT1);                                 //разрешение прерывания на INT1
   TCCR1B = (1 << CS11);                              //TMR1 включен, делитель на 8
   //status = START;   === ВОТ ТУТ ЗАБЫЛИ? ===
   asm volatile("sei" : :);
   
    _delay_ms(4000);
   
     Eho_PORT |= (1<<TRIG);                           //запускаем триггер сонара.
     _delay_us(15);
     Eho_PORT &= ~(1 << TRIG);
   
       while (1)                           //ожидание окончания измерения
       {asm volatile("nop" : :);}
         
     EIMSK &= ~(1 << INT1);                           //запрешение прерывания на INT1
     TIMSK &= ~(1<<TOIE1);                              //запрещение прерывания по переполнению TMR1
     TCCR1B &= ~(1 << CS11);                           //TMR1 остановлен
     asm volatile("cli" : :);
     data -= 4;                                    //коррекция измерений
     distance = ((data * 1.085)/S) * 5.0;                  //растояние (мм).
     summ += distance;

     _delay_ms(50);   
    }//for

    distance = summ / 6;                              //среднеарифметическое растояние до уровня воды   

   }//if
      return Temp_L;
}

А в прерывании переполнения таймера зажгите какой-нибудь светодиод, чтобы точно видно было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 12:51 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Нет, я здесь ничего не забыл - хочу тупо заставить таймер уходить в прерывание запретив все кроме работы таймера. Нет прерывания..
Вообще для всеобщего понимания я решил сделать так:
Начало main - инициализация переферии

Код:
// Настройка АЦП канал ADC0 PORTA
   ADCSRA = 0x00;                                         
   ADMUX = 0b01000001;                                 //kанал ADC1 и Vdd опорное напряжение
   ADCSRA |= (1 << ADPS1)|                                //предделитель на 64. Работа АЦП на 115200 Гц
   (1 << ADPS2)|                                     //включение АЦП Включение преобразования вручную.
   (1 << ADEN);
   
// Инициализация LCD 
   LCDinit();
   LCDclr();
   
//Вывод заставки на ЖКИ
    CopyStringtoLCD(TEXT11,1,1);                        //"WATER PURIFICATION"
    CopyStringtoLCD(TEXT12,1,2);                        //"STATION CONTROLLER"
    CopyStringtoLCD(TEXT17,11,3);                        //"Ver. 4.0"
    _delay_ms(4000);

//Проверка ухода в прерывание по переполнению TMR1
TIMSK = (1 << TOIE1);                              //разрешение прерывания по переполнению TMR1
TCCR1B = (1 << CS11);                           //TMR1 включен, делитель на 8   
asm volatile("sei" : :);
_delay_ms(75);
asm volatile("cli" : :);


По Вашей рекомендации зажигаю светодиод, который освободился от загрузчика:

Код:
//Обработчик прерывания по переполнению TMR1
ISR (TIMER1_OVF_vect)                                 
{                                                
    PORT_I_O &= ~(1 << CH1);                           //выключаем VALVE               
    PORT_I_O &= ~(1 << CH2);                           //выключаем PUMP0
    PORT_I_O &= ~(1 << CH3);                           //выключаем PUMP1
    Eho_PORT |= (1 << LED);                           //зажечь светодиод
    LCDclr();
    CopyStringtoLCD(TEXT26,0,1);                        //" SONAR SRF-04 ERROR "[/color]
    //status = STOP;
    exit(0);   
}


Заливаю и все работает! Таймер уходит в прерывание, загорается светодиод, ЖКИ очищается и выводится надпись
" SONAR SRF-04 ERROR "

Теперь, я проверку закомментирую в main и переношу ее в вызываемую функцию void WaterDistans(void).
Отпишусь

Здесь стало интересней... В начале void WaterDistans(void) был вызов функции измерения температуры и в таком варианте прерывания НЕ БЫЛО! Когда перенес ее НИЖЕ проверки переполнения, то таймер стал уходить в прерывание! Что это? переполнение стека по переходам? Насколько я помню их 16?

Код:
//Измерение растояния до уровня воды
void WaterDistans(void)
{
   
   
   float D = 0;
   float S = 0;
/*
   temperature = Air_Temperature();
   D = (temperature * 0.58) + 331.5;                        //расчет растояния в зависимости от температуры воздуха
   D = D / 10000;
   S = (1 / D) * 2;
*/
    uint16_t summ = 0;
    uint8_t n;

//Проверка ухода в прерывание по переполнению TMR1
TIMSK = (1 << TOIE1);                                 //разрешение прерывания по переполнению TMR1
TCCR1B = (1 << CS11);                                 //TMR1 включен, делитель на 8
asm volatile("sei" : :);
_delay_ms(75);
asm volatile("cli" : :);

    for ( n = 1; n < 7; n++) {
      status = START;
   
     Eho_PORT |= (1<<TRIG);                           //запускаем триггер сонара.
     _delay_us(15);
     Eho_PORT &= ~(1 << TRIG);
    
       while (status == START)                           //ожидание окончания измерения
       {asm volatile("nop" : :);}
       
     data -= 4;                                    //коррекция измерений
    
        temperature = Air_Temperature();
        D = (temperature * 0.58) + 331.5;                  //расчет растояния в зависимости от температуры воздуха
        D = D / 10000;
        S = (1 / D) * 2;                                  
     distance = ((data * 1.085)/S) * 5.0;                  //растояние (мм).
     summ += distance;

     _delay_ms(40);
        //TCNT1 = 0x00;
       
    }//for

    distance = summ / 6;                              //среднеарифметическое растояние до уровня воды   
}


Последний раз редактировалось Croco 08 май 2020, 13:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 13:15 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Croco писал(а):
Нет, я здесь ничего не забыл - хочу тупо заставить таймер уходить в прерывание запретив все кроме работы таймера. Нет прерывания..

Еще раз - у вас в вашем коде, что был приведен тут: viewtopic.php?p=636278#p636278
Сначала идет:
//status = START;
А потом:
while (status == START)
Что сразу не будет выполняться, потому что по-умолчанию у вас в status записан 0, а это #define STOP(uint8_t)0x00
И после уже отключение таймера сразу идет. Т.е. вы буквально на чуть-чуть таймер включали, он не успевал дойти до переполнения конечно же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 13:35 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
NStorm писал(а):
Croco писал(а):
Нет, я здесь ничего не забыл - хочу тупо заставить таймер уходить в прерывание запретив все кроме работы таймера. Нет прерывания..

Еще раз - у вас в вашем коде, что был приведен тут: viewtopic.php?p=636278#p636278
Сначала идет:
//status = START;
А потом:
while (status == START)
Что сразу не будет выполняться, потому что по-умолчанию у вас в status записан 0, а это #define STOP(uint8_t)0x00
И после уже отключение таймера сразу идет. Т.е. вы буквально на чуть-чуть таймер включали, он не успевал дойти до переполнения конечно же.


Посмотрите пожалуйста мое верхнее сообщение, когда я заставил таки принудительно уйти в прерывание, но только после того как перенес вызов функции температуры ниже проверки на прерывание. Буду очень признателен за комментарии к данной ситуации
Восстанавлю рабочий код и отпишусь.
В хедере так:
//управлениe таймером
#define START 1
#define STOP 0

status = START; нужно для повторного измерения, когда стало status = STOP;

P.S. Насчет status = START; Вы правы - я уже туплю :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 14:47 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Croco

Время исполнения программы измерения температуры , во много раз больше времени переполнения таймера.
Компилятор посчитал не нужным инструкцию включения таймера.

Я же написал вам выше, убрать медленные функции из цикла семплирования данных. (где-то явно, где-то не явно)
Всю математику ( с floаt) "за борт"
Копите данные в буфере затем обсчитывайте. Хотите суммированием. Более точные значения получаются по среднегеометрическому исчеслению.

Температура очень инертный параметр и опрашивать его при каждом семплировании глупо.
data-=4 при CS=8 вам даст огромную погрешность, с которой вы будете бороться.

Для проверки работы, можете отключать и включать оптимизацию компиляции.
Как-то так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 15:55 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Цитата:
P.S. Насчет status = START; Вы правы - я уже туплю :)

Увидели, что вы закомментировали это и START там никогда не будет? )

CReW, вы очень много не по делу тут пишете. И откровенную глупость, вроде
Цитата:
Компилятор посчитал не нужным инструкцию включения таймера.

Хватит уже, остановитесь. "Инструкция по включению таймера" - обращение к регистру. Они все volatile и компилятор никогда не "считает их ненужными". Тем более комилятор вообще никак не может знать сколько там времени занимает "программа измерения температуры" или "переполнение таймера". Это не задача компилятора. Не надо такой ерунды писать.


Последний раз редактировалось NStorm 08 май 2020, 16:58, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 16:23 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
NStorm
Я вам не дите малое, и не претендую на Ваш "велосипед".

С компилятором перемудрил конечно, можно было поправить.Но Ваша гордость и медали помешали наверно, трудная ноша.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 16:59 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Да вы уже наговорили тут достаточно чуши:
Цитата:
Это ваш SFIOR там воду мутит :)
Мне не нравится status ==START status ==STOP
Их следовало бы привести, если они не enum


Цитата:
Таймер включается прескаллером, а SFIOR отключает работу таймера.

Может не стоит говорить о чем не знаешь? Ну перепроверяйте хоть сведения, прежде чем за истину их выдавать на публике.
А так какие-то велосипеды, медали... Эх, весна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 17:26 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Хотите чтобы я объяснился?

С таким "скользкими типами" не объясняюсь.
Вы слишком много себе позволяете.
Склочник...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 17:49 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Мне не надо объяснять ничего в данном случае, вы же не мне тут вредные советы раздаете. Я уже объяснил почему вы написали именно чушь. С каких пор назвать чушью чушь стало слишком много? Любому, знакомому с архитектурой AVR на нормальном уровне, будет очивидно, что про "выкидывание компилятором инструкций по включению таймера" может сказать только тот, кто не понимает о чем говорит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 20:52 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Давайте я Вас помирю! :) Заработало! Но если все думают, что я что то понял, то все ошибаются - ни черта не понял!!! И это для меня плохо, так как могу еще раз наступить на грабли. Сейчас без датчика с джампером на INT1 (0) и без него (1) железо уходит в прерывание. Поставлю разъемы на датчик, подключу его и отпишусь. Естественно вообще убрал измерение температуры в этой функции - изначально так и было - при входе в функцию шел код (не вызов функции) измерения температуры, а потом цикл FOR.

Код:
// Обработчик прерывания по любому изменению на INT1
ISR(INT1_vect)
{
    if(Eho_PIN & (1 << EHO)) {                           //пришла единица, сбрасывам таймер
                                                   //и ставим состояние старта преобразования
      Reg = SREG;                  
      TCNT1 = 0x00;
      EICRA &= ~(1 << ISC10);                           //прерывание INT1 по низпадающему фронту
      SREG = Reg;
    }
    else
   {                                             //пришел ноль, значит звук вернулся.
      Reg = SREG;
       data = TCNT1;
       status = STOP;
      EICRA |= (1 << ISC10);                           //прерывание INT1 по нарастающему фронту
      SREG = Reg;
    }
}

//Обработчик прерывания по переполнению TMR1
ISR (TIMER1_OVF_vect)                                 
{                                                
    PORT_I_O &= ~(1 << CH1);                           //выключаем VALVE               
    PORT_I_O &= ~(1 << CH2);                           //выключаем PUMP0
    PORT_I_O &= ~(1 << CH3);                           //выключаем PUMP1

    LCDclr();
    CopyStringtoLCD(TEXT26,0,1);                        //" SONAR SRF-04 ERROR "
    exit(0);   
}


Сама проблема, из за которой постарел и поседел - немного :) Вернее сейчас так:

Код:
//Измерение растояния до уровня воды
void WaterDistans(void)
{
   float D = 0;
   float S = 0;

    uint16_t summ = 0;
    uint8_t n;

   SFIOR = (1 << PSR321);                                 //сброс прескалера
   EICRA = (1<<ISC11)|(1<<ISC10);                           //Прерывание по нарастающему фронту на INT1
   EIMSK |= (1 << INT1);                                 //разрешение прерывания на INT1
   asm volatile("sei" : :);
   
    for ( n = 1; n < 7; n++) {
      TCCR1B = (1 << CS11);                              //TMR1 включен, делитель на 8
      TIMSK = (1 << TOIE1);                              //разрешение прерывания по переполнению TMR1
      
       status = START;
    
     Eho_PORT |= (1<<TRIG);                              //запускаем триггер сонара.
     _delay_us(15);
     Eho_PORT &= ~(1 << TRIG);
    
       while (status == START)                              //ожидание окончания измерения
       {asm volatile("nop" : :);}
             
      data -= 4;                                       //коррекция измерений

        TIMSK &= ~(1<<TOIE1);                              //запрещение прерывания по переполнению TMR1
        TCCR1B &= ~(1 << CS11);                              //TMR1 остановлен
       
        D = (temperature * 0.58) + 331.5;                     //расчет растояния в зависимости от температуры воздуха
        D = D / 10000;
        S = (1 / D) * 2;
                                          
     distance = ((data * 1.085)/S) * 5.0;                     //растояние (мм).
     summ += distance;

     _delay_ms(40);
     TCNT1 = 0x00;
       
    }//for
   
   EIMSK &= ~(1 << INT1);                                 //запрешение прерывания на INT1
   asm volatile("cli" : :);
   
    distance = summ / 6;                                 //среднеарифметическое растояние до уровня воды   
}


По поводу большой ошибки при коррекции data -= 4;
Я посчитал машинные циклы, пока происходит измерение длительности импульса - насколько я оказался точен, не знаю, но у меня получилось 34 цикла / 8 получаю 4,25. Я понимаю так - пока вся эта бодяга происходила, таймер получил лишнее 4 внутрь. Если я не прав, то поправьте.

P.S. С 64 работаю в первый раз


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 21:20 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Не берите в голову, все это пустое.
В цикле for соберите данные по data
Можно в массив data[]
Код:
uint_8_t data[8];
uint_8_t* ptrdata;
ptrdata=data;


В ISR уберите SREG, при переходе , SREG сохраняется
там же вместо
data=TCNT1;
написать
Код:
*(ptrdata++)=TCNT1;


А уже за пределами for
Найти среднеквадратичное значение data
и найти дистанцию
(для чего-то вы делаете несколько измерений)

Можно еще упростить. если у вас будет 16 значений, вам нужно будет squdata>>4
Функция будет свободна

PS: a/b+c/b+d/b=(a+c+d)/b


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 21:59 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Цитата:
! Что это? переполнение стека по переходам? Насколько я помню их 16?

Это в PICах стек аппаратный, только там обычно 31 уровень. В AVR стек в ОЗУ располагается.

Цитата:
В начале void WaterDistans(void) был вызов функции измерения температуры и в таком варианте прерывания НЕ БЫЛО!

А не было ли случаев у вас в этой функции cli? Ну или прямой записи чего-нибудь в SREG?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 22:04 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Не понял... в цикле FOR я суммирую data 6 раз!!!, а при выходе из FOR делю на 6 и получаю среднеарифметическое distance !!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 22:08 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
NStorm
Это в PICах стек аппаратный, только там обычно 31 уровень. В AVR стек в ОЗУ располагается.

Спасибо, с них я и начинал 10 лет назад. Насчет уровня спорить не буду - не помню, но посмотрю

P/S Я дальше PIC16 не залезал, а кажется в них было ограничение по стеку в 16 переходов... и эти дурацкие переходы по страницам памяти чего стоят... Перешел на AVR и на СИ


Последний раз редактировалось Croco 08 май 2020, 22:23, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 22:15 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Croco писал(а):
Не понял... в цикле FOR я суммирую data 6 раз!!!, а при выходе из FOR делю на 6 и получаю среднеарифметическое distance !!!


Погрешность может быть высокая, а со среднегеометрическим меньше

Вы 6 раз работаете с float в цикле, а можно 1

А также внести коррекцию ошибки типа flоat, и при тестировании изменять точность.

Составляющая/несущая ошибки от TCNT постоянна, ее тоже можно прикрутить к коррекции.

Но это "ваша женщина, вы ее и танцуете"

PS: К чему это я?
Может быть вибрация, волны, тремор конечностей ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 22:27 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Поясните, что такое среднегеометрическое в математике (включая высшею) и измерениях?


Последний раз редактировалось Croco 08 май 2020, 22:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 22:31 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Croco писал(а):
Поясните, что такое среднегеометрическое в математике и измерениях?

Понял, извиняюсь...

Среднеквадратичное значение

в вашем случае сумма квадратов data деленное на количество data

В математике - это центр тяжести


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 22:45 
Старожил
Аватара пользователя

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Croco писал(а):
Поясните, что такое среднегеометрическое в математике (включая высшею) и измерениях?

это уже стёб:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: В ATmega64A не могу заставить TMR1 уйти в прерывание.
СообщениеДобавлено: 08 май 2020, 22:46 
Заглядывает иногда

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
В математике - среднеарифметическое, что я и делаю.
Я имею высшее образование с чисто механическим уклоном - сопромат был как родной, но не помню такого термина там (1983 год окончания). Центр тяжести - да! Может сейчас по другому стали преподавать... А может уже просто не помню...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 63 ]  На страницу Пред.  1, 2, 3  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB