#1 2017-07-24 18:29:39

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Генерация пауз.

Генерация пауз возможно путем функции delay (20); (остановка программы, не всегда приемлемо). Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. Кто как решает эту проблему?

Неактивний

#2 2017-07-24 18:42:39

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Генерация пауз.

попробуйте ватчдог

Неактивний

#3 2017-07-24 18:47:17

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

vvr пише:

попробуйте ватчдог

На сколько я помню и понимаю это совсем не для этого, хоть это и  8 битный таймер.

Остання редакція goodspeedmen (2017-07-24 18:47:41)

Неактивний

#4 2017-07-24 21:39:27

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Генерация пауз.

Похоже тема напомнила мне это место.
А ты что больше всего любишь делать?
— Это всё я тоже люблю,— сказал Кристофер Робин,— но что больше всего я люблю делать — это...
— Ну, ну?
— Ничего.
— А как ты это делаешь? — спросил Пух после очень продолжительного размышления.
— Ну, вот, спросят, например, тебя, как раз когда ты собираешься это делать: “Что ты собираешься делать, Кристофер Робин?”, а ты говоришь: “Да ничего”, а потом идёшь и делаешь.
— А, понятно! — сказал Пух.

Неактивний

#5 2017-07-24 21:50:26

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

qwone пише:

Похоже тема напомнила мне это место.
А ты что больше всего любишь делать?
— Это всё я тоже люблю,— сказал Кристофер Робин,— но что больше всего я люблю делать — это...
— Ну, ну?
— Ничего.
— А как ты это делаешь? — спросил Пух после очень продолжительного размышления.
— Ну, вот, спросят, например, тебя, как раз когда ты собираешься это делать: “Что ты собираешься делать, Кристофер Робин?”, а ты говоришь: “Да ничего”, а потом идёшь и делаешь.
— А, понятно! — сказал Пух.

К чему это всё? Таймер wochdog, его назначение это сбросить микроконтроллер если он вдруг зашёл в бесконечный цикл. Когда происходит прерывание по переполнению этого таймера в векторе прерывания указан адрес reset микроконтроллера. Как его можно использовать в том о чём я писал? sad

Неактивний

#6 2017-07-24 22:29:06

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Генерация пауз.

goodspeedmen пише:

К чему это всё? Таймер wochdog, его назначение это сбросить микроконтроллер если он вдруг зашёл в бесконечный цикл. Когда происходит прерывание по переполнению этого таймера в векторе прерывания указан адрес reset микроконтроллера. Как его можно использовать в том о чём я писал? sad

Вообще не для этого. https://geektimes.ru/post/255800/

Неактивний

#7 2017-07-25 13:33:26

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Генерация пауз.

goodspeedmen пише:

....... Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. .......

приведите пример !!!

Неактивний

#8 2017-07-26 13:20:20

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

qwone пише:
goodspeedmen пише:

К чему это всё? Таймер wochdog, его назначение это сбросить микроконтроллер если он вдруг зашёл в бесконечный цикл. Когда происходит прерывание по переполнению этого таймера в векторе прерывания указан адрес reset микроконтроллера. Как его можно использовать в том о чём я писал? sad

Вообще не для этого. https://geektimes.ru/post/255800/

Вы даёте ссылку на статью в которой пишется именно о том что я писал. Вы простите хорошо себя чувствуете?  neutral

Неактивний

#9 2017-07-26 13:31:19

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }

........................

если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается.

if (time == 0x4000)
  { 
   какой то код
    time = 0;
  }
time++;

Неактивний

#10 2017-07-26 14:06:51

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Генерация пауз.

goodspeedmen пише:

Вы даёте ссылку на статью в которой пишется именно о том что я писал. Вы простите хорошо себя чувствуете?  neutral

watchdog вообще-то служит для экономии электроэнергии. Когда чипу нужно опростить датчик , отправить посылку и "лечь в сон". Но если у идиотов программеров система постоянно виснет, то watchdog это уже последнее средство сохранить работу этого горе-программиста. Тем более в Ардуне нет много места в памяти, что блукать сильно.

Неактивний

#11 2017-07-26 15:53:57

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Генерация пауз.

goodspeedmen пише:
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }

........................

если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается.

if (time == 0x4000)
  { 
   какой то код
    time = 0;
  }
time++;

