Відповісти

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

Назад

Огляд теми (нові повідомленні вгорі)

Nefreemen
2017-07-30 23:22:14

Нет она даст Вам возможность определить прошел ли интервал val после последнего  true. И если Вы где то в коде напишите:
if interval(val){
"трали вали" smile ;
}
То это "трали вали" будет выполнятся только через val миллисекунд и не чаще, без остановки выполнения остального кода.

goodspeedmen
2017-07-30 12:48:33
Nefreemen пише:

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.

Честно сказать я не очень хорошо разбираюсь в этих "штуках", так "грызу" потихоньку roll
На сколько я смог понять эта функция возвращает булево значение 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;
                          }
                       } 
Nefreemen
2017-07-29 23:35:30

Вячеслав, UART и USART Вами неудачно приведенный пример. Он как раз и демонстрирует то о чем я и говорю. И не удачный он тем что есть два параллельных независимых аппаратных канала Rx Tx со своими Interrupt. Мне уже страшно от этой терминологии а тем более простых вещей завернутых в двести обложек словоблудия ( ничего личного именно к Вам smile ).

Nefreemen
2017-07-28 00:27:08

Вячеслав, давайте поезд и перрон оставим. Я понимаю что с аппаратной точки зрения МК система синхронная, тактовый генератор один для всей периферии процессора. А с точки зрения выполнения программы? Ведь мы же говорим о выполнении программы а не аппаратном функционировании системы. Синхронность это одновременность правильно? Вы хотите сказать что в МК  одномоментно (одно и то же количество тактов) программно можно записать в два разные порты значение? Или все таки процесс записи будет последовательным сначала один порт потом другой? Так где же синхронность? Что касается мнимости многозадачности и параллельности согласен все зависит от дискретизации. Извините, я не имел ввиду конкретно Вас что это именно Вы сделали подмену понятий  smile . Мне кажется что какой то "умник" внес термин и поехало, как с направлением эл. тока, чего только не сделаешь удобства ради  big_smile .

Nefreemen
2017-07-27 22:53:03

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

Nefreemen
2017-07-27 17:17:55

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.

goodspeedmen
2017-07-27 16:14:14
Nefreemen пише:
goodspeedmen пише:

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

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


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

goodspeedmen
2017-07-27 15:53:00
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

Nefreemen
2017-07-27 13:31:55
goodspeedmen пише:

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

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

NoName
2017-07-27 13:01:40

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
2017-07-27 10:59:49
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  разве нет?

goodspeedmen
2017-07-27 10:57:30

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

goodspeedmen
2017-07-27 10:44:26

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

Nefreemen
2017-07-27 10:17:14

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

NoName
2017-07-27 09:11:16
vvr пише:

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

big_smile

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