Ви не увійшли.
Нет она даст Вам возможность определить прошел ли интервал 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 секунде. но если нужно несколько пауз с разной продолжительностью Можно попробовать написать программу так, что если используется пауза высчитывается её продолжительность и если она больше действующей то в прерывании сбрасывается флаг первой паузы по ссылке в регистр сравнения дописывается время второй паузы...
Админы почистите тему, ребята если не знаете или не хотите отвечать то лучше не пишите, спасибо.
Тема нормальная. Вот только по меркам некоторых народ здесь собрался "дубоватый" и "идиоты программисты". И нам не "допереть" для чего предназначен сторожевой пес и как сделать в ардуино "асинхронность" . Просто кто то считает что его макароны лучше чем лапша в вики .
вот я темку для спора подкинул))))