what is "time" ?

Неактивний

#12 2017-07-26 22:10:12

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Генерация пауз.

Вячеслав Азаров пише:

И что https://ru.wikipedia.org/wiki/%D0%95%D0%B2%D1%80%D0%BE%D0%BC%D0%B0%D0%B9%D0%B4%D0%B0%D0%BD
После этого я должен скакать как сумашедший. Сколько не говори сахар, во рту слаще не станет. Даже если про это в Вики раструбят.
  Если вам на уши вешают лапшу, значит это кому-то выгодно. Но ум желательно в голове иметь, а не вики без головы лезть.

Остання редакція qwone (2017-07-26 22:11:05)

Неактивний

#13 2017-07-27 00:04:24

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Генерация пауз.

qwone, якого хрена пишете всякую чушь  про сторожевую собаку
держите себя в руках.

я  например, практически не пользуюсь wd.
если система слетела,  то наверняка сдохла и тактовая для собаки
но внешний супервизор с собакой не помешают - факт )

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

Неактивний

#14 2017-07-27 08:06:32

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Генерация пауз.

вот я темку для спора подкинул))))

Неактивний

#15 2017-07-27 09:11:16

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Генерация пауз.

vvr пише:

вот я темку для спора подкинул))))

big_smile

Неактивний

#16 2017-07-27 10:17:14

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Генерация пауз.

Тема нормальная. Вот только по меркам некоторых народ здесь собрался "дубоватый" и "идиоты программисты". И нам не "допереть" для чего предназначен сторожевой пес и как сделать в ардуино "асинхронность" lol . Просто кто то считает что его макароны лучше чем лапша в вики  lol .

Остання редакція Nefreemen (2017-07-27 10:22:13)

Неактивний

#17 2017-07-27 10:44:26

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

Админы почистите тему, ребята если не знаете или не хотите отвечать то лучше не пишите, спасибо. yikes

Неактивний

#18 2017-07-27 10:57:30

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

Если использовать тактирование  0 таймера с захватом  по высокому уровню, к примеру частотой в 10 герц, то можно записывать в регистр сравнения число сколько нужно отсчитать по 0.1 секунде. но если нужно несколько пауз с разной продолжительностью  sad  Можно попробовать написать программу так, что если используется пауза высчитывается её продолжительность и если она больше действующей то в прерывании сбрасывается флаг первой паузы по ссылке в регистр сравнения дописывается время второй паузы...  hmm

Неактивний

#19 2017-07-27 10:59:49

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

renoshnik пише:
goodspeedmen пише:
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }
if(если нажата кнопка)
 { какой то код выполняется
  analogRead(Ax); и тд и тп
 }

........................

если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается.

if (time == 0x4000)
  { 
   какой то код
    time = 0;
  }
time++;

what is "time" ?

Это и есть программный счётчик  neutral  разве нет?

Неактивний

#20 2017-07-27 13:01:40

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Генерация пауз.

goodspeedmen  текст толковый. но код - такое впечатление что другой  человек  делал. а вы его скопировали для красоты ) ну или издеваетесь )


goodspeedmen   если код  ниже читаете нормально.
возмите другой контроллер, не arduino. Вам просто не хватает понимания некоторых процессов.

/* --COPYRIGHT--,BSD_EX
 * Copyright (c) 2012, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *******************************************************************************
 * 
 *                       MSP430 CODE EXAMPLE DISCLAIMER
 *
 * MSP430 code examples are self-contained low-level programs that typically
 * demonstrate a single peripheral function or device feature in a highly
 * concise manner. For this the code may rely on the device's power-on default
 * register values and settings such as the clock configuration and care must
 * be taken when combining code from several examples to avoid potential side
 * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
 * for an API functional library-approach to peripheral configuration.
 *
 * --/COPYRIGHT--*/
//******************************************************************************
//  MSP-FET430P140 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK
//
//  Description: Toggle P1.0 using software and TA_0 ISR. Toggles every
//  50000 SMCLK cycles. SMCLK provides clock source for TACLK.
//  During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to
//  CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and
//  used only during TA_ISR.
//  ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz
//
//           MSP430F149
//         ---------------
//     /|\|            XIN|-
//      | |               |
//      --|RST        XOUT|-
//        |               |
//        |           P1.0|-->LED
//
//  M. Buccini
//  Texas Instruments Inc.
//  Feb 2005
//  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
//******************************************************************************

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 50000;
  TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)
