Ви не увійшли.
Генерация пауз возможно путем функции delay (20); (остановка программы, не всегда приемлемо). Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. Кто как решает эту проблему?
Неактивний
попробуйте ватчдог
На сколько я помню и понимаю это совсем не для этого, хоть это и 8 битный таймер.
Остання редакція goodspeedmen (2017-07-24 18:47:41)
Неактивний
Похоже тема напомнила мне это место.
А ты что больше всего любишь делать?
— Это всё я тоже люблю,— сказал Кристофер Робин,— но что больше всего я люблю делать — это...
— Ну, ну?
— Ничего.
— А как ты это делаешь? — спросил Пух после очень продолжительного размышления.
— Ну, вот, спросят, например, тебя, как раз когда ты собираешься это делать: “Что ты собираешься делать, Кристофер Робин?”, а ты говоришь: “Да ничего”, а потом идёшь и делаешь.
— А, понятно! — сказал Пух.
Неактивний
Похоже тема напомнила мне это место.
А ты что больше всего любишь делать?
— Это всё я тоже люблю,— сказал Кристофер Робин,— но что больше всего я люблю делать — это...
— Ну, ну?
— Ничего.
— А как ты это делаешь? — спросил Пух после очень продолжительного размышления.
— Ну, вот, спросят, например, тебя, как раз когда ты собираешься это делать: “Что ты собираешься делать, Кристофер Робин?”, а ты говоришь: “Да ничего”, а потом идёшь и делаешь.
— А, понятно! — сказал Пух.
К чему это всё? Таймер wochdog, его назначение это сбросить микроконтроллер если он вдруг зашёл в бесконечный цикл. Когда происходит прерывание по переполнению этого таймера в векторе прерывания указан адрес reset микроконтроллера. Как его можно использовать в том о чём я писал?
Неактивний
К чему это всё? Таймер wochdog, его назначение это сбросить микроконтроллер если он вдруг зашёл в бесконечный цикл. Когда происходит прерывание по переполнению этого таймера в векторе прерывания указан адрес reset микроконтроллера. Как его можно использовать в том о чём я писал?
Вообще не для этого. https://geektimes.ru/post/255800/
Неактивний
....... Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. .......
приведите пример !!!
Неактивний
goodspeedmen пише:К чему это всё? Таймер wochdog, его назначение это сбросить микроконтроллер если он вдруг зашёл в бесконечный цикл. Когда происходит прерывание по переполнению этого таймера в векторе прерывания указан адрес reset микроконтроллера. Как его можно использовать в том о чём я писал?
Вообще не для этого. https://geektimes.ru/post/255800/
Вы даёте ссылку на статью в которой пишется именно о том что я писал. Вы простите хорошо себя чувствуете?
Неактивний
if(если нажата кнопка)
{ какой то код выполняется
analogRead(Ax); и тд и тп
}
if(если нажата кнопка)
{ какой то код выполняется
analogRead(Ax); и тд и тп
}
if(если нажата кнопка)
{ какой то код выполняется
analogRead(Ax); и тд и тп
}
if(если нажата кнопка)
{ какой то код выполняется
analogRead(Ax); и тд и тп
}
if(если нажата кнопка)
{ какой то код выполняется
analogRead(Ax); и тд и тп
}
........................
если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается.
if (time == 0x4000)
{
какой то код
time = 0;
}
time++;
Неактивний
Вы даёте ссылку на статью в которой пишется именно о том что я писал. Вы простите хорошо себя чувствуете?
watchdog вообще-то служит для экономии электроэнергии. Когда чипу нужно опростить датчик , отправить посылку и "лечь в сон". Но если у идиотов программеров система постоянно виснет, то watchdog это уже последнее средство сохранить работу этого горе-программиста. Тем более в Ардуне нет много места в памяти, что блукать сильно.
Неактивний
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" ?
Неактивний
И что 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)
Неактивний
qwone, якого хрена пишете всякую чушь про сторожевую собаку
держите себя в руках.
я например, практически не пользуюсь wd.
если система слетела, то наверняка сдохла и тактовая для собаки
но внешний супервизор с собакой не помешают - факт )
встречал системы где сброс по собаке - завершение рабочего цикла . ресет и система в режиме ожидания нового события
та примеров полно, где собака качесвенно защищает систему ) ведь много кристалов где просто нет места под всякие контролируемые циклы ожидание внешнего события.
Неактивний
Тема нормальная. Вот только по меркам некоторых народ здесь собрался "дубоватый" и "идиоты программисты". И нам не "допереть" для чего предназначен сторожевой пес и как сделать в ардуино "асинхронность" . Просто кто то считает что его макароны лучше чем лапша в вики .
Остання редакція Nefreemen (2017-07-27 10:22:13)
Неактивний
Админы почистите тему, ребята если не знаете или не хотите отвечать то лучше не пишите, спасибо.
Неактивний
Если использовать тактирование 0 таймера с захватом по высокому уровню, к примеру частотой в 10 герц, то можно записывать в регистр сравнения число сколько нужно отсчитать по 0.1 секунде. но если нужно несколько пауз с разной продолжительностью Можно попробовать написать программу так, что если используется пауза высчитывается её продолжительность и если она больше действующей то в прерывании сбрасывается флаг первой паузы по ссылке в регистр сравнения дописывается время второй паузы...
Неактивний
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" ?
Это и есть программный счётчик разве нет?
Неактивний
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
}
Неактивний
Генерация пауз возможно путем функции 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 }
Я так понимаю это код для MSP430F149. Это "си" с условной компиляцией в которой я не очень разбираюсь.
Неактивний
goodspeedmen пише:Генерация пауз возможно путем функции delay (20); (остановка программы, не всегда приемлемо). Или программным счетчиком, проблема в том, что чем больше операций выполняет микроконтроллер между подсчетом счётчика тем эта "пауза" увеличивается. Кто как решает эту проблему?
goodspeedmen, я например вообще ничего не понял, что Вам нужно, то Вы говорите о паузе ( delay() ) то о счетчике ( millis() ). А в приведенном коде комментарий :
"если будет нажата 1 кнопка то время подсчета будет одно а если 5 кнопок то оно увеличивается."
вообще вводит в ступор . Как эти кнопки будут нажаты, одновременно, произвольно или в какой то последовательности и вообще зачем их нажимать и какие такие паузы нужны а если не паузы то что интервалы какие то мерить надо. Как говорят половина ответа это ясно и правильно поставленный вопрос. Должен заметить что в АВР кроме упомянутых таймеров есть другие и если Вы не планируете использовать ШИМ никто Вам не запрещает использовать напрямую (читать и писать) регистры этих таймеров и использовать их прерывание. Возьмите даташит на используемый микроконтроллер и прочтете раздел о таймерах.
Но что то мне подсказывает что Ваша задача (а не поставленный мне например не понятный вопрос) решается банально той же millis() и переменной в которую после подсчета записываем значение millis при последующем считывании сравниваем текущее значение с переменной (таким образом получаем интервал) и опять записываем в переменную текущее значение и т.д.
Вероятно я не правильно объясняю. Мне нужны паузы в 1 или больше секунд без остановки процессора ( delay() ) все "те кнопки" должны продолжат сканироваться, был применен программный "счетчик - таймер" но во время этой "паузы" (счета счетчика) "нагрузка" на процессор изменяется и "пауза" получается разная в зависимости от нагрузки на процессор. Первый таймер занят, нулевой и второй таймер 328 меги 8 битные на максимальном предделителе они могут генерировать прерывание примерно в 16 миллисекунд, что конечно мало для моей цели. Это к тому о чем я писал выше о использование таймера с внешним генератором.
Неактивний
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.
Неактивний
Вячеслав, я вообще не понимаю какую задачу решает ТС. То что Вы написали в общих чертах я понял. Это то что тут некоторые преподносят как какую то "параллельность", "асинхронность" а бывает и круче называют "многопоточность" у меня вызывает мягко говоря недоумение. Давайте порассуждаем, допустим есть устройство на микроконтроллере задача -поддержка температуры и влажности. Температуру будем контролировать DS18B20 а влажность DHT22, температуру регулируем включением тэна а влажность вентилятором. Логично что эти процессы программно никак не связаны. Есть ньюанс с DS18B20, частый опрос этого датчика приводит к возрастанию погрешности, многие рекомендуют делать опрос не чаще чем через 5с (допустим процесс не очень критичный, не термоядерный синтез ) и такой интервал нас устраивает. В результате нам нужен счетчик интервалов и есть два пути решения, мы можем его поставить в начале функции измерения температуры и она будет выполнятся только когда пройдет 5с, что то аналогичное можно сделать и для функции измерения влажности (если хочется или надо допустим при использовании TFT дисплея). Но можно вынести счетчики отдельно и в зависимости от состояния счетчиков выполнять ту или иную функцию, я бы назвал такой подход созданием "диспетчера задач". В таком случае возникает дополнительный бонус в виде возможности по управлять этим "диспетчером" извне или программно в зависимости от условий то есть получим очень гибкую систему которая в некоторой степени будет "самонастраиваемой". Но называть это какой то "асинхронностью" язык не поворачивается по той простой причине что синхронных процессов в данном мк априори быть не может в нем нет даже банальной DMA. А значит все процедуры могут быть только асинхронными не зависимо с какими интервалами они выполнятся. Приведенную модель правильно было бы назвать асимметричной но никак не асинхронной а тем более лепить ей другие "красивые" названия. Не надо делать подмену понятий.
Остання редакція Nefreemen (2017-07-27 22:58:36)
Неактивний