Ви не увійшли.
Нет она даст Вам возможность определить прошел ли интервал val после последнего true. И если Вы где то в коде напишите:
if interval(val){
"трали вали"
;
}
То это "трали вали" будет выполнятся только через val миллисекунд и не чаще, без остановки выполнения остального кода.
goodspeedmen, опять слово пауза...Какая же это пауза если программа выполняется? Я так понял Вам нужны интервалы. Вот и напишите функцию интервалов на основе millis(). Это классика жанра, посмотрите пример мигания светодиодом
. Для секундных и более интервалов вполне нормально.
Я бы сделал что то типа:
long oldtime, val; //первая переменная будет хранить предыдущее значение millis она должна быть глобальной
//и обнуляться только вначале кода, вторая переменная будет содержать нужный интервал.
boolean interval(val) {
long vartime = millis();
if ( val <= vartime-oldtime ) {
oldtime = vartime;
return true;
}
else {
return false;
}
}
Думаю идея понятна. В нужном месте программы делаете проверку прошел данный интервал или нет и выполняете по условию действие. Если нужно несколько разных интервалов надо несколько разных oldtime значений хранить. И несколько усложнить функцию передавая ей два значения нужный oldtime и val.
Честно сказать я не очень хорошо разбираюсь в этих "штуках", так "грызу" потихоньку
На сколько я смог понять эта функция возвращает булево значение true или false переменной interval, и принимает её параметр long val.
Я тут нацарапал так что бы было понятней, в цифрах. Переменная interval она работает как флаг, что функция отработала?
long oldtime (500), val (1000); //первая переменная будет хранить предыдущее значение millis она должна быть глобальной
//и обнуляться только вначале кода, вторая переменная будет содержать нужный интервал.
boolean interval(val)
{
long vartime = millis();
if(val(1000) <= vartime(1000...) - oldtime(500)) //
{
oldtime = vartime;
return true;
}
else
{
return false;
}
} Вячеслав, UART и USART Вами неудачно приведенный пример. Он как раз и демонстрирует то о чем я и говорю. И не удачный он тем что есть два параллельных независимых аппаратных канала Rx Tx со своими Interrupt. Мне уже страшно от этой терминологии а тем более простых вещей завернутых в двести обложек словоблудия ( ничего личного именно к Вам
).
Вячеслав, давайте поезд и перрон оставим. Я понимаю что с аппаратной точки зрения МК система синхронная, тактовый генератор один для всей периферии процессора. А с точки зрения выполнения программы? Ведь мы же говорим о выполнении программы а не аппаратном функционировании системы. Синхронность это одновременность правильно? Вы хотите сказать что в МК одномоментно (одно и то же количество тактов) программно можно записать в два разные порты значение? Или все таки процесс записи будет последовательным сначала один порт потом другой? Так где же синхронность? Что касается мнимости многозадачности и параллельности согласен все зависит от дискретизации. Извините, я не имел ввиду конкретно Вас что это именно Вы сделали подмену понятий
. Мне кажется что какой то "умник" внес термин и поехало, как с направлением эл. тока, чего только не сделаешь удобства ради
.
Вячеслав, я вообще не понимаю какую задачу решает ТС. То что Вы написали в общих чертах я понял. Это то что тут некоторые преподносят как какую то "параллельность", "асинхронность" а бывает и круче называют "многопоточность" у меня вызывает мягко говоря недоумение. Давайте порассуждаем, допустим есть устройство на микроконтроллере задача -поддержка температуры и влажности. Температуру будем контролировать DS18B20 а влажность DHT22, температуру регулируем включением тэна а влажность вентилятором. Логично что эти процессы программно никак не связаны. Есть ньюанс с DS18B20, частый опрос этого датчика приводит к возрастанию погрешности, многие рекомендуют делать опрос не чаще чем через 5с (допустим процесс не очень критичный, не термоядерный синтез
) и такой интервал нас устраивает. В результате нам нужен счетчик интервалов и есть два пути решения, мы можем его поставить в начале функции измерения температуры и она будет выполнятся только когда пройдет 5с, что то аналогичное можно сделать и для функции измерения влажности (если хочется или надо допустим при использовании TFT дисплея). Но можно вынести счетчики отдельно и в зависимости от состояния счетчиков выполнять ту или иную функцию, я бы назвал такой подход созданием "диспетчера задач". В таком случае возникает дополнительный бонус в виде возможности по управлять этим "диспетчером" извне или программно в зависимости от условий то есть получим очень гибкую систему которая в некоторой степени будет "самонастраиваемой". Но называть это какой то "асинхронностью" язык не поворачивается по той простой причине что синхронных процессов в данном мк априори быть не может в нем нет даже банальной DMA. А значит все процедуры могут быть только асинхронными не зависимо с какими интервалами они выполнятся. Приведенную модель правильно было бы назвать асимметричной но никак не асинхронной а тем более лепить ей другие "красивые" названия. Не надо делать подмену понятий.
goodspeedmen, опять слово пауза...Какая же это пауза если программа выполняется? Я так понял Вам нужны интервалы. Вот и напишите функцию интервалов на основе millis(). Это классика жанра, посмотрите пример мигания светодиодом
. Для секундных и более интервалов вполне нормально.
Я бы сделал что то типа:
long oldtime, val; //первая переменная будет хранить предыдущее значение millis она должна быть глобальной
//и обнуляться только вначале кода, вторая переменная будет содержать нужный интервал.
boolean interval(val) {
long vartime = millis();
if ( val <= vartime-oldtime ) {
oldtime = vartime;
return true;
}
else {
return false;
}
}
Думаю идея понятна. В нужном месте программы делаете проверку прошел данный интервал или нет и выполняете по условию действие. Если нужно несколько разных интервалов надо несколько разных oldtime значений хранить. И несколько усложнить функцию передавая ей два значения нужный oldtime и val.
goodspeedmen пише:Генерация пауз возможно путем функции delay (20); (остановка программы, не всегда приемлемо). Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. Кто как решает эту проблему?
goodspeedmen, я например вообще ничего не понял, что Вам нужно, то Вы говорите о паузе ( delay() ) то о счетчике ( millis() ). А в приведенном коде комментарий :
"если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается."
вообще вводит в ступор. Как эти кнопки будут нажаты, одновременно, произвольно или в какой то последовательности и вообще зачем их нажимать и какие такие паузы нужны а если не паузы то что интервалы какие то мерить надо. Как говорят половина ответа это ясно и правильно поставленный вопрос. Должен заметить что в АВР кроме упомянутых таймеров есть другие и если Вы не планируете использовать ШИМ никто Вам не запрещает использовать напрямую (читать и писать) регистры этих таймеров и использовать их прерывание. Возьмите даташит на используемый микроконтроллер и прочтете раздел о таймерах.
Но что то мне подсказывает что Ваша задача (а не поставленный мне например не понятный вопрос) решается банально той же millis() и переменной в которую после подсчета записываем значение millis при последующем считывании сравниваем текущее значение с переменной (таким образом получаем интервал) и опять записываем в переменную текущее значение и т.д.
Вероятно я не правильно объясняю. Мне нужны паузы в 1 или больше секунд без остановки процессора ( delay() ) все "те кнопки" должны продолжат сканироваться, был применен программный "счетчик - таймер" но во время этой "паузы" (счета счетчика) "нагрузка" на процессор изменяется и "пауза" получается разная в зависимости от нагрузки на процессор. Первый таймер занят, нулевой и второй таймер 328 меги 8 битные на максимальном предделителе они могут генерировать прерывание примерно в 16 миллисекунд, что конечно мало для моей цели. Это к тому о чем я писал выше о использование таймера с внешним генератором.
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. Это "си" с условной компиляцией в которой я не очень разбираюсь. ![]()
Генерация пауз возможно путем функции delay (20); (остановка программы, не всегда приемлемо). Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. Кто как решает эту проблему?
goodspeedmen, я например вообще ничего не понял, что Вам нужно, то Вы говорите о паузе ( delay() ) то о счетчике ( millis() ). А в приведенном коде комментарий :
"если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается."
вообще вводит в ступор
. Как эти кнопки будут нажаты, одновременно, произвольно или в какой то последовательности и вообще зачем их нажимать и какие такие паузы нужны а если не паузы то что интервалы какие то мерить надо. Как говорят половина ответа это ясно и правильно поставленный вопрос. Должен заметить что в АВР кроме упомянутых таймеров есть другие и если Вы не планируете использовать ШИМ никто Вам не запрещает использовать напрямую (читать и писать) регистры этих таймеров и использовать их прерывание. Возьмите даташит на используемый микроконтроллер и прочтете раздел о таймерах.
Но что то мне подсказывает что Ваша задача (а не поставленный мне например не понятный вопрос) решается банально той же millis() и переменной в которую после подсчета записываем значение millis при последующем считывании сравниваем текущее значение с переменной (таким образом получаем интервал) и опять записываем в переменную текущее значение и т.д.
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
}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" ?
Это и есть программный счётчик
разве нет?
Если использовать тактирование 0 таймера с захватом по высокому уровню, к примеру частотой в 10 герц, то можно записывать в регистр сравнения число сколько нужно отсчитать по 0.1 секунде. но если нужно несколько пауз с разной продолжительностью
Можно попробовать написать программу так, что если используется пауза высчитывается её продолжительность и если она больше действующей то в прерывании сбрасывается флаг первой паузы по ссылке в регистр сравнения дописывается время второй паузы... ![]()
Админы почистите тему, ребята если не знаете или не хотите отвечать то лучше не пишите, спасибо. ![]()
Тема нормальная. Вот только по меркам некоторых народ здесь собрался "дубоватый" и "идиоты программисты". И нам не "допереть" для чего предназначен сторожевой пес и как сделать в ардуино "асинхронность"
. Просто кто то считает что его макароны лучше чем лапша в вики
.
вот я темку для спора подкинул))))
![]()