#else
#error Compiler not supported!
#endif
{
  P1OUT ^= 0x01;                            // Toggle P1.0
  CCR0 += 50000;                            // Add Offset to CCR0
}

Неактивний

#21 2017-07-27 13:31:55

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Генерация пауз.

goodspeedmen пише:

Генерация пауз возможно путем функции delay (20); (остановка программы, не всегда приемлемо). Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. Кто как решает эту проблему?

goodspeedmen, я например вообще ничего не понял, что Вам нужно, то Вы говорите о паузе ( delay() ) то о счетчике ( millis() ). А в приведенном коде комментарий :
"если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается."
вообще вводит в ступор roll. Как эти кнопки будут нажаты, одновременно, произвольно или в какой то последовательности и вообще зачем их нажимать и какие такие паузы нужны а если не паузы то что интервалы какие то мерить надо. Как говорят половина ответа это ясно и правильно поставленный вопрос. Должен заметить что в АВР кроме упомянутых таймеров есть другие и если Вы не планируете использовать ШИМ никто Вам не запрещает использовать напрямую (читать и писать)  регистры этих таймеров и использовать их прерывание. Возьмите даташит на используемый микроконтроллер и прочтете раздел о таймерах.
Но что то мне подсказывает что Ваша задача (а не поставленный мне например не понятный вопрос) решается банально той же millis() и  переменной в которую после подсчета записываем  значение millis при последующем считывании сравниваем текущее значение с переменной (таким образом получаем интервал) и опять записываем в переменную текущее значение и т.д.

Неактивний

#22 2017-07-27 15:53:00

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

NoName пише:

goodspeedmen  текст толковый. но код - такое впечатление что другой  человек  делал. а вы его скопировали для красоты ) ну или издеваетесь )


goodspeedmen   если код  ниже читаете нормально.
возмите другой контроллер, не arduino. Вам просто не хватает понимания некоторых процессов.

/* --COPYRIGHT--,BSD_EX
 * Copyright (c) 2012, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *******************************************************************************
 * 
 *                       MSP430 CODE EXAMPLE DISCLAIMER
 *
 * MSP430 code examples are self-contained low-level programs that typically
 * demonstrate a single peripheral function or device feature in a highly
 * concise manner. For this the code may rely on the device's power-on default
 * register values and settings such as the clock configuration and care must
 * be taken when combining code from several examples to avoid potential side
 * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
 * for an API functional library-approach to peripheral configuration.
 *
 * --/COPYRIGHT--*/
//******************************************************************************
//  MSP-FET430P140 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK
//
//  Description: Toggle P1.0 using software and TA_0 ISR. Toggles every
//  50000 SMCLK cycles. SMCLK provides clock source for TACLK.
//  During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to
//  CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and
//  used only during TA_ISR.
//  ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz
//
//           MSP430F149
//         ---------------
//     /|\|            XIN|-
//      | |               |
//      --|RST        XOUT|-
//        |               |
//        |           P1.0|-->LED
//
//  M. Buccini
//  Texas Instruments Inc.
//  Feb 2005
//  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
//******************************************************************************

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 50000;
  TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)
#else
#error Compiler not supported!
#endif
{
  P1OUT ^= 0x01;                            // Toggle P1.0
  CCR0 += 50000;                            // Add Offset to CCR0
}

Я так понимаю это код для MSP430F149. Это "си" с условной компиляцией в которой я не очень разбираюсь.  sad

Неактивний

#23 2017-07-27 16:14:14

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Генерация пауз.

Nefreemen пише:
goodspeedmen пише:

Генерация пауз возможно путем функции delay (20); (остановка программы, не всегда приемлемо). Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. Кто как решает эту проблему?

