Easyelectronics.ru

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

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



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

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

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Согласен со стебом, поставлю датчик сонара и отпишусь.
Спасибо всем отозвавшимся на мою проблему и просто прочитавшим ее!
С ДНЕМ ПОБЕДЫ ВСЕХ ФУРМОВЧАН И ИХ РОДНЫХ И БЛИЗКИХ!!!


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Цитата:
Спасибо, с них я и начинал 10 лет назад. Насчет уровня спорить не буду - не помню, но посмотрю

Ну я сам зуб не дам, точно не помню, с пиками мало дел имею. Но погуглил сам, пишут 31 либо вообще всего 2 уровня на совсем младших моделях. Про 16 не пишут. Хотя к теме это отношения не имеет. )
В AVR стек бесконечный по вложенности. Тут есть регистр SP - stack pointer. Он обычно начинается с RAMEND и растет вверх при PUSH, назад вниз при POP. Т.е. пока есть ОЗУ незанятая кучей и переменными, то всё ок:
Изображение

Код:
asm volatile("sei" : :);
_delay_ms(75);
asm volatile("cli" : :);

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


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

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Я не профи, а любитель электроники с 14 лет, а 28 мая будет 60... Вы правы, дело в том, что я не понял проблемы, но у меня в софте всего одно место, где я включаю прерывание - измерение до уровня воды. Проект настолько медленный, что отказался делать прерывание по нажатию 4-х кнопок - ну потерплю я держа ее 0.4 секунды и это в ручном управлении, а в режиме "автомат" доступна всего одна кнопка - подсветка ЖКИ.
Сейчас в железе работает как хотел, всю инфу потерял, только осталось, что в моей ветке. Буду по ней анализировать

PS ЛЮДИ!!! вы читаете, что я пишу, или только смотрите на код, но уже старый?


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

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Croco писал(а):
PS ЛЮДИ!!! вы читаете, что я пишу, или только смотрите на код, но уже старый?

Чувствуется молодость!!!
Здоровья Вам!


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

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Искренне спасибо, мне бы сейчас его прибавить, но оно только теряется.
С НАСТУПАЮЩИМ!!! КРЫМ НАШ!!! У МЕНЯ ТАМ ДВА ДЕДА ПОЛЕГЛИ - ОДИН В СЕВАСТОПОЛЕ, А ВТОРОЙ В КЕРЧИ. Я ИХ НИКОГДА НЕ ВИДЕЛ ЖИВЫМИ, РОДИЛСЯ ТО 60-м
ОБА С КУБАНИ


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

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

//Обработчик прерывания по переполнению 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);
      TCCR1B = (1 << CS11);                              //TMR1 включен, делитель на 8
      TIMSK = (1 << TOIE1);                              //разрешение прерывания по переполнению TMR1   
       status = START;                              //разрешение прерывания на INT1
   asm volatile("sei" : :);
   
    for ( n = 1; n < 7; n++) { 
     Eho_PORT |= (1<<TRIG);                              //запускаем триггер сонара.
     _delay_us(15);
     Eho_PORT &= ~(1 << TRIG);
    
       while (status == START)                              //ожидание окончания измерения
    {asm volatile("nop" : :);}
             
      

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

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


Последний раз редактировалось ILYAUL 09 май 2020, 00:23, всего редактировалось 2 раз(а).

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

Зарегистрирован: 24 апр 2014, 04:58
Сообщения: 297
Croco писал(а):
Код:
   *************          
     distance = ((data * 1.085)/S) * 5.0;    //float
     [striked]summ += distance;[/striked]                                //int
          //лучше так уж
          summ += trunc(distance);
       
    }//for
   
   EIMSK &= ~(1 << INT1);                                 //запрешение прерывания на INT1
   asm volatile("cli" : :);
   
    distance =((float) summ )/ 6;                                 //среднеарифметическое растояние до уровня воды   
}



summ += trunc(distance);
distance =((float) summ )/ 6;


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Croco писал(а):
PS ЛЮДИ!!! вы читаете, что я пишу, или только смотрите на код, но уже старый?

У вас же новый работает. Но причину как я понял вы толком не узнали. Поэтому смотрю что в старом не так было , который не работал.


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

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Искреннее СПАСИБО!!!


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

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
CReW писал(а):
Croco писал(а):
Код:
   *************          
     distance = ((data * 1.085)/S) * 5.0;    //float
     [striked]summ += distance;[/striked]                                //int
          //лучше так уж
          summ += trunc(distance);
       
    }//for
   
   EIMSK &= ~(1 << INT1);                                 //запрешение прерывания на INT1
   asm volatile("cli" : :);
   
    distance =((float) summ )/ 6;                                 //среднеарифметическое растояние до уровня воды   
}



summ += trunc(distance);
distance =((float) summ )/ 6;


CReW, поверьте на слово, я Вам очень благодарен, но пожалуйста, прокомментируйте, чем Ваш код отличается от моего? И чем он может повлиять на мою проблему? А вернее мог повлиять ? Я согласен - у меня "быдло" код, я пишу только для себя и от случая к случаю. Но просмотрев Ваши рекомендации, отличия не вижу. Мне кажется, что сделав все по Вашему, после компиляции и получения ЕХЕ, я не увижу разницы.
Или в СИ есть разница когда объявлять размерность переменной? В начале или при использовании?


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

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

Есть разница, поэтому необходимо приводить к размерности.
trunc обрежет вам все после точки (десятичные)
а в ином случае захватит десятичные и выдаст за целые

ILYAUL указал причину

Признаюсь честно до второго цикла меня не хватило
Много нужно было реформировать


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

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Но summ, это сумма 6-ти целых чисел вытащенных из счетчика, там по определению не может быть числа с точкой. Поэтому мне кажется, что
summ += trunc(distance); лишнее. Попробовал написать так, компилятор проглотил, но в Program Memory сразу прибавилось 210 байт - дороговато удовольствие :). Но все равно, спасибо! Буду иметь ввиду.


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

Зарегистрирован: 14 янв 2015, 19:31
Сообщения: 53
Поставил ультразвуковой датчик - все работает!
С ДНЕМ ПОБЕДЫ!!!


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


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


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

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


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

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

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