Jump to content
Sign in to follow this  
fresh.rus

Мигание Светодиодом Без _Delay_Ms

Recommended Posts

Ковыряю в Proteus свой виртуальный ATtiny2123 в попытках написать мигание светодиодом без delay. Копал в сети информацию на эту тему, но толком ничего не понял, хотя судя по всему это надо иметь дело с прерываниями, если правильно понял. Задача очень простая, мигать диодами не используя _delay_ms().

Перешел на изучение AVR с Arduino, так там считалось такое по таймеру. Функция millis(), которая считала миллисекунды с начала выполнения Arduino, но в AVR ничего готового такого не нашел. Кто может доступно объяснить про эту тему и все что с ней связано?

Заранее благодарен.

Share this post


Link to post
Share on other sites

Если имеется ввиду, что Вам нужно избежать подвешивания основной программы во время "отсчитываний" интервалов между миганиями - то это настройка таймера + обработка прерывания от этого таймера. В датащите обычно это довольно детально описывается.

Share this post


Link to post
Share on other sites

Да, именно, мне совсем не нужно занимать МК одним лишь светодиодом. Завтра буду уже смотреть даташит, а там отпишусь.

Share this post


Link to post
Share on other sites

Высококачественные конденсаторы Panasonic для надежности вашей электроники!

Электролитические алюминиевые конденсаторы Panasonic отличаются повышенной надежностью, длительным сроком службы, низким импедансом и выдерживают большой ток пульсаций, в то время как семейства полимерных конденсаторов Panasonic SP-CAP, POSCAP, OS-CON и HYBRID характеризуют сверхнизкий ESR и увеличенная емкость, работа при высоких напряжениях и в расширенном температурном диапазоне. Приобретая продукцию Panasonic, вы гарантированно получаете самое передовое решение для ваших задач. Для облегчения вашего выбора, мы подготовили подборку полезных материалов.

Читать статьи

Что то я не могу на этот контроллер датащит обнаружить.... странновато.

Share this post


Link to post
Share on other sites
                     

Вебинар "Как создать BLE-устройство на базе новейшего беспроводного микроконтроллера STM32WB55"

27 ноября 2019 года компания КОМПЭЛ приглашает разработчиков, технических руководителей и энтузиастов беспроводной связи на вебинар, посвященный новинке 2019 года – мультипротокольному беспроводному микроконтроллеру STM32WB55, который позволяет создавать устройства на базе стандартов BLE 5.0; BLE Mesh; 802.15.4/ZigBee и Thread. На вебинаре мы покажем, как с помощью привычных инструментов STM32Cube и STM32CubeMX можно создать свое первое, надежно работающее BLE-приложение.

Зарегистрироваться на вебинар

Нет на белом свете такого проца - ATTiny2123 ...

Посмотрите древнейшую либу AVRLIb - http://www.procyonen...ded/avr/avrlib/ Там все задержки на таймерах.

Если не справитесь, набросаю примерчик для ATTiny2313.

Edited by hd44780

Share this post


Link to post
Share on other sites

Быть может Attiny2313 ? Про вопрос можно почитать тут похожая проблема.

Да, верно, в этом многообразии цифр напутал)

По примерам там пробую. Ругается компилятор на эти строки:

TMR1ON=1;	   // Включить TMR1
TMR1IF=0;	   // Сбросить флаг от TMR1
TMR1IE=1;	   // Разрешить прерывания от TMR1
TMR1=-5000;	 // Установить TMR1 на 5000 тактов/
PEIE=1;		 // Разрешаем прерывания от перефирии
GIE=1;		  // и глобально

.

С матюками:

expected '=', ',', ';', 'asm' or '__attribute__' before '_isr'

'TMR1ON' undeclared (first use in this function)

'TMR1IF' undeclared (first use in this function)

'TMR1IE' undeclared (first use in this function)

'TMR1' undeclared (first use in this function)

'PEIE' undeclared (first use in this function)

'GIE' undeclared (first use in this function)

Что значат эти переменные (или что это вообще...) и как их объявить, чтобы не было ошибок?

Share this post


Link to post
Share on other sites
TMR1ON=1;	 // Включить TMR1
TMR1IF=0;	 // Сбросить флаг от TMR1
TMR1IE=1;	 // Разрешить прерывания от TMR1
TMR1=-5000;	 // Установить TMR1 на 5000 тактов/
PEIE=1;		 // Разрешаем прерывания от перефирии
GIE=1;		 // и глобально

.

а ничего ,что это биты регистров ПИКов....

или нет?

Share this post


Link to post
Share on other sites
TMR1ON=1;	 // Включить TMR1
TMR1IF=0;	 // Сбросить флаг от TMR1
TMR1IE=1;	 // Разрешить прерывания от TMR1
TMR1=-5000;	 // Установить TMR1 на 5000 тактов/
PEIE=1;		 // Разрешаем прерывания от перефирии
GIE=1;		 // и глобально

.

а ничего ,что это биты регистров ПИКов....

или нет?

Думаете, мне как новичку в программировании МК это известно? В той статье, не нашел упоминаний о PICе, или не просто не заметил (в этом случае, извиняюсь).

Share this post


Link to post
Share on other sites

Мне бы сами процессы этих таймеров понять и регистры (или как оно называется) для начала...

Edited by fresh.rus

Share this post


Link to post
Share on other sites

Как же вы без даташита собираетесь использовать контроллер? Рекомендую книги Евстифеева, там не только описания контроллеров на русском но и примеры кода.

Share this post


Link to post
Share on other sites

Разобрался немного, мигалку таки сделал без delay, но появился вопрос. А если мне нужно будет для нескольких светодиодов сделать сделать поочередную мигалку ("бегущий огонек"), то мне одного таймера хватит? Через if и bool можно будет организовать все мигания в одном обработчике прерывания?

Share this post


Link to post
Share on other sites

Имею такой код в обработчике прерывания:

ISR( TIMER1_OVF_vect )
{

 TCNT1 = 64670; //выставляем начальное значение TCNT1

 if (led1 = true && !led2 && !led3)
 {
 if( LPORTD & ( 1 << LR1 )) {
   LPORTD &= ~( 1 << LR1 ); //выкл
led1 = false;
led2 = true;
 }
 else {
   LPORTD |= ( 1 << LR1); //вкл
led1 = true;
 }
 }

   if (led2 = true && !led1 && !led3)
 {
 if( LPORTD & ( 1 << LY1 ) ) {
   LPORTD &= ~( 1 << LY1 ); //выкл
led2 = false;
led3 = true;
 }
 else {
   LPORTD |= ( 1 << LY1 ); //вкл
led2 = true;
 }
 }

   if (led3 = true && !led1 && !led2)
 { 
 if( LPORTD & ( 1 << LG1 ) ) {
   LPORTD &= ~( 1 << LG1 ); //выкл
led3 = false;
led1 = true;
 }
 else {
   LPORTD |= ( 1 << LG1 ); //вкл
led3 = true;
 }
 } 
}

Все работает, диоды поочередно переключаются, но когда заканчивает гореть последний (LG1), то до повтора цикла есть промежуток во времени, когда ничего не горит, но после этого все идет заново как надо. Проще говоря, после последнего диода, есть еще ненужная задержка, которую не могу убрать. Как быть?

Share this post


Link to post
Share on other sites

if (led1 = true && !led2 && !led3) может всё же if (led1 == true && !led2 && !led3) или просто if (led1 && !led2 && !led3) ну и так далее..

Share this post


Link to post
Share on other sites

if (led1 = true && !led2 && !led3) может всё же if (led1 == true && !led2 && !led3) или просто if (led1 && !led2 && !led3) ну и так далее..

Не помогло, задержка осталась

Share this post


Link to post
Share on other sites

С этим разобрался через goto. Теперь не могу понять как сделать разные интервалы переключения светодиодов в одном таймере. Насколько я понял нужно изменять TCNT1 в нужном if?

Edited by fresh.rus

Share this post


Link to post
Share on other sites

нужно изменять TCNT1 в нужном if?

или OCR

Edited by TDSS

Share this post


Link to post
Share on other sites

Получилось, спасибо. А вот такой вопрос теперь. У светофора перед включением красного зеленый начинает мигать. Как сделать такое в прерывании в стиле if (осталосьвремени < 100с)? И можно ли в одном таймере?

Share this post


Link to post
Share on other sites

Зачем такой код в прерывании ?

Создайте переменные-счётчики, которые будут "тикать" в прерывании, а в основном цикле этими счётчиками управляйте. Там-же и производите их проверку и управляйте выводами МК.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By katet
      Добрый день. Может быть,кто-нибудь уже сталкивался с таким. 
      Занимаюсь доработкой чужого проекта в среде STM32CubeMX, первый раз работаю с библиотекой HAL.
      В этом проекте осуществлялся прием байт по USART1 из ComMon. Проект был открыт в STM32CubeMX, где мной дополнительно были активированы новые модули - RTC, SD, USART2. Настройки USART1 не менялись. 
      Часы реального времени RTC: питание от батарейки, тактирование – от LSE. 
      При приеме байт по USART1 в новом проекте (активны  USART1, RTC, SD, USART2) было выявлено, что после приема 2 байт по USART1 перестает инкрементироваться значение переменной uwTick, отвечающей за прерывания Systick, в результате чего дальнейшая отладка невозможна. Не удается выяснить, в каком месте и почему перестает увеличиваться значение uwTick. При работе со старым проектом (где активен только USART1) uwTick инкрементируется после приема 2 байт.
      Смены приоритета прерываний не происходит, в  функцию HAL_Delay() отладчик не попадает. При вызове функции HAL_ResumeTick(), возобновляющей прерывания Systick, ничего не меняется, значение uwTick остается неизменным.
      Остановка прерываний была обнаружена при попадании в функцию:
      static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
      {
        /* Wait until flag is set */
        while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) 
        {
          /* Check for the Timeout */
          if(Timeout != HAL_MAX_DELAY)
          {            
            if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
            {
              /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
              CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
              CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
              
              huart->gState  = HAL_UART_STATE_READY;
              huart->RxState = HAL_UART_STATE_READY;
              
              /* Process Unlocked */
              __HAL_UNLOCK(huart);
              
              return HAL_TIMEOUT;
            }
          }
        }
        
        return HAL_OK;
      }
      В новом проекте текущее значение uwTick, возвращаемое функцией HAL_GetTick(), всегда равно значению Tickstart. В старом проекте сначала также, но затем uwTick начинает увеличиваться. Выяснить, в каком именно месте кода значение uwTick должно начать увеличиваться, не удается.
      Может быть, у кого-нибудь есть хоть какие-то идеи, с чем может быть связана остановка увеличения значений uwTick, помогите пожалуйста)
      Распиновка и конфигурация обоих проектов: верхняя часть рисунков - первоначальный, работающий вариант,  нижняя - сбой прерываний Systick.


    • By IgnatiusF
      Не могу настроить таймер 0 на работу, и даже не получается понять в чем проблема. Делаю в Proteus, так как это быстрее и нагляднее.
      Пробовал и просто по переполнению делать прерывание (WGM[1..0]  00) и по совпадению (WGM[1..0]  10; OCR0A = 0 - 255), однако прерываний нет. Перед циклом ставлю TCNT0 = 0;
      Тактирование выставляю TCCR0B (CS[2..0] 001, 100, 101).
      Прерывания TIMSK0 (OCIE0A, TOIE0) выставляю, не вызываются. Даже принудительным заносом значения в регистр TIFR0 (OCF0A, TOV0).
      Прерывание пытаюсь выполнить таким образом:
      #include <avr/interrupt.h> volatile unsigned int A = 0; ISR(TIMER0_OVF_vect) { A = 1; } ... while(1) { if (A == 1) PORTB |= (1<<0); } Proteus показывает, что вывод настроен как выход, но всегда 0;
      Конкретный код привести не могу, так как у меня не заработало совсем ничего.
      Внизу я сделал вырезку из даташита на ATMEGA328 по 0 таймеру 8-бит, и занес в один PDF файл.
      ATmega328-106-112.pdf
      Прошу помочь разобраться с таймером и прерываниями для него.
    • By AlexMerser
      Здравствуйте, нужна помощь в написании дипломной работы на тему: "Разработка индикатора непрерывности цепи заземления специальной аппаратуры". А именно: есть готовый код прошивки микроконтроллера Attiny 13 ( без комментариев) и алгоритм его работы(составлял программист, который уволился и в общем-то связь с ним потеряна). Нужно подробно закомментировать каждую строку кода, чтобы было понятно даже новичку в программировании. Файлы программы и алгоритма прикрепляю. Если возьметесь, пишите на почту filatov.alex1996@mail.ru . О цене и сроках готовности договоримся.
      инцзкод.docx
      Алгоритм работы программы ИЗАП.docx
    • By shuks
      Добрый день!
      От товарища поступила просьба собрать на ардуино (либо изготовить плату на avr) детектор короткого замыкания.
      Есть у него на производстве ряд БП 12в 2квт и десяток потребителей на каждом, таких блоков порядка сотни, и поступила "хотелка" навесить на каждый БП ардуину (питание будет отдельное независимое) которая будет посылать по wifi уведомление когда будет возникать КЗ в блоке/потребителе (важна возможность определения именно КЗ).
      Опыта нет, первое что пришло в голову это:
      1) мониторить потерю напряжения 12в на БП (при КЗ блок уходит в защиту)
      2) при потере напряжения 12в подавать напряжение 3.3в от питания МК с управлением через ключ от ножки МК на "+" питания БП и переход на пп.3
      3) ноль от БП подключить к АЦП МК и замерять: если 0в то все норм и КЗ нет (поломка блока без КЗ либо отключение от сети 220в), если на АЦП будет 3.3в то имеем КЗ и отправляем уведомление.
      Т.к. опыта схемотехники почти нет, прошу помощи по схеме в даже в мелочах
       
    • By Ilgam Talipov
      Задача: Написать скетч управления 9 светодиодами аналог WS2812 (из библиотек FastLed и NeoPixel рулятся ). Режим работы - стробы, длительность вспышки 0.1 - 0,2 сек, после того как каждый светодиод моргнул 1 раз, цикл повторяется, длительность цикла 4,5 сек (время примерное, точность не важна). Помочь настроить Arduino IDE для прошивки тинек. Если у вас железа нет, не проблема - мы можем тестить ваш код на нашем железе.
      Стоимость 5 000 руб
      мой скайп ilgamt
      почта talipov@me.com
      Спасибо
×
×
  • Create New...