goodspeedmen, я например вообще ничего не понял, что Вам нужно, то Вы говорите о паузе ( delay() ) то о счетчике ( millis() ). А в приведенном коде комментарий :
"если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается."
вообще вводит в ступор roll. Как эти кнопки будут нажаты, одновременно, произвольно или в какой то последовательности и вообще зачем их нажимать и какие такие паузы нужны а если не паузы то что интервалы какие то мерить надо. Как говорят половина ответа это ясно и правильно поставленный вопрос. Должен заметить что в АВР кроме упомянутых таймеров есть другие и если Вы не планируете использовать ШИМ никто Вам не запрещает использовать напрямую (читать и писать)  регистры этих таймеров и использовать их прерывание. Возьмите даташит на используемый микроконтроллер и прочтете раздел о таймерах.
Но что то мне подсказывает что Ваша задача (а не поставленный мне например не понятный вопрос) решается банально той же millis() и  переменной в которую после подсчета записываем  значение millis при последующем считывании сравниваем текущее значение с переменной (таким образом получаем интервал) и опять записываем в переменную текущее значение и т.д.


Вероятно я не правильно объясняю. Мне нужны паузы в 1 или больше секунд без остановки процессора ( delay() ) все "те кнопки" должны продолжат сканироваться, был применен программный "счетчик - таймер" но во время этой "паузы" (счета счетчика) "нагрузка" на процессор изменяется и "пауза" получается разная в зависимости от нагрузки на процессор. Первый таймер занят, нулевой и второй таймер 328 меги 8 битные на максимальном предделителе они могут генерировать прерывание примерно в 16 миллисекунд, что конечно мало для моей цели. Это к тому о чем я писал выше о использование таймера с внешним генератором.

Неактивний

#24 2017-07-27 17:17:55

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Генерация пауз.

goodspeedmen, опять слово пауза...Какая же это пауза если  программа выполняется? Я так понял Вам нужны интервалы. Вот и напишите функцию интервалов на основе millis(). Это классика жанра, посмотрите пример мигания светодиодом smile . Для секундных и более интервалов вполне нормально.

Я бы сделал что то типа:

long oldtime, val; //первая переменная будет хранить предыдущее значение millis она должна быть глобальной
                          //и обнуляться только вначале кода, вторая переменная будет содержать нужный интервал.
                       
boolean interval(val) {
    long vartime = millis();
    if ( val <= vartime-oldtime ) {
       oldtime = vartime;
       return true;
       }
    else {
      return false;
      }

Думаю идея понятна. В нужном месте программы делаете проверку прошел данный интервал или нет и выполняете по условию действие. Если нужно несколько разных интервалов надо несколько разных oldtime значений хранить. И несколько усложнить функцию передавая ей два значения нужный oldtime и val.

Неактивний

#25 2017-07-27 22:53:03

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Генерация пауз.

Вячеслав, я вообще не понимаю какую задачу решает ТС. То что Вы написали в общих чертах я понял. Это то что тут некоторые преподносят как какую то "параллельность", "асинхронность" а бывает и круче называют "многопоточность" у меня вызывает мягко говоря недоумение. Давайте порассуждаем, допустим есть устройство на микроконтроллере задача -поддержка температуры и влажности. Температуру будем контролировать DS18B20 а влажность DHT22, температуру регулируем включением тэна а влажность вентилятором. Логично что эти процессы программно никак не связаны. Есть ньюанс  с DS18B20, частый опрос этого датчика приводит к возрастанию погрешности, многие рекомендуют делать опрос не чаще чем через 5с (допустим процесс не очень критичный, не термоядерный синтез smile ) и такой интервал нас устраивает. В результате нам нужен счетчик интервалов и есть два пути решения, мы можем его поставить в начале функции измерения температуры и она будет выполнятся только когда пройдет 5с, что то аналогичное можно сделать и для функции измерения влажности (если хочется или надо допустим при использовании TFT дисплея). Но можно вынести счетчики отдельно и в зависимости от состояния счетчиков выполнять ту или иную функцию, я бы назвал такой подход созданием "диспетчера задач". В таком случае возникает дополнительный бонус в виде возможности по управлять этим "диспетчером" извне или программно в зависимости от условий то есть получим очень гибкую систему которая в некоторой степени будет "самонастраиваемой".  Но называть это какой то "асинхронностью" язык не поворачивается по той простой причине что синхронных процессов в данном мк априори быть не может в нем нет даже банальной DMA. А значит все процедуры могут быть только асинхронными не зависимо с какими интервалами они выполнятся. Приведенную модель правильно было бы назвать асимметричной но никак не асинхронной а тем более лепить ей другие "красивые" названия. Не надо делать подмену понятий.

Остання редакція Nefreemen (2017-07-27 22:58:36